1

搜索了一整天后,我仍然找不到解决问题的方法。

我有一个 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 &lt;{}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>

如何让我的请求看起来像所需的请求?

4

2 回答 2

0

添加属性的命名空间:

PropertyInfo info = new PropertyInfo();
info.setNamespace("http://www.w3.org/2001/XMLSchema-instance");
info.setName("in");
info.setValue("Hallo Welt");
info.setType(PropertyInfo.STRING_CLASS);
request.addProperty(info);
于 2013-03-14T13:15:55.313 回答
0

以下是如何向 .Net Web 服务发出请求,在这里我正在调用名为“Login”的函数,您可以在函数链接行中以肥皂信封格式找到您的服务的名称空间,因此此处为“ http://www.example。 com/ " 在命名空间和函数名 id Login 中。有关更多详细信息,请查看链接

    私有静态最终字符串 URL = "http://www.example.com/service.asmx";
    私有静态最终字符串 NAMESPACE = "http://www.example.com/";
    最终字符串 SOAP_ACTION = NAMESPACE+“登录”;
    最终字符串 METHOD_NAME ="登录";
    字符串响应=空;
    SoapObject request=new SoapObject(NAMESPACE,METHOD_NAME);

        request.addProperty("用户名",user_name);
        request.addProperty("密码", 密码);

        SoapSerializationEnvelope 信封=新 SoapSerializationEnvelope(SoapEnvelope.VER11);
        信封.setAddAdornments(假);

        信封.implicitTypes = true;
        信封.dotNet=真;
        信封.setOutputSoapObject(请求);
        MarshalBase64 元帅 = 新 MarshalBase64();
        marshal.register(信封);
        HttpTransportSE httpTransport = new HttpTransportSE(URL);
        httpTransport.call(SOAP_ACTION, 信封);
        SoapPrimitivesoap_primitive = null;
            soap_primitive=(SoapPrimitive)信封.getResponse();
            response=String.valueOf(soap_primitive);

于 2013-03-13T12:24:33.003 回答