Nesting properties inside a tag in Ksoap2

前端 未结 3 847
不知归路
不知归路 2020-12-22 05:26

Hi i want to make a request for soap using above soap xml



        
相关标签:
3条回答
  • 2020-12-22 06:00

    You can pass a complex object (IUvail) like this:

    IUvail.java

    import java.util.Hashtable;
    
    import org.ksoap2.serialization.KvmSerializable;
    import org.ksoap2.serialization.PropertyInfo;
    import org.ksoap2.serialization.SoapObject;
    
    public class IUvail implements KvmSerializable {
        private String unit;
        private int qty;
    
    public IUvail() {}
    
    public IUvail(String unit, int qty) {
        this.unit = unit;
        this.qty = qty;
    }
    
    public void setUnit(String unit) { this.unit = unit; }
    public void setQty(int qty) { this.qty = qty;}
    public String getUniy() { return unit;}
    public int getQty() { return qty;}
    
    public Object getProperty(int arg0) {
        switch(arg0) {
            case 0:
                return unit;
            case 1:
                return qty;
         }
         return null;
    }
    
    public int getPropertyCount() {
        return 2;
    }
    
    public void getPropertyInfo(int index, Hashtable arg1, PropertyInfo propertyInfo) {
        switch(index){
            case 0:
                propertyInfo.name = "unit";
                propertyInfo.type = PropertyInfo.STRING_CLASS;
                break;
            case 1:
                propertyInfo.name = "qty";
                propertyInfo.type = PropertyInfo.INTEGER_CLASS;
                break;
            default:
                break;
        }
    }
    
    public void setProperty(int index, Object value) {
        switch(index) {
            case 0:
                this.unit = value.toString();
                break;
            case 1:
                this.qty = Integer.parseInt(value.toString());
                break;
            default:
                break;
       }
    }  }
    

    Then

    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
    IUvail iuvail = new IUvail();
    iuvail.setUnit("PC");
    iuvail.setQty(3000);
    request.addProperty("IUvail", iuvail);
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);
    envelope.dotNet = true;
    envelope.setOutputSoapObject(request);
    envelope.addMapping(TARGET_NAMESPACE, "IUvail", new IUvail.getClass());
    
    AndroidHttpTransport transport = new AndroidHttpTransport(URL);
    try {
        transport.call(NAMESPACE + METHOD_NAME, envelope);
        /* Get the response: it depends on your web service implementation */
    } catch (Exception e) {
        e.printStackTrace();
    }
    

    Where NAMESPACE, URL, METHOD_NAME and TARGET_NAMESPACE depends on your ws.

    0 讨论(0)
  • 2020-12-22 06:03

    I had the same problem (accessing a SAP webservice with Android). There is an easy solution:

    request.addProperty("IUvail", "<Unit>PC</Unit><Qty>3000</Qty>");
    

    The whole access with authentication:

    String USER = "user";
    String PASSWORD = "pwd";
    String NAMESPACE_SOAP = "http://schemas.xmlsoap.org/soap/envelope/";
    String NAMESPACE_SAP = "urn:sap-com:document:sap:rfc:functions";
    String SOAP_ACTION = "http://server:port/webservice_root";
    String METHOD_NAME = "AvailCheck";
    
    SoapObject request = new SoapObject(NAMESPACE_SAP, METHOD_NAME);
    request.addProperty("IUvail", "<Unit>PC</Unit><Qty>3000</Qty>");
    
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
            SoapEnvelope.VER11);
    envelope.env = NAMESPACE_SOAP;
    envelope.dotNet = false;
    envelope.setOutputSoapObject(request);
    
    HttpTransportSE androidHttpTransport = new HttpTransportSE(
            SOAP_ACTION);
    androidHttpTransport.debug = true;
    try {
        List<HeaderProperty> headerList = new ArrayList<HeaderProperty>();
        headerList.add(new HeaderProperty("Authorization", "Basic "
                + org.kobjects.base64.Base64
                        .encode((USER + ":" + PASSWORD).getBytes())));
        androidHttpTransport.call(SOAP_ACTION, envelope, headerList);
        // SoapObject response = (SoapObject) envelope.getResponse();
        // response.getProperty(0).toString();
        // Object response = envelope.getResponse();
        SoapPrimitive result = (SoapPrimitive) envelope.getResponse();
        Log.d("webservice", "Result: " + result.toString());
    } catch (Exception e) {
        e.printStackTrace();
        Log.e("WebserviceException", e.getMessage(), e);
        Log.d("WebserviceException", "[requestDump] "
                + androidHttpTransport.requestDump);
        Log.d("WebserviceException", "[responseDump] "
                + androidHttpTransport.responseDump);
    }
    
    0 讨论(0)
  • 2020-12-22 06:07

    try doing something like this,

    SoapObject request = new SoapObject(NAMESPACE,
                                METHOD_NAME);
    
                        request.addProperty("username", username);
                        request.addProperty("username", password);
    
                        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                                SoapEnvelope.VER11);
                        envelope.dotNet = true;
                        envelope.setOutputSoapObject(request);
                        HttpTransportSE androidHttpTransport = new HttpTransportSE(
                                URL);
                    try {
                            androidHttpTransport.call(SOAP_ACTION, envelope);
                        } catch (IOException ioex) {
                                ioex.printStackTrace();
                        }
    
    0 讨论(0)
提交回复
热议问题