1

我正在构建一个需要通过 SOAP 接口获取一些数据的 Android 应用程序。我正在尝试使用 KSOAP2 模块(使用 ksoap2-android-2.6.0-jar-with-dependencies.jar)。我无法让 KSOAP 在子元素中为我提供正确的命名空间前缀。

我要这个:

<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>
<n0:GetRequest id="o0" c:root="1" xmlns:n0="http://dummy.com/nbi">
    <n0:Port i:type="d:string">Data</n0:Port>
</n0:GetRequest>
</v:Body></v:Envelope>

但是 ksoap2 给了我这个:

<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>
<n0:GetRequest id="o0" c:root="1" xmlns:n0="http://dummy.com/nbi">
    <Port i:type="d:string">Data</Port>
</n0:GetRequest>
</v:Body></v:Envelope>

唯一的区别是第二个 XML 请求中的 Port 元素在标签标签上没有 n0 前缀。

我一直在研究正确的命名空间 xml 理论,在我看来,格式良好的 XML 应该在所有相关元素上都有命名空间前缀,或者父元素应该有一个默认的命名空间定义。使用 SoapUI 我可以手动向我的服务器提交请求并让这些选项中的任何一个起作用,但我无法弄清楚如何让 ksoap 产生任何一种请求格式。即,我不知道如何生成具有默认命名空间的元素,或者如何生成在每个子元素上都具有命名空间前缀的元素。我已经尝试了我能想到的所有设置变体,但我能想到的唯一(不优雅的)解决方案是将前缀手动添加到端口标签。有没有人想出如何实现我想要的?我的 SOAP 服务器没有

这是相关的代码片段:

private static final String namespace = "http://dummy.com/nbi";
private static final String URL = "http://192.168.254.117/soap/nbi";
String SOAP_ACTION = namespace + "/" + methodCall;
SoapObject request = new SoapObject(namespace, methodCall);
    PropertyInfo pi = new PropertyInfo();
pi.setName("myName");
pi.setValue("myString");
pi.setType(String.class);
    request.addProperty(pi);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = false;
envelope.setAddAdornments(false);       
envelope.implicitTypes = false;
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
androidHttpTransport.debug = true;

try
   {
    List<HeaderProperty> headerList = new ArrayList<HeaderProperty>();
    headerList.add(new HeaderProperty("Authorization", "Basic " + org.kobjects.base64.Base64.encode("nbsam:nbsam".getBytes())));
        androidHttpTransport.call(SOAP_ACTION, envelope, headerList);
        SoapObject response = (SoapObject)envelope.getResponse();
        String result = response.getProperty(0).toString();

    }
4

3 回答 3

2

如果您只想从 Property 中删除命名空间,您可以在创建 PropertyInfo 时设置一个空字符串。像这样:

PropertyInfo pi = new PropertyInfo();
pi.setNamespace("");
pi.setName("myName");
pi.setValue("myString");
pi.setType(String.class);
于 2014-02-13T15:21:27.883 回答
2

在此期间我解决了这个问题。真的很简单,但我在搜索时没有看到其他示例。只需要使用用于构造请求的setNamespace方法。PropertyInfo像这样:

pi.setNamespace("http://example.com/nbi");
于 2011-12-21T03:43:46.480 回答
0

您可以使用以下方案获得默认命名空间效果。

SoapObject request = new SoapObject(NAMESPACE, "GetRequest");
SoapObject data = new SoapObject("", "Port");
request.addSoapObject(data);

这应该给你类似的东西:

<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>
<GetRequest id="o0" c:root="1" xmlns:n0="http://dummy.com/nbi">
    <Port i:type="d:string">Data</Port>
</GetRequest>
</v:Body></v:Envelope>

你也可以envelope.setAddAdornments(false)在信封上做得到更好的:

<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>
<GetRequest xmlns:n0="http://dummy.com/nbi">
    <Port i:type="d:string">Data</Port>
</GetRequest>
</v:Body></v:Envelope>
于 2012-01-18T04:09:56.107 回答