我正在构建一个需要通过 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();
}