Come creare la richiesta SOAP tramite ksoap2

<?xml version="1.0" encoding="UTF-8"?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Header/> <S:Body> <ns2:FReadStatus xmlns:ns2="http://poweb13/"> <arg0>000D6F0000</arg0> </ns2:FReadStatus> </S:Body> </S:Envelope> 

sto lavorando in un progetto android che voglio consumare alcuni JAX-WS. I servizi sono fatti da qualcun altro, quindi non posso cambiare nulla di loro. Vorrei submit il messaggio SOAP sopra con questo codice scritto, ma l'unica cosa che ricevi quando li chiamiamo è java.lang.NullPointerException

 private static final String NAMESPACE = "http://poweb13/"; private static final String URL = "http://smart.gr:8080/aWESoME/SmartPlugService?wsdl"; private static final String SOAP_ACTION = "SmartPlugService"; private static final String METHOD_NAME = "FReadStatus"; SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); PropertyInfo p1 = new PropertyInfo(); p1.setName("MAC"); p1.setValue("000D6F0000"); p1.setType(myDevice.getmac().toString().getClass()); request.addProperty(p1); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.setOutputSoapObject(request); HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); try { androidHttpTransport.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); androidHttpTransport.call(SOAP_ACTION, envelope); SoapObject resultsRequestSOAP = (SoapObject) envelope.bodyIn; String result=resultsRequestSOAP.getProperty("return").toString(); Log.i("info","Received :" + result); } catch (java.lang.ClassCastException e){ SoapFault fault=(SoapFault)envelope.bodyIn; Log.e("error","Received :" + fault.getMessage().toString()); Log.e("error","Received :" + fault.getLocalizedMessage().toString()); StackTraceElement[] st=fault.getStackTrace(); for(int i=0;i<st.length;i++){ Log.e("error","Received :" +st[i] ); } } catch (Exception e) { Log.e("error","smthing went wrong!!"); e.printStackTrace(); } 

Penso che non crei anche un documento xml, ma non so come controllarlo. Ho provato a creare un XmlSerializer per mettere i dati per la creazione di xml ma ricevo anche un NullPointerException. Quindi qualcuno può aiutarmi a come codificare la richiesta sopra? ecco alcune parti del file wsdl

  • Eclipse LogCat mostra solo la prima lettera di each messaggio
  • Rimuovi il button di firma in webview di google docs in android
  • Android: Attività che viene distrutto dopo aver chiamato Camera Intent
  • Passaggio di un metodo da un'altra class
  • Come proteggere un'applicazione REST per applicazioni mobili?
  • scambia frammento in un'attività tramite animation
  •  <definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://poweb13/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://poweb13/" name="SmartPlugService"> <types> <xsd:schema> <xsd:import namespace="http://poweb13/" schemaLocation="http://smart.gr:8080/aWESoME/SmartPlugService?xsd=1"/> </xsd:schema> </types> <message name="FReadStatus"> <part name="parameters" element="tns:FReadStatus"/> </message> ... <portType name="SmartPlugService"> <operation name="FReadStatus"> ... <input wsam:Action="http://poweb13/SmartPlugService/FReadStatusRequest" message="tns:FReadStatus"/> <output wsam:Action="http://poweb13/SmartPlugService/FReadStatusResponse" message="tns:FReadStatusResponse"/> <fault message="tns:InvalidDeviceAddressException" name="InvalidDeviceAddressException" wsam:Action="http://poweb13/SmartPlugService/FReadStatus/Fault/InvalidDeviceAddressException"/> <fault message="tns:InternalServiceException" name="InternalServiceException" wsam:Action="http://poweb13/SmartPlugService/FReadStatus/Fault/InternalServiceException"/> ... </operation> </portType> <binding name="SmartPlugServicePortBinding" type="tns:SmartPlugService"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> ... <operation name="FReadStatus"> <soap:operation soapAction=""/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> <fault name="InvalidDeviceAddressException"> <soap:fault name="InvalidDeviceAddressException" use="literal"/> </fault> <fault name="InternalServiceException"> <soap:fault name="InternalServiceException" use="literal"/> </fault> </operation> ... </binding> 

    Alcune parti del file xsd

     <xs:schema xmlns:tns="http://poweb13/" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" targetNamespace="http://poweb13/"> <xs:element name="FReadStatus" type="tns:FReadStatus"/> <xs:complexType name="FReadStatus"> <xs:sequence> <xs:element name="arg0" type="xs:string" minOccurs="0"/> </xs:sequence> </xs:complexType> 

    dovrei avere una risposta SOAP come questo:

     SOAP Response <?xml version="1.0" encoding="UTF-8"?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:FReadStatusResponse xmlns:ns2="http://poweb13/"> <return>1</return> </ns2:FReadStatusResponse> </S:Body> </S:Envelope> 

  • Qual è la ragione di questo errore java.io.IOException: Content-Length e lunghezza del stream non sono d'accordo
  • IllegalStateException - libreria di supporto di frammento
  • Come regolare la dimensione del carattere di text per adattarla
  • ICS Android abilita i programmi GPS in modo programmato?
  • WRITE_SECURE_SETTINGS errore di authorization anche se aggiunto a Manifest
  • android facebook come
  • One Solution collect form web for “Come creare la richiesta SOAP tramite ksoap2”

    Ok per cui hai una function FReadStatus:

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

    che ha un elemento FReadStatus di tipo complesso (cioè object, che è una class trovata sul server) .
    Questo tipo complesso ha un attributo arg0 di tipo String. La sua definizione è:

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

    Quindi è necessario creare una class locale che implementi kvmSerializable per mappare questo tipo complesso nella relativa class sul server, in modo da fare:

     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; } } 

    Ora che hai la class, farai quanto segue nel codice che avevi:

      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); //Importnt 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){} 

    Fammi sapere che succede. È necessario utilizzare Logcat per controllare requestDump e responseDump

    UPDATE: rispondere alla tua domanda su UnknowHostException
    possibili cause e soluzioni

    • Controllare se nel tuo AndroidManifest.xml hai:

       <uses-permission android:name="android.permission.INTERNET" /> 
    • Se si utilizza un emulatore fare come indicato in questo collegamento

    • Se sei dietro un proxy, fai:

       System.setProperty("http.proxyHost", "my.proxyhost.com"); System.setProperty("http.proxyPort", "1234"); 
    • Potrebbe essere necessario utilizzare warmup il dns, controllare questo collegamento

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.