#android #soap #ksoap2
#Android #soap #ksoap2
Вопрос:
Я использую ksoap2
библиотеку для вызова веб-сервиса :
Я получаю ошибку в строке:
androidHttpTransport.call(action, envelope);
Полный код :
public String executeSoapWebservice(String urlString, String action, String method, String nameSpace, JSONObject postParams){
String response ="";
SoapObject request = new SoapObject(nameSpace, method);
try{
JSONObject ob = postParams;
Iterator iterator = ob.keys();
while(iterator.hasNext()){
String key = (String)iterator.next();
String value = ob.getString(key);
request.addProperty(key, value);
}
}catch (JSONException e) {
e.printStackTrace();
}
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.setOutputSoapObject(request);
envelope.dotNet = true;
try {
HttpTransportSE androidHttpTransport = new HttpTransportSE(urlString);
//this is the actual part that will call the webservice
androidHttpTransport.call(action, envelope);
// Get the SoapResult from the envelope body.
//Object result = (Object) envelope.getResponse();
SoapObject result = (SoapObject)envelope.bodyIn;
if(result != null) {
//Get the first property and change the label text
response = result.getProperty(0).toString();
//response = result.toString();
}
} catch (Exception e) {
response = "";
e.printStackTrace();
}
return response;
}
Комментарии:
1. Проверьте свое пространство имен, метод и строку URL.
2. Я получаю это исключение только в том случае, когда ответ содержит многомерный jsonarray. в противном случае он работает нормально.
3. он отлично работает для следующего ответа:{«status»: «200»,»StatusMsg»: «OK», «EncHid»: «42712839», «data»: [{«acdYear»:»2015 — 2014″},{» Годичный»:»2000 — 2003″},{» Годичный»:»2004 — 2008″},{» Годичный»:»2014 — 2016″}]} Но не работает для: {«status»: «200»,»StatusMsg»:»OK», «EncHid»: «30066430», «data»: [{«qualLevl»: «Промежуточный (10 2)», «acdYear»:»2015 — 2014″},{» Квалификация»: «Диплом», «acdYear»:»2000 — 2003″},{» qualLevl»:»Выпускник», «acdYear»:»2004 — 2008″}]}
4. Есть ли у Android другая библиотека для вызова веб-службы soap?
5. Смотрите здесь, android-arsenal.com/tag/91
Ответ №1:
Если у вас есть доступ к веб-сервису (я предполагаю, что это asp.net ) единственный способ, которым я смог решить эту проблему, — это выполнить две модификации.
На asp.net сторона:
[WebMethod]
public string GetJSonData()
{
//service code
var serializer = new JavaScriptSerializer();
var serializedResult = serializer.Serialize(passwordData);
String jsonString = serializedResult.ToString();
// remove this line
//Context.Response.Write(serializedResult);
// return the serialized data as string
return jsonString;
}
затем на стороне Android измените SoapObject на SoapPrimitive
// This causes the problem
//SoapObject resultData = (SoapObject) envelope.getResponse();
// Combined with the modification on the asp.net this works
SoapPrimitive resultData = (SoapPrimitive) envelope.getResponse();