2012-02-03 56 views
3

我正在开发一个Android应用程序,它需要连接到.NET SOAP Web服务并从响应生成/填充大量对象。我完全不熟悉Web服务和SOAP,而且对于Android来说相对较新。网络服务已经建成(不是由我)。在Android中接收基于SOAP的.NET Web服务的自定义对象

我一直在试图找到有关在Android中连接到SOAP Web服务的信息。这两个基本的建议似乎是:

  1. 不要使用肥皂,
  2. 如果你使用SOAP,使用KSOAP2。

我已经看过KSOAP2的各种教程,但它们似乎都只处理最基本的原始类型,例如发送2个int以返回1个int或发送和接收字符串;但是,我需要来回发送自定义对象。

是否可以使用KSOAP2发送和接收自定义对象?如果是这样,这是多么容易/困难?是否必须解析XML来“手动”创建/填充对象?

编辑/ UPDATE: 尝试了一段时间,以连接到现有的web服务后(需要一个字符串,并返回一个复杂的对象),并得到一个错误,我决定尝试一种更简单的方法。我连接到一个简单的web服务,它不接受任何参数,并返回一个int。这个更简单的web服务与原来的服务位于同一个地方,简单的web服务现在对我来说工作正常。

进一步更新: 现在所有的工作正常!原来我只是有一个大写错误,它抛弃了我的参数。

最后的问题是“国家”与“国家”。下面是soapUI的生成代码:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"  xmlns:tem="http://tempuri.org/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <tem:GetClientByNationalID> 
     <!--Optional:--> 
     <tem:nationalID>XXXXXXX</tem:nationalID> 
     </tem:GetClientByNationalID> 
    </soapenv:Body> 
</soapenv:Envelope> 

而且这是被我的Java生成的请求代码:

<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> 
     <GetClientByNationalID xmlns="http://tempuri.org/" id="o0" c:root="1"> 
      <NationalID i:type="d:string"> 
       XXXXXXXX 
      </NationalID> 
     </GetClientByNationalID> 
    </v:Body> 
</v:Envelope> 

我最后的Java代码:

public void webServiceCall() { 
    String NAMESPACE = "http://tempuri.org/"; 
    String METHOD_NAME = "GetClientByNationalID"; 
    String SOAP_ACTION = "http://tempuri.org/IClientService/GetClientByNationalID"; 

    // unsecure service 
    String URL = "http://XXXXXXXXXXXXXXXXXXXX.net/FPUnSecureService/ClientService.svc"; 

    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 

    String clientID = "XXXXXXX"; 

    PropertyInfo pi = new PropertyInfo(); 
    pi.setName("nationalID"); 
    pi.setValue(clientID); 
    pi.setType(clientID.getClass()); 
    request.addProperty(pi); 

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

    envelope.addMapping(NAMESPACE, "GetClientByNationalID", new ClientID().getClass()); 
    Marshal floatMarshal = new MarshalFloat(); 
    floatMarshal.register(envelope); 

    HttpTransportSE t = new HttpTransportSE(URL); 

    ClientID client = new ClientID(); 
    t.debug = true; 

    try { 
     Log.i("webServiceCall", "Trying call to web service"); 
     t.call(SOAP_ACTION, envelope); 
     SoapObject response = (SoapObject) envelope.getResponse(); 

     Log.i("success", response.getPropertyAsString(0)); 
     Log.i("success", response.getPropertyAsString(1)); 
     Log.i("success", response.getPropertyAsString(2)); 
     Log.i("success", response.getPropertyAsString(3)); 
     Log.i("success", response.getPropertyAsString(4)); 

    } catch (Exception e) { 
     Log.e("webServiceCall", "Error calling webservice."); 
     e.printStackTrace(); 
     System.out.println("Request: " + t.requestDump); 
     System.out.println("Response: " + t.responseDump); 
    } 

} 

我仍然迷茫关于这些行:

envelope.addMapping(NAMESPACE, "GetClientByNationalID", new ClientID(). 
Marshal floatMarshal = new MarshalFloat(); 
floatMarshal.register(envelope); 

我想我在传递一个对象作为参数时添加了元帅部分,我不确定我是否仍然需要它们。我也不确定addMapping调用,以及我应该在那里。谢谢。

回答

1

使用kso​​ap2,检查我的代码示例在下面的链接答案:Link1link2link3。我写了一些细节,这将有助于你理解如何开始编码。
让我知道你是否需要帮助。

UPDATE(回答您有关映射和编组问题)
u使用addMapping当你发送复杂类型(即对象)通过SOAP信封。 Web服务如何识别复杂类型?你需要在本地创建一个实现kvmserializable的类(如我的链接中提到的),它将具有与服务器上的对象相同的参数,然后您需要在它与映射到它的类之间添加映射 ,以便在服务器上解析信封时知道该复杂类型X映射到服务器上的类X。所以如果你不是发送复杂类型,你不需要添加映射(PS:我看到你没有发送复杂类型,因为nationalID是字符串类型,IF可以说nationalID是一个复杂类型Z你会做:addMapping空间(namespace,Z.class.getSimpleName(),Z.class)

至于编组,它使用Java序列化来改变对象将数据流上的Web服务进行解组。因此,当你发送一个复杂类型时,根据我的经验,添加编组以便通过序列化将复杂类型更改为数据流是一种很好的做法。如果你发现你不需要它,只是不加它,但总是很好理解那里有什么选择。

+0

谢谢@Shadesco,那些非常有用。我试图现在连接到webservice并得到一个“org.xmlpull.v1.XmlPullParserException:意外的类型(位置:END_DOCUMENT null @ 1:0 in [email protected])”错误。你有什么想法吗? – breadbin 2012-02-06 15:59:31

+0

@breadbin解析响应似乎是一个问题,但无论如何,我将不得不看一些代码来帮助你。重新编辑你的帖子添加一些你的代码,并告诉我错误发生的地方 – shadesco 2012-02-06 17:15:16

+0

感谢您的回复,我已经更新了更多的细节和代码的问题。 – breadbin 2012-02-07 10:41:33

相关问题