Pregunta

Estoy intentando acceder a una webservice en Android a través de Ksoap2 para Android.

El SoapObject se crea bien, el S.O.P del bodyOut da salida a las cadenas deseadas. Pero cuando hago una requestDump del objeto HttpTransportSE creo que hacer la llamada, un NullPointerException sucede. En otras palabras, el objeto de transporte es nulo. ¿Cómo puede suceder esto?

Servicio Web es en http://srilanka.lk:9080/services/CropServiceProxy?wsdl

Este servicio funciona muy bien con SoapUI.

SoapUI Solicitud:

<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 respuesta:

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

aplicación del lado del cliente Complejo Tipo KvmSerializable:

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

Web Service Call:

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");

    }

Puede alguien explicar esto?

¿Fue útil?

Solución

Es necesario establecer la debug campo de la instancia Transport a true, a continuación, llamar al método call(String,SoapEnvelope) para que el campo requestDump que deben ajustarse:

  HttpTransportSE http_transport = new HttpTransportSE(URL);
  http_transport.debug = true;
  try {
   http_transport.call(SOAP_ACTION, envelope);
   System.out.println(http_transport.requestDump);
  //...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top