Android - WSDL / Ksoap2 - PullRequest
       24

Android - WSDL / Ksoap2

0 голосов
/ 23 декабря 2011

У меня два вопроса о Ksoap2.

Прежде всего, ниже пример моего запроса веб-сервиса в XML.

ЗАПРОС:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://my-webservice.com/">
   <soapenv:Header/>
   <soapenv:Body>
      <web:getBoard>
         <!--Optional:-->
         <language></language>
         <identification login="" pwd=""/>
      </web:getBoard>
   </soapenv:Body>
</soapenv:Envelope>

ОТВЕТ:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <ns2:getBoardResponse xmlns:ns2="http://my-webservice.com/">
         <board code="NONE">WhatIWant</board>
         <board code="HALF">blabla</board>
         <board code="FULL">blablah</board>
         <board code="RONL">blablalblba</board>
         <board code="BRKF">blabla</board>
         <board code="ALLI">blablablah</board>
      </ns2:getBoardResponse>
   </soap:Body>
</soap:Envelope>

Я должен установить данные для полей: "язык", "логин" и "pwd", но я не уверен, что использовать хороший метод ... (addProperty или setProperty для поля"language"?)

  public class CallRefservices {

  private static final String NAMESPACE = "http://api.myapi.com/test/ws/test";
  private static final String URL = "http://api.myapi.com/test/ws/test?wsdl";
  private static final String SOAP_ACTION = "getBoard";
  private static final String METHOD_NAME = "getBoard";

  Boolean getConnection(String login, String pwd) {
      Boolean checkBoardType = false;
    try {
      SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
      request.addProperty("login", login);
      request.addProperty("pwd", pwd);
      request.addProperty("language", "FR");

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

      HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
      androidHttpTransport.call(SOAP_ACTION, envelope);
      SoapObject objetSOAP = (SoapObject)envelope.getResponse();
      checkBoardType = this.parserObjet(objetSOAP);

    } catch (Exception e) {
      Log.e("getConnection", "", e);
    } 
    return checkBoardType;
  }

  private boolean parserObjet(SoapObject objet) {
        SoapObject boardObjet = (SoapObject)objet.getProperty("board");
        String board = boardObjet.getProperty("NONE").toString();

        if (board == "WhatIWant")
            return true;
        else
            return false;
  }
}

Мне также нужна помощь по поводу парсера.какой парсер используется с Ksoap2?(DOM, SAX) Я использую хороший метод?

любая помощь приветствуется!С Рождеством, кстати;).

РЕДАКТИРОВАТЬ:

Ну, моя проблема в том, что отправленный XML-код выглядит следующим образом:

   [...] <login i:type="d:string">mylogin</login><pwd i:type="d:string">mypassword</pwd><language i:type="d:string">FR</language></n0:getBoardTypes></v:Body></v:Envelope>

В то время как мне нужно:

   [...] <language></language>
     <identification login="" pwd=""/>

: |

РЕДАКТИРОВАТЬ 2:

Привет, Томислав, спасибо за ваше время и ваш ответ!Я попробовал ваше решение, но оно не работает.

Я полагаю, что отправил что-то вроде:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://my.api.com/">
   <soapenv:Header/>
   <soapenv:Body>
      <web:getBoard>
         <language>FR</language>
         <identification login="username" pwd="mypwd"/>
      </web:getBoard>
   </soapenv:Body>
</soapenv:Envelope>

С вашим решением у меня что-то вроде:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://my.api.com/">
   <soapenv:Header/>
   <soapenv:Body>
      <web:getBoard>
         <language>FR</language>
         <identification>
           <login>username</login>
           <pwd>mypwd</pwd>
         </identification>
      </web:getBoard>
   </soapenv:Body>
</soapenv:Envelope>

Я думаю, что я собираюсь создать шаблон XML ...: /!

1 Ответ

0 голосов
/ 23 декабря 2011

Итак, я предполагаю, что ваша сигнатура метода обслуживания похожа на

 getBoard(String language, identification ident) // parameter names here must match the param names in the code below

где identification - это класс с двумя строковыми свойствами login и pwd. Если это так, вы можете создать новый класс и реализовать KvmSerializable, как показано ниже:

public class identification implements KvmSerializable {
    public String login;
    public String pwd;

    public identification (String login, String pwd) {
        this.login = login;
        this.pwd = pwd;
    }

    public Object getProperty(int i) {
        switch (i) {
            case 0:
                return login;
            case 1:
                return pwd;
        }
        return null;
    }

    public int getPropertyCount() {
        return 2;
    }

    public void setProperty(int i, Object o) {
        switch (i) {
            case 0:
                login = o.toString();
                break;
            case 1:
                pwd = o.toString();
                break;
        }
    }

    public void getPropertyInfo(int i, Hashtable hashtable, PropertyInfo propertyInfo) {
        switch (i) {
            case 0:
                propertyInfo.type = PropertyInfo.STRING_CLASS;
                propertyInfo.name = "login";
                break;
            case 1:
                propertyInfo.type = PropertyInfo.STRING_CLASS;
                propertyInfo.name = "pwd";
                break;
        }
    }
}

А затем добавьте это свойство следующим образом:

    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
    request.addProperty("language", "FR");
    PropertyInfo info = new PropertyInfo();
    info.setName("identification"); // you have to make sure here that the parameter name matches the one in the WSDL, which you havent posted
    info.setType(identification.class);
    info.setValue(new identification("username", "password"));
    request.addProperty(info);
...