soapobject - consumir web service soap android studio
KSOAP2 para Android da (3)
Estoy intentando acceder a un servicio web cuyo WSDL está en http://srilanka.lk:9080/services/CropServiceProxy?wsdl . Utilizando SoapUI envié una solicitud y obtuve una respuesta satisfactoriamente.
Luego, usando KSoap2 para Android intenté obtener una respuesta. Pero todo lo que obtengo es un error de SoapFault. El código es el siguiente.
String NAMESPACE = "http://schemas.icta.lk/xsd/crop/handler/v1";
String URL = "http://www.srilanka.lk:9080/services/CropServiceProxy.CropServiceProxyHttpSoap12Endpoint";
String method_name = "getCropDataList";
String SOAP_ACTION = method_name;
SoapObject request = new SoapObject(NAMESPACE, method_name);
String crop_code_str = String.valueOf(code.getText().toString());
System.out.println(crop_code_str);
System.out.println(request.toString());
request.addProperty("code", crop_code_str );
System.out.println(request.getProperty("code").toString());
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12);
envelope.setOutputSoapObject(request);
System.out.println("body out : " + envelope.bodyOut.toString());
HttpTransportSE http_transport = new HttpTransportSE(URL);
try {
http_transport.call(SOAP_ACTION, envelope);
System.out.println(envelope.bodyIn.toString());
} catch (Exception e) {
e.printStackTrace();
answer.setText("error caught");
}
Esto resulta en lo siguiente.
W/System.err( 394): org.xmlpull.v1.XmlPullParserException: expected: START_TAG {http://www.w3.org/2001/12/soap-envelope}Envelope (position:START_TAG <{http://schemas.xmlsoap.org/soap/envelope/}soapenv:Envelope>@1:114 in java.io.InputStreamReader@43e81258)
Intenté con VER11 pero luego aparece el siguiente error como bodyIn.
I/System.out( 365): SoapFault - faultcode: ''soapenv:Server'' faultstring: ''org.apache.axis2.databinding.ADBException: Unexpected subelement code'' faultactor: ''null'' detail: org.kxml2.kdom.Node@43e84648
¿Esto está mal con Ksoap2 para Android? Entonces, ¿hay alguna otra forma de que un servicio web se pueda consumir en Android? (Solo SOAP está disponible)
ACTUALIZACIÓN: Probé la interfaz KvmSerializable para el tipo de complext. El siguiente es mi código. Todavía tengo los mismos errores. El error XMLPullParser se está lanzando en la línea http_transport.call.
Esta es la implementación de tipo complejo en el lado del cliente. Solo tengo el WSDL.
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;
}
}
}
El código modificado para acceder y analizar la respuesta del servicio web.
String NAMESPACE = "http://schemas.icta.lk/xsd/crop/handler/v1/"; String URL = "http://www.srilanka.lk:9080/services/CropServiceProxy.CropServiceProxyHttpSoap12Endpoint"; String method_name = "getCropDataList"; Cadena SOAP_ACTION = "http://schemas.icta.lk/xsd/crop/handler/v1/getCropDataList";
SoapObject soap_request = new SoapObject(NAMESPACE, method_name);
String crop_code_str = String.valueOf(code.getText().toString());
System.out.println(crop_code_str);
System.out.println(soap_request.toString());
soap_request.addProperty("code", crop_code_str );
System.out.println(soap_request.getProperty("code").toString());
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 {
//error comes from this call
http_transport.call(SOAP_ACTION, envelope);
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");
}
Creo que tu código está bien.
Thirst eche un vistazo a su archivo wsdl, aquí puede encontrar todos los datos que necesita, como namspace, action, etc. En muchos casos, la acción es una cadena emty como "". Siempre elijo SoapEnvelope.VER11, pero normalmente no importa. Este código solo funciona con tipos de datos primitivos y matrices de cadenas. Si espera datos complejos, debe implementar la interfaz kvmSerializable.
Perdón por mi mal inglés, espero que entiendas lo que quiero decir. A continuación hay un enlace útil.
http://www.drdobbs.com/mobility/208800166;jsessionid=2VAK4K4QQ5H3TQE1GHPSKH4ATMY32JVN?pgno=1
He leído muchos temas sobre los dolores y la inconsistencia del uso de KSoap. Puede usar una clase DefaultHttpClient para hacer una publicación http y simplemente crear manualmente el encabezado SOAP y analizar la respuesta.
KSoap tiene una tendencia a insertar sus propios espacios de nombres en cada etiqueta, lo que puede dar como resultado que pueda intentarlo
envelope.implicitTypes = true;