要求のKSOAP名前空間とXML出力書式設定

SOAPインターフェイス経由でデータを取得する必要のあるAndroidアプリを構築しています。私はKSOAP2モジュール(ksoap2-android-2.6.0-jar-with-dependencies.jarを使用)を使用しようとしています。 子要素に正しい名前空間接頭辞を与えるKSOAPを取得することに問題があります。

これ欲しい:





    Data


しかしksoap2は私にこれを与える:





    Data


唯一の違いは、2番目のXML要求のPort要素にタグラベルに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 headerList = new ArrayList();
    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();

    }
1

3 答え

私はその間にこれを解決しました。 本当にシンプルだけど、検索するときにはこれの他の例は見られませんでした。 要求を構築するために使用される PropertyInfo に対して setNamespace メソッドを使用するだけで済みます。このような:

pi.setNamespace("http://example.com/nbi");
2
追加された

プロパティからのみ名前空間を削除する場合は、PropertyInfoを作成するときに空の文字列を設定できます。このような:

PropertyInfo pi = new PropertyInfo();
pi.setNamespace("");
pi.setName("myName");
pi.setValue("myString");
pi.setType(String.class);
2
追加された

次のスキームを使用して、デフォルトの名前空間効果を得ることができます。

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

これはあなたのようなものを与えるはずです:





    Data


また、Envelope上で envelope.setAddAdornments(false)を実行すると、より良い結果が得られます。





    Data


0
追加された