我正在开发一个Android应用程序,它需要连接到.NET SOAP Web服务并从响应生成/填充大量对象。我完全不熟悉Web服务和SOAP,而且对于Android来说相对较新。网络服务已经建成(不是由我)。在Android中接收基于SOAP的.NET Web服务的自定义对象
我一直在试图找到有关在Android中连接到SOAP Web服务的信息。这两个基本的建议似乎是:
- 不要使用肥皂,
- 如果你使用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调用,以及我应该在那里。谢谢。
谢谢@Shadesco,那些非常有用。我试图现在连接到webservice并得到一个“org.xmlpull.v1.XmlPullParserException:意外的类型(位置:END_DOCUMENT null @ 1:0 in [email protected])”错误。你有什么想法吗? – breadbin 2012-02-06 15:59:31
@breadbin解析响应似乎是一个问题,但无论如何,我将不得不看一些代码来帮助你。重新编辑你的帖子添加一些你的代码,并告诉我错误发生的地方 – shadesco 2012-02-06 17:15:16
感谢您的回复,我已经更新了更多的细节和代码的问题。 – breadbin 2012-02-07 10:41:33