2011-01-01 5 views
2

Я пытаюсь получить доступ к веб-сервиса, который размещен здесьМыло Fault VersionMismatch KSOAP2 для Android

http://srilanka.lk:9080/services/CropServiceProxy?wsdl

Работает в SoapUI ок. Я получаю правильный ответ.

SoapUI Запрос

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:v1="http://schemas.icta.lk/xsd/crop/handler/v1/"> 
    <soap:Header/> 
    <soap:Body> 
     <v1:getCropDataList> 
     <v1:code>ABK</v1:code> 
     </v1:getCropDataList> 
    </soap:Body> 
</soap:Envelope> 

SoapUI Response

<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"> 
    <soapenv:Body> 
     <ns1:getCropDataListResponse xmlns:ns1="http://schemas.icta.lk/xsd/crop/handler/v1/"> 
     <ns1:cropInfo> 
      <ns1:name>Ambul Kesel</ns1:name> 
      <ns1:price>35.0</ns1:price> 
      <ns1:location>Dambulla</ns1:location> 
     </ns1:cropInfo> 
     <ns1:cropInfo> 
      <ns1:name>Ambul Kesel</ns1:name> 
      <ns1:price>40.0</ns1:price> 
      <ns1:location>Dambulla</ns1:location> 
     </ns1:cropInfo> 
     </ns1:getCropDataListResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

Но в Ksoap2 для андроид ответ мыло является ошибкой. Ниже приведены requestDump и responseDump соответственно.

requestDump

<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/"> 
<v:Header /> 
<v:Body> 
<n0:getCropDataList id="o0" c:root="1" xmlns:n0="http://schemas.icta.lk/xsd/crop/handler/v1/"> 
<code i:type="d:string">CNT</code> 
</n0:getCropDataList> 
</v:Body> 
</v:Envelope> 

responseDump

<?xml version='1.0' encoding='UTF-8'?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
<soapenv:Header xmlns:wsa="http://www.w3.org/2005/08/addressing"> 
<wsa:Action>http://www.w3.org/2005/08/addressing/soap/fault</wsa:Action> 
<wsa:RelatesTo>urn:uuid:3257ABC779195052D01293913466558</wsa:RelatesTo> 
</soapenv:Header> 
<soapenv:Body> 
<soapenv:Fault> 
<faultcode>VersionMismatch</faultcode> 
<faultstring>Only SOAP 1.1 or SOAP 1.2 messages are supported in the system</faultstring> 
<detail /> 
</soapenv:Fault> 
</soapenv:Body> 
</soapenv:Envelope> 

Вот мой код.

public void btnOnClick(View v){ 
     String NAMESPACE = "http://schemas.icta.lk/xsd/crop/handler/v1/"; 
     String URL = "http://220.247.225.202:9080/services/CropServiceProxy.CropServiceProxyHttpSoap12Endpoint"; 

     String METHOD_NAME = "getCropDataList"; 
     String SOAP_ACTION = "http://schemas.icta.lk/xsd/crop/handler/v1/getCropDataList"; 

     SoapObject soap_request = new SoapObject(NAMESPACE, METHOD_NAME); 
     soap_request.addProperty("code", "ABK"); 

     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12); 
     envelope.setOutputSoapObject(soap_request); 
     envelope.addMapping(NAMESPACE, "cropInfo", CropInfo.class); 
     envelope.dotNet=false; 

     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); 
     http_transport.debug = true; 
     try { 
      http_transport.call(SOAP_ACTION, envelope);   

      //because we should expect a vector, two kinds of prices are given 
      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"); 
      System.out.print("REQUEST: "); 
      System.out.println(http_transport.requestDump); 
      System.out.print("RESPONSE: "); 
      System.out.println(http_transport.responseDump); 
     } 



    } 

Как я могу получить правильный ответ в Ksoap2 для этого?

+0

Вы попробовали использовать версию 1.1? – bigstones

+1

только мои 5 центов - очень рискованно делать все, что угодно, в прослушивателе кликов, потому что он работает по основному потоку пользовательского интерфейса. поэтому пользовательский интерфейс блокируется в течение периода, пока весь код не будет запущен. представьте себе случай с плохим радиопокрытием (низкая скорость сети) - очень легко получить всплывающее окно ANR (приложение не отвечает). чтобы избежать этого, слушатель кликов должен запустить какой-то другой (не-пользовательский интерфейс) 'Thread', иначе я бы предпочел использовать' AsyncTask'. –

+0

1.1 дает следующую ошибку. soapenv: Сервер org.apache.axis2.databinding.ADBException: Неожиданный код подэлемента Chamila

ответ

0

Вы должны использовать 1.1 и проверить сообщение об ошибке. Что-то в axis2 на стороне сервера имеет проблему с подэлементом кода. Возможно, вам нужно установить impicitTypes в false. Попробуйте некоторые варианты на конверте.

0

Там более, чем одна спецификация стандарта SOAP, в настоящее время вы пытаетесь отправить запрос, используя SOAP 1.2 стандарт, как вы можете видеть здесь

SoapSerializationEnvelope конверт = новый SoapSerializationEnvelope (SoapEnvelope.VER12);

Чтобы исправить, вы должны отправить запрос как SOAP 1.1 стандарта, как это:

SoapSerializationEnvelope конверт = новый SoapSerializationEnvelope (SoapEnvelope.VER11);

0

Похоже, вы не задаете пространство имен объекта кода. Вы должны убедиться, что вы либо задали целевое пространство имен http://schemas.icta.lk/xsd/crop/handler/v1/, либо добавили пространство имен n0 в элемент кода.

<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/"   xmlns:v="http://schemas.xmlsoap.org/soap/envelope/"> 
    <v:Header /> 
    <v:Body> 
    <n0:getCropDataList id="o0" c:root="1" xmlns:n0="http://schemas.icta.lk/xsd/crop/handler/v1/"> 
     <n0:code i:type="d:string">CNT</code> 
    </n0:getCropDataList> 
    </v:Body> 
</v:Envelope> 

 Смежные вопросы

  • Нет связанных вопросов^_^