搜索了一整天后,我仍然找不到解决问题的方法。
我有一个 WebService,它为我提供了以下WSDL 文件,我将其上传到 pastebin,因为它真的很大。
首先,我想实现 ping 函数,您可以使用字符串值调用该函数并将字符串值返回给客户端。我认为相关部分是:
<wsdl:operation name="ping">
<wsdl:input message="tns:ping" name="ping"></wsdl:input>
<wsdl:output message="tns:pingResponse" name="pingResponse"></wsdl:output>
<wsdl:fault message="tns:ServerException" name="ServerException"></wsdl:fault>
<wsdl:fault message="tns:UserException" name="UserException"></wsdl:fault>
</wsdl:operation>
和:
<xs:complexType name="ping">
<xs:sequence>
<xs:element minOccurs="0" name="in" type="xs:string"/>
</xs:sequence>
</xs:complexType>
无论如何,如果您可以查看实际的 wsdl 文件并告诉我这些是否真的是它的相关部分,那将是非常好的。
因此,要使用 Android 访问它,我使用的是 ksoap2。我的代码如下所示:
SoapObject request = new SoapObject("http://shared.bimserver.org/", "ping");
request.addProperty("in", "Hallo Welt");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE httpTransport = new HttpTransportSE("http://10.0.0.5:8082/soap");
httpTransport.debug = true;
httpTransport.call("http://shared.bimserver.org/ping", envelope);
这将创建以下请求:
<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><ping xmlns="http://shared.bimserver.org/" id="o0" c:root="1"><in i:type="d:string">Hallo Welt</in></ping></v:Body></v:Envelope>
但我得到了这样的回应:
<soap:Body><soap:Fault><faultcode>soap:Client</faultcode><faultstring>Unmarshalling Error: unexpected element (uri:"http://shared.bimserver.org/", local:"in"). Expected elements are <{}in> </faultstring></soap:Fault></soap:Body>
所以我希望参数“in”不能有命名空间。我尝试了不同的方法,例如:
PropertyInfo info = new PropertyInfo();
info.setName("in");
info.setNamespace("");
info.setValue("Hallo Welt");
request.addProperty(info);
但这并没有改变请求或响应。
我还从肥皂对象中删除了命名空间:
SoapObject request = new SoapObject("", "ping");
这给了我以下要求:
<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><ping xmlns="" id="o0" c:root="1"><in i:type="d:string">Hallo Welt</in></ping></v:Body></v:Envelope>
并做出以下回应:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><soap:Fault><faultcode>soap:Client</faultcode><faultstring>Unexpected wrapper element ping found. Expected {http://shared.bimserver.org/}ping.</faultstring></soap:Fault></soap:Body></soap:Envelope>
所以这里看起来,参数“in”不能有命名空间,但 ping 请求必须有命名空间。
请帮我。我已经尝试了我能想象到的任何事情。
编辑:使用soapUI 我发现,响应应该是这样的:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:shar="http://shared.bimserver.org/">
<soapenv:Header/>
<soapenv:Body>
<shar:ping>
<!--Optional:-->
<in>Hallo</in>
</shar:ping>
</soapenv:Body>
</soapenv:Envelope>
我的请求如下所示:
<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>
<ping xmlns="http://shared.bimserver.org/">
<in i:type="d:string">test</in>
</ping>
</v:Body>
</v:Envelope>
如何让我的请求看起来像所需的请求?