Подтвердить что ты не робот

Ksoap2 org.xmlpull.v1.xmlpullparserexception Ожидаемая ошибка start_tag

Ниже приведен мой код, который я написал для проверки учетных данных пользователя. Веб-сервис, написанный с использованием .net

private static final String SOAP_ACTION = "http://tempuri.org/getCredentials";
private static final String OPERATION_NAME = "getCredentials";
private static final String WSDL_TARGET_NAMESPACE = "http://tempuri.org/";
private static final String SOAP_ADDRESS = "http://myStaticIP:portNo/WebSiteName/CommunicationInterface.asmx"; 

SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE, OPERATION_NAME);
request.addProperty("username",Username);
request.addProperty("password", Password);

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE httptransport = new HttpTransportSE(SOAP_ADDRESS);

try
{
    httptransport.call(SOAP_ACTION, envelope);
SoapPrimitive result = (SoapPrimitive) envelope.getResponse();
String value = result.toString();
value_LoginWS = value;
val = value;
login_status = Boolean.valueOf(result.toString());

Log.v("CS return value: -", result.toString());
return value;
}
catch (Exception e) 
{
     Log.v("Exception Soap" , e.toString());
}



В строке "httptransport.call(SOAP_ACTION, envelope)" Я получаю сообщение exception

"org.xmlpull.v1.XmlPullParserException: expected: START_TAG {http://schemas.xmlsoap.org/soap/envelope/}Envelope (position:START_TAG <html>
@1:7 in [email protected])" <br/><br/>

Я не знаю, что такое ошибка. Этот фрагмент кода отлично работает для эмулятора (изменение staticIP to 10.0.2.2:portNo).

Пожалуйста, помогите мне решить эту проблему.

Спасибо.

4b9b3361

Ответ 1

Ответ на этот вопрос, как я выяснил, в строке SOAP_ADDRESS удаляет часть /WebSiteName, и она отлично работает. Я тестировал это на своем устройстве Android. Прекрасно работает.

Исправленная строка должна выглядеть следующим образом:

private static final String SOAP_ADDRESS = "http://myStaticIP:portNo/CommunicationInterface.asmx";

где CommunicationInterface.asmx - имя веб-службы. другие статические переменные остаются такими же.

Примечание. Это используется, когда веб-сайт размещен в IIS.

Ответ 2

Ниже решение проверено и используется для веб-служб WCF

Если вы получаете эту ошибку

org.xmlpull.v1.XmlPullParserException: expected: START_TAG {http://schemas.xmlsoap.org/soap/envelope/}Envelope (position:START_TAG <html>
@1:7 in [email protected])"

Тогда возможны шансы, что ваш код не сможет получить доступ к веб-службе, поскольку он не был предоставлен с правильными значениями

METHOD_NAME="";
NAMESPACE ="";      
SOAP_ACTION ="";
URL ="";

Я изо всех сил пытался найти эти основные, но важные значения для запуска ksoap2

METHOD_NAME="";
NAMESPACE ="";      
SOAP_ACTION ="";
URL ="";

Были различные примеры, которые на самом деле говорили мне теорию, лежащую в основе этой ценности, как их генерировать, как мудрые SOAP_ACTION = NAMESPACE + METHOD_NAME.

И я продолжал экспериментировать с различными комбинациями без результата.

Такой парень, как я, у которого мало опыта работы с WebServices и Ksoap2, и большую часть времени занимался JSON на самом деле утомляйтесь, что это за ценности и как правильно их получить.

Вы никогда не столкнетесь с трудностями при поиске этих значений после прохождения процедуры ниже.

Запустите свой WebService

1. WebService

Он покажет вам окно, подобное этому.

Picture 1 webservice

2. WSDL

Теперь откройте файл WSDL, щелкнув ссылку, отмеченную в списке, чтобы посмотреть ее WSDL

Это будет похоже на это.

picture 2 wsdl

3. Получить пространство имен для WebService

Теперь найдите строку "Namespace", используя Ctrl+F

Вы получите что-то вроде этого

picture 3 namespace

Здесь вы заметите, что у нас есть two namespaces

targetNamespace="http://tempuri.org/">
<wsdl:import namespace="iscservices.dedicated.co.za"

теперь, о котором мы будем говорить, мы узнаем позже в следующих шагах

Теперь, какой из них вам понадобится, вы узнаете позже

4. Чтобы получить имя метода и соответствующее ему SoapAction

Ищите свой метод, к которому хотите получить доступ "PutRecipeImagesPost" в этом случае

Picture 4 Soap Action

Вы также увидите здесь SOAP Action для этого метода.

Как и в Soap action is NameSpace + Methodname и здесь мы видим его использование "iscservices.dedicated.co.za" так что мы закончим как наш Namespace

5. Чтобы получить URL

Ищите строку "soap:address location"

see the picture below

Значение этого атрибута будет вашим URL

Итак, в итоге мы получим все наши требуемые значения.

в соответствии с нашим примером

METHOD_NAME="PutRecipeImagesPost";
NAMESPACE ="iscservices.dedicated.co.za";       
SOAP_ACTION ="iscservices.dedicated.co.za/InterfaceiPhysioIntelWCFService/PutRecipeImagesPost";
URL ="http://10.0.2.2:51809/iPhysioIntelService.svc/second/";

Если вы не видите вышеупомянутые снимки или не можете получить значения для них в WSDL, то сообщите WebService deveoper, чтобы исправить это.

Позже, как использовать KSoap2

см. ниже фрагмент

SoapObject req = new SoapObject(NAMESPACE,METHOD_NAME);
            //SoapObject req = new SoapObject(Namespace_Server,MethodName_Server);

    //req.addProperty(KEY, VALUE);
//Key : - parameter name that is there in URL of webservice
//value:- value we want to send to the parameter
    req.addProperty("ImageData", data);
    req.addProperty("login", CommonStaticData.getusername());
    req.addProperty("password",CommonStaticData.getpassword());
    req.addProperty("recipeId",FileID);

    MarshalBase64 mbase = new MarshalBase64();// marshal is used to serialize the byte array

    SoapSerializationEnvelope envelop = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelop.bodyOut = req;
    envelop.encodingStyle = SoapSerializationEnvelope.ENC2001;
    envelop.dotNet = true;
    envelop.setOutputSoapObject(req);


    HttpTransportSE aht = new HttpTransportSE(URL);

    mbase.register(envelop);


    aht.call(SOAP_ACTION,envelop);

Ответ 3

Ответ от @Azone по-разному соответствует, но на самом деле, если ksoap возвращает ответ как

ожидается START_TAG {...} Конверт (позиция: START_TAG < {...}...

ссылается на потребность в чем-то отличном от того, что он использует.

Итак, вам нужно использовать один и тот же источник пространства имен для START_TAG "soapenv"

библиотека ksoap2 использует пространство имен по умолчанию

 xmlns:v="http://www.w3.org/2003/05/soap-envelope" 

поэтому ваш сервер должен поддерживать тот же источник

Пример использования tornado-webservices:

self._envelope.setAttribute ('xmlns:soapenv', 'http://www.w3.org/2003/05/soap-envelope')

иначе вам нужно настроить ksoap как сервер

Сервер:

self._envelope.setAttribute ('xmlns:soapenv', 'http://schemas.xmlsoap.org/soap/envelope/') 

ksoap:

envelope.env = "http://schemas.xmlsoap.org/soap/envelope/";

Ответ 4

Если вы использовали значения NAMESPACE, URL, SOAP_ACTION и METHOD_NAME, как описано в ответе Azone, но все еще получаете ошибку, проверьте версию SOAP в это утверждение:

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VERXX);

В моем случае я использовал SoapEnvelope.VER12, и когда я изменил его на SoapEnvelope.VER11, ошибка была решена.

Как найти версию SOAP из WSDL:

Цитата из этого ответа:

SOAP 1.1 использует пространство имен http://schemas.xmlsoap.org/wsdl/soap/

SOAP 1.2 использует пространство имен http://schemas.xmlsoap.org/wsdl/soap12/

wsdl может определять операции под мылом 1.1 и мылом 1.2 в в то же время в том же wsdl. Это полезно, если вам нужно развиваться ваш wsdl поддерживает новые функции, требующие мыла 1.2 (например. MTOM), в этом случае вам не нужно создавать новую услугу, а просто эволюционируйте оригинальный.