How to create SOAP request via ksoap2

后端 未结 1 1115
感动是毒
感动是毒 2020-12-06 15:47


    
    
           


        
相关标签:
1条回答
  • 2020-12-06 16:18

    Ok so you have a function FReadStatus:

    <message name="FReadStatus">
      <part name="parameters" element="tns:FReadStatus"/>
    </message>
    

    which has an element FReadStatus of complex type(ie object, which is a class found on the server).
    This complex type has an attribute arg0 of type String. Its definition is:

    <xs:complexType name="FReadStatus">
      <xs:sequence>
        <xs:element name="arg0" type="xs:string" minOccurs="0"/>
      </xs:sequence>
    </xs:complexType>
    

    So you will need to create a local class that implements kvmSerializable to map this complex type to its corresponding class on the server, so you will do :

    public class FReadStatus implements KvmSerializable {
    
    String mac; 
    
    @Override
    public Object getProperty(int arg0) {
    switch (arg0){
        case 0:
            return mac;
        default:
            return null;
            }
    }
    
    @Override
    public int getPropertyCount() {
        return 1;//because you have 1 parameter
    }
    
    @Override
    public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) {
    switch(arg0)
    {
    
        case 0:
            arg2.type = PropertyInfo.STRING_CLASS;//because its type is string
            arg2.name = "arg0";
            break;
        default:break;
    }
    
    }
    
    @Override
    public void setProperty(int arg0, Object arg1) {
    switch(arg0)
    {
        case 0:
            mac=  (String)arg1;
            break;
        default:
            break;
    }
    }
    

    Now that you have the class , you will do the following in the code you had:

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
    
        PropertyInfo pi = new PropertyInfo();
        pi.setName("arg0");
        pi.setValue("000D6F0000");
        pi.setType(FReadStatus .class);
        request.addProperty(pi);
    
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
        envelope.setOutputSoapObject(request);
    
         //Now you have to add mapping to map the local class created, to the one on the server
        envelope.addMapping(NAMESPACE , FReadStatus.class.getSimpleName(), FReadStatus .class);
    
        // Add marshalling (this one might not be necessary, but ill just add it)
        Marshal floatMarshal = new MarshalFloat();
        floatMarshal.register(envelope);
    
        AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(URL);//AndroidHttpTransport INSTEAD OF HttpTransportSE 
    
        androidHttpTransport.debug = true;//NEW ADDED
        try {           
    
            androidHttpTransport.call(SOAP_ACTION, envelope);
    
           //Important Outputs to check how the request/Response looks like.. Check them in Logcat to find these outputs
           System.out.println("requestDump is :"+androidHttpTransport.requestDump);
           System.out.println("responseDump is :"+androidHttpTransport.responseDump);
           System.out.println("response"+envelope.getResponse());
    
        } catch (Exception e){}
    

    Let me know wt happens. You must use Logcat to check requestDump and responseDump

    UPDATE: answering your question about UnknowHostException
    possible causes and solutions

    • Check if in your AndroidManifest.xml you have :

      <uses-permission android:name="android.permission.INTERNET" />
      
    • If you are using an emulator do as mentioned in this link

    • If you are behind a proxy do :

      System.setProperty("http.proxyHost", "my.proxyhost.com");
      System.setProperty("http.proxyPort", "1234");
      
    • You might need to use warmup the dns , check this link

    0 讨论(0)
提交回复
热议问题