2010-12-29 6 views
2

Я пытаюсь получить доступ к веб-службе, WSDL которой находится в http://srilanka.lk:9080/services/CropServiceProxy?wsdl. Используя SoapUI, я отправил запрос и получил ответ.KSOAP2 для Android дает

Затем, используя KSoap2 для Android, я попытался получить ответ. Но все, что я получаю, это ошибка SoapFault. Код выглядит следующим образом.

Строка NAMESPACE = "http://schemas.icta.lk/xsd/crop/handler/v1";

String URL = "http://www.srilanka.lk:9080/services/CropServiceProxy.CropServiceProxyHttpSoap12Endpoint"; 

    String method_name = "getCropDataList"; 
    String SOAP_ACTION = method_name; 

    SoapObject request = new SoapObject(NAMESPACE, method_name); 
    String crop_code_str = String.valueOf(code.getText().toString()); 
    System.out.println(crop_code_str); 
    System.out.println(request.toString()); 
    request.addProperty("code", crop_code_str); 
    System.out.println(request.getProperty("code").toString()); 

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12); 
    envelope.setOutputSoapObject(request); 

    System.out.println("body out : " + envelope.bodyOut.toString()); 

    HttpTransportSE http_transport = new HttpTransportSE(URL); 
    try { 
     http_transport.call(SOAP_ACTION, envelope); 
     System.out.println(envelope.bodyIn.toString()); 

    } catch (Exception e) { 
     e.printStackTrace(); 
     answer.setText("error caught"); 
    } 

В результате получается следующее.

W/System.err( 394): org.xmlpull.v1.XmlPullParserException: expected: START_TAG {http://www.w3.org/2001/12/soap-envelope}Envelope (position:START_TAG <{http://schemas.xmlsoap.org/soap/envelope/}soapenv:Envelope>@1:114 in [email protected]) 

Я пробовал с VER11, но затем он выдает следующую ошибку как bodyIn.

I/System.out( 365): SoapFault - faultcode: 'soapenv:Server' faultstring: 'org.apache.axis2.databinding.ADBException: Unexpected subelement code' faultactor: 'null' detail: [email protected] 

Это что-то не так с Ksoap2 для Android? Тогда существует ли другой способ использования веб-службы в Android? (Доступно только SOAP)

ОБНОВЛЕНИЕ: Я попробовал интерфейс KvmSerializable для типа дополнения. Следующий мой код. Я все равно получаю те же ошибки. Ошибка XMLPullParser вызывается в строке http_transport.call.

Это комплексная реализация на стороне клиента. У меня есть только WSDL.

public class CropInfo implements KvmSerializable { 

    private String name; 
    private float price; 
    private String location; 

    @Override 
    public Object getProperty(int arg0) { 
     switch (arg0){ 
     case 0: 
      return name; 
     case 1: 
      return price; 
     case 2: 
      return location; 
     default: 
       return null; 
     } 
    } 

    @Override 
    public int getPropertyCount() { 
     return 3; 
    } 

    @Override 
    public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) { 
     switch (arg0){ 
     case 0: 
      arg2.type = PropertyInfo.STRING_CLASS; 
      arg2.name = "Name"; 
      break; 
     case 1: 
      arg2.type = Float.class; 
      arg2.name = "Price"; 
      break; 
     case 2: 
      arg2.type = PropertyInfo.STRING_CLASS; 
      arg2.name = "Location"; 
      break; 
     default: 
       break; 
     } 

    } 

    @Override 
    public void setProperty(int arg0, Object arg1) { 
     switch(arg0){ 
     case 0: 
      name = arg1.toString(); 
      break; 
     case 1: 
      price = Float.parseFloat(arg1.toString()); 
     case 2: 
      location = arg1.toString(); 
     default: 
      break; 
     } 
    } 
} 

Модифицированный код для доступа и анализа ответа веб-службы.

Строка NAMESPACE = "http://schemas.icta.lk/xsd/crop/handler/v1/"; Строка URL = "http://www.srilanka.lk:9080/services/CropServiceProxy.CropServiceProxyHttpSoap12Endpoint"; String method_name = "getCropDataList"; Строка SOAP_ACTION = "http://schemas.icta.lk/xsd/crop/handler/v1/getCropDataList";

SoapObject soap_request = new SoapObject(NAMESPACE, method_name); 
    String crop_code_str = String.valueOf(code.getText().toString()); 
    System.out.println(crop_code_str); 
    System.out.println(soap_request.toString()); 
    soap_request.addProperty("code", crop_code_str); 
    System.out.println(soap_request.getProperty("code").toString()); 

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

    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); 
    try { 
       //error comes from this call    
       http_transport.call(SOAP_ACTION, envelope); 


     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"); 
    } 
+0

Я получаю ответ мыло как VersionMismatch Только SOAP 1.1 или SOAP 1.2 сообщения поддерживаются в системе. Вот почему возникает ошибка XML. Но я использовал VER12, поскольку SoapUI сказал, что сервис - это мыло 1.2. – Chamila

+0

Когда я использую VER11, я получаю «org.apache.axis2.databinding.ADBException: Неожиданный код подэлемента» в качестве ответа. – Chamila

+0

поддержка soap1.2 только улучшилась с последними выпусками. Особенно подходящая поддержка SoapFault для 1.2. Убедитесь, что вы используете последнюю версию - 2.5.8 с http://code.google.com/p/ksoap2-android/wiki/HowToUse?tm=2 –

ответ

1

Я прочитал много потоков о болях и непоследовательности использования KSoap. Вы можете использовать класс DefaultHttpClient, чтобы сделать сообщение http, и просто вручную сделать заголовок SOAP и проанализировать ответ.

+0

Я пытаюсь сделать это прямо сейчас. Но я получаю исключение FileNotFoundException в конечной точке службы. Я установил URL-адрес конечной точки 12, упомянутой выше (http://www.srilanka.lk:9080/services/CropServiceProxy.CropServiceProxyHttpSoap12Endpoint). Разве это не правильный URL-адрес или он не является URL-адресом wsdl? Я использую HttpURLConnection. – Chamila

+1

Это, безусловно, путь. Я боролся последние пару дней с получением ksoap для работы, и я просто повторил вызов менее чем за 5 минут, используя Postman. – rplankenhorn

1

Я думаю, что ваш код в порядке.

Жажда взглянуть на ваш wsdl-файл, здесь вы можете найти все необходимые данные, например namspace, action и так далее. Во многих случаях действие - это строка emty, подобная «». Я всегда выбираю SoapEnvelope.VER11, но нормали это не имеет значения. Этот код работает только с примитивными типами данных и массивами String, если вы ожидаете, что сложные данные должны реализовать интерфейс kvmSerializable.

Извините за мой плохой английский, я надеюсь, вы понимаете, что я имею в виду. Ниже приведена полезная ссылка.

http://www.drdobbs.com/mobility/208800166;jsessionid=2VAK4K4QQ5H3TQE1GHPSKH4ATMY32JVN?pgno=1

+0

привет lx_man, спасибо за подсказку. Я использовал KvmSerializable и реализовал сложный тип. Но я все еще получаю ошибку. Я обновил вопрос с помощью последнего кода. – Chamila

+0

Может быть, вы можете посмотреть http://wsdltoksoap.googlecode.com, который является Android-совместимым генератором кода Java Webservice –

0

KSoap действительно имеет тенденцию вставить свои собственные пространства имен в каждый тег, который может дать выход вы можете попробовать

envelope.implicitTypes = true; 

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

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