org.xmlpull.v1.XmlPullParserException: Неожиданный токен при подключении к веб-сервису soap

#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();