2011-12-23 18 views
0

Ksoap2について2つの質問があります。Android - WSDL/Ksoap2

まず、XMLでの私のWebサービスリクエストの例を以下に示します。

REQUEST:

<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「言語」?)

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) 私は良い方法を使用していますか?

ご了承ください。 メリークリスマスbtw;)。

編集:私は必要なのに対し

[...] <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=""/> 

まあ、私の問題は、送信されたXMLは次のようであるということです|

EDIT 2:

こんにちはトミスラフ、あなたの時間とあなたの答えをありがとう! 私はあなたのソリューションを試しましたが、うまく動作しません。 ...私はつもりXMLテンプレートを作成することを考えて

<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> 

::/ iのような何かをしたあなたのソリューションを使用すると

<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> 

は、私のような何かを送信すると仮定です!

+0

問題は何ですか? addPropertyはすべてのプロパティを追加するのに正しいです。このコードは失敗しますか?もしそうなら、例外は何ですか? –

+0

Webサービスはそれを認識しませんか? –

答えて

0

だから私はあなたのサービスメソッドのシグネチャは

identificationは、2つの文字列のプロパティ loginpwdを持つクラスです
getBoard(String language, identification ident) // parameter names here must match the param names in the code below 

のようなものであると仮定します。その場合は、新しいクラスを作成し、以下のように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); 
+0

こんにちはTomislav、あなたの時間とあなたの答えに感謝します! 私の投稿を編集しました。 もう一度ありがとうございます。 – nick

+0

XML標準では、両方の形式を同じに理解する必要があります。なぜ失敗するのか分かりません。 –

関連する問題