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>

唯一の違いは、2 番目の 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

プロパティからのみ名前空間を削除する場合は、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 に答える