2011-01-01 10 views
1

Ich versuche, eine webservice in Android über Ksoap2 für Android zuzugreifen.HttpTransportSE requestDump gibt NullPointerException

Die SoapObject wird erstellt, OK, die S.O.P der bodyOut gibt die gewünschten Zeichenfolgen aus. Aber wenn ich ein requestDump des HttpTransportSE Objekts mache, das ich erstelle, um den Anruf zu machen, passiert ein NullPointerException. Mit anderen Worten, das Transportobjekt ist null. Wie kann das passieren?

Web Service ist bei http://srilanka.lk:9080/services/CropServiceProxy?wsdl

Dieser Dienst funktioniert sehr gut mit SoapUI.

SoapUI Anfrage:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:v1="http://schemas.icta.lk/xsd/crop/handler/v1/"> 
    <soap:Header/> 
    <soap:Body> 
     <v1:getCropDataList> 
     <v1:code>ABK</v1:code> 
     </v1:getCropDataList> 
    </soap:Body> 
</soap:Envelope> 

SoapUI Antwort:

<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"> 
    <soapenv:Body> 
     <ns1:getCropDataListResponse xmlns:ns1="http://schemas.icta.lk/xsd/crop/handler/v1/"> 
     <ns1:cropInfo> 
      <ns1:name>Ambul Kesel</ns1:name> 
      <ns1:price>35.0</ns1:price> 
      <ns1:location>Dambulla</ns1:location> 
     </ns1:cropInfo> 
     <ns1:cropInfo> 
      <ns1:name>Ambul Kesel</ns1:name> 
      <ns1:price>40.0</ns1:price> 
      <ns1:location>Dambulla</ns1:location> 
     </ns1:cropInfo> 
     </ns1:getCropDataListResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

Client Side Complex Typ KvmSerializable Implementierung:

public class CropInfo implements KvmSerializable { 

private String name; 
private float price; 
private String location; 

@Override 
public Object getProperty(int arg0) { 
    switch (arg0){ 
    case 0: 
    return name; 
    case 1: 
    return price; 
    case 2: 
    return location; 
    default: 
    return null; 
    } 
} 

@Override 
public int getPropertyCount() { 
    return 3; 
} 

@Override 
public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) { 
    switch (arg0){ 
    case 0: 
    arg2.type = PropertyInfo.STRING_CLASS; 
    arg2.name = "Name"; 
    break; 
    case 1: 
    arg2.type = Float.class; 
    arg2.name = "Price"; 
    break; 
    case 2: 
    arg2.type = PropertyInfo.STRING_CLASS; 
    arg2.name = "Location"; 
    break; 
    default: 
    break; 
    } 

} 

@Override 
public void setProperty(int arg0, Object arg1) { 
    switch(arg0){ 
    case 0: 
    name = arg1.toString(); 
    break; 
    case 1: 
    price = Float.parseFloat(arg1.toString()); 
    case 2: 
    location = arg1.toString(); 
    default: 
    break; 
    } 
} 
} 
Anruf

Web Service:

public void btnOnClick(View v){ 
    String NAMESPACE = "http://schemas.icta.lk/xsd/crop/handler/v1/"; 
    String URL = "http://220.247.225.202:9080/services/CropServiceProxy.CropServiceProxyHttpSoap12Endpoint"; 

    String method_name = "getCropDataList"; 
    String SOAP_ACTION = "http://schemas.icta.lk/xsd/crop/handler/v1/getCropDataList"; 

    SoapObject soap_request = new SoapObject(NAMESPACE, method_name); 
    soap_request.addProperty("code", "ABK"); 

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12); 
    envelope.setOutputSoapObject(soap_request); 
    envelope.addMapping(NAMESPACE, "cropInfo", CropInfo.class); 
    //envelope.dotNet=true; 

    Marshal floatMarshal = new MarshalFloat(); 
    floatMarshal.register(envelope); 

    System.out.println("body out : " + envelope.bodyOut.toString()); 

    //AndroidHttpTransport http_transport = new AndroidHttpTransport(URL); 
    HttpTransportSE http_transport = new HttpTransportSE(URL); 
    try { 
        //NullPointerException HERE 
    System.out.println(http_transport.requestDump); 
    http_transport.call(SOAP_ACTION, envelope); 

    //because we should expect a vector, two kinds of prices are given 
    Vector<CropInfo> result_array = (Vector<CropInfo>)envelope.getResponse(); 
    if(result_array != null){ 
    for (CropInfo current_crop: result_array){ 
    System.out.println(current_crop.getName()); 
    System.out.println(Float.toString(current_crop.getPrice())); 
    } 
    } 

    } catch (Exception e) { 
    e.printStackTrace(); 
    answer.setText("error caught"); 
    //System.out.println(http_transport.responseDump); 
    } 

    // String result_string[] = (String[])result; 

    //answer.setText("returned"); 

    } 

Kann das jemand erklären?

Antwort

9

Sie benötigen die debug Feld der Transport Instanz true, dann rufen Sie die call(String,SoapEnvelope) Verfahren einzustellen, um für das requestDump Feld gesetzt werden:

HttpTransportSE http_transport = new HttpTransportSE(URL); 
    http_transport.debug = true; 
    try { 
    http_transport.call(SOAP_ACTION, envelope); 
    System.out.println(http_transport.requestDump); 
    //... 
+0

Dank Daniel. Ich habe die Bestellung falsch verstanden. Die von Ihnen vorgeschlagenen Korrekturen vorgenommen und ich erhalte jetzt einen XMLPullParser Error bei der Aufrufmethode. Ich habe damit zu kämpfen http://stackoverflow.com/questions/4557180/ksoap2-for-android-gives. – Chamila

+1

@Daniel Kumpel Ich liebe dich von der Unterseite meines Herzens ** where_ erhalten Sie Informationen über diese kleinen Dinge von ??! Ich fragte eine andere [Frage] (http://stackoverflow.com/q/11048426/1434372), deren Antwort mich zu einem Problem führte, das @chamila hatte, sogar der Antworter vergaß, diese kleine Linie bezüglich der Einstellung von httpTransport zu erwähnen .debug = true; '... wow, ich steckte für ** 2 Stunden fest ** ** Zwei ** Ich bin gerade sehr glücklich. Entschuldigen Sie meinen _long_ Kommentar. Noch einmal Danke** !! – Shark

Verwandte Themen