我正在構建一個需要通過SOAP接口獲取數據的Android應用程序。我試圖使用KSOAP2模塊(使用ksoap2-android-2.6.0-jar-with-dependencies.jar)。 我無法讓KSOAP在子元素中給我正確的名稱空間前綴。KSOAP名稱空間和請求的XML輸出格式
我想這一點:
<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請求的端口元素沒有對的N0前綴標籤標籤。
我一直在適當的命名空間xml理論上刷牙,在我看來,格式良好的XML應該在所有相關元素上具有名稱空間前綴,或者父元素應該具有默認名稱空間定義。使用SoapUI我可以手動向我的服務器提交請求,並讓這兩個選項都起作用,但是我無法弄清楚如何讓ksoap產生任何請求格式。即我無法弄清楚如何使用默認名稱空間生成元素,或者如何生成在每個子元素上都有名稱空間前綴的元素。 我已經嘗試了我能想到的所有設置變體,但我能想出的唯一(不雅)解決方案是手動將前綴添加到端口標籤。 有沒有人制定了如何做到我想要的? 我的SOAP服務器不喜歡沒有嚴格XML格式語法的請求。
下面是相關的代碼片段:
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();
}