2011-12-23 78 views
0

我有两个关于Ksoap2的问题。Android - WSDL/Ksoap2

首先,下面是我的web服务请求的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> 

我必须设置为DATAS领域: “语言”, “登录” 和 “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;)。

编辑:

嗯,我的问题是,发送的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模板...:/ !

+0

问题是什么? addProperty正确添加所有属性。这段代码是否失败?如果是这样,什么是例外? – 2011-12-23 14:54:50

+0

那么Web服务不能识别它? – 2011-12-26 14:10:10

回答

0

所以我假设你的服务方法的签名是一样的东西

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

其中identification是两个字符串属性loginpwd类。如果是这样的话,你可以创建一个新的类并实现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

嗨,托米斯拉夫,谢谢你的时间和你的回答! 我编辑了我的帖子。 再次感谢。 – nick 2011-12-26 14:06:39

+0

通过XML标准,这两种格式都应该被理解为相同。我不明白为什么它会失败。 – 2011-12-26 14:14:34