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
).
Пожалуйста, помогите мне решить эту проблему.
Спасибо.
Ответы
Ответ 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), в этом случае вам не нужно создавать новую услугу, а просто эволюционируйте оригинальный.