0

Web サービス (Soap の実装) からデータを要求するアプリを作成しています。

この質問を見ている人は、コメントで質問を投稿してください... 質問に対する回答がありません。質問があるかどうか尋ねてください。本当に助けが必要です。行き詰まっています!!

したがって、リクエストを作成するには、ksoap ライブラリを使用する必要があります。Web サービスは、タイプ XML のレスポンスを返すようにコーディングされています。Web サービス自体をブラウザーでテストすると、次のような結果が表示されます。

?xml version="1.0" encoding="utf-8" ?> 
- <SOBKeyList>
- <Key>
  <value>12686</value> 
  </Key>
- <Key>
  <value>16238</value> 
  </Key>
- <Key>
  <value>26978</value> 
  </Key>
  </SOBKeyList>

明らかにXMLファイル...

Howeverこのコードを使用して結果を取得すると:

    public String getXmlFromUrl(String url) {
    // TODO Auto-generated method stub
    String xml = null;
    SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,OPERATION_NAME);
    PropertyInfo pi = new PropertyInfo();

    pi.setName("fkey");
    pi.setValue(0);
    pi.setType(Integer.class);
    request.addProperty(pi);

    pi = new PropertyInfo();

    pi.setName("tkey");
    pi.setValue(999999);
    pi.setType(Integer.class);
    request.addProperty(pi);


    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
            SoapEnvelope.VER11);
    envelope.dotNet = true;
    envelope.setOutputSoapObject(request);
    HttpTransportSE httpTransport = new HttpTransportSE(url);
    Object response = null; 

    try {
        httpTransport.call(SOAP_ACTION, envelope);
        response = envelope.getResponse();
        xml = response.toString();
        Log.d("xml:", xml);
    } catch (SoapFault e) {
        // TODO Auto-generated catch block
        Log.d("Soap Fault", e.toString());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        Log.d("IOexception", e.toString());
    } catch (XmlPullParserException e) {
        // TODO Auto-generated catch block
        Log.d("XmlPullParserException", e.toString());
    }

    return xml;
}

これは、私が作成したログ エントリによって確認されたネストされた SOAP 構造 を返します( ) 対応する LogCat エントリは次のとおりです: (SOAP 構造の階層構造が明確になるようにフォーマットしました... )Log.d("xml:", xml);

anyType{
      SOBKeyList=anyType{
                          Key=anyType{value=12686 ; };
                          Key=anyType{value=16238 ; };
                          Key=anyType{value=26978 ; };
                         };
          }

必然的に XML が必要な理由は、後で文字列を解析してDOM要素を取得し、上記の文字列が渡されると次のように返されるためです。

org.xml.sax.SAXParseException: 予期しないトークン (position:TEXT anyType{SOBKeyLi...@1:119 in java.io.StringReader@40ec9c68)

また、それ以降のコード全体は、応答がXMLであるという事実に依存しています。

私が XML を予期した理由の説明: Web サービスをテストしていないのに、XML を予期してアプリをコーディングした理由を尋ねられるかもしれません。 SOAP 構造を悪用するために残りのコードを変更する時間がありません!! --- 困っています。助けてください!

4

1 に答える 1

1

これを試して:

String responseXML = httpTransport.responseDump;
  • HttpTransportSE.responseDumpXML 形式で応答します。
  • HttpTransportSE.requestDumpリクエストを XML 形式で提供します。

ただし、これらの値を変更して取得できるようにするには、debugフィールドをHttpTransportSEに設定する必要があるtrue ため、コードは次のようになります...

    HttpTransportSE httpTransport = new HttpTransportSE(url);
    httpTransport.debug =true;      
    try {
        httpTransport.call(SOAP_ACTION, envelope);          
        xml = httpTransport.responseDump;
        Log.d("xml:", "is:" + xml);     
    }

また、次のように応答を解析できます。

ArrayList<String> listValues = new ArrayList<String>();

            httpTransport.call(SOAP_ACTION, envelope);
            SoapObject response = (SoapObject) envelope.getResponse();

            SoapObject soapSOBKeyList = (SoapObject) response.getProperty("SOBKeyList");

            int keyCount = soapSOBKeyList.getPropertyCount();

            for (int i = 0; i < keyCount; i++) {
                String value = soapSOBKeyList.getPropertyAsString(i);
                listValues.add(value);
            }

            return listValues;
于 2012-06-15T11:06:01.757 に答える