13

私は、応答のためにWebサービスを接続する必要があるAndroid Webアプリケーションを開発しています。

Web サービス呼び出しプロセスにkSOAPを使用しています。[kSOAP は、アプレットや J2ME アプリケーションなどの制約のある Java 環境向けの SOAP Web サービス クライアント ライブラリです。]

応答したxmlをローカルディレクトリに保存している場合、たとえば. /mnt/sdcard/appData/config.xmlを入力してから、Web サービスのリクエストを行うと、最初にローカル ファイルが存在するかどうかがチェックされ、そのファイルが応答ファイルであると見なされ、それ以外の場合はサーバーに接続されます。

このプロセスにより、応答時間が短縮され、アプリケーションの効率が向上します。

それ ('config.xml') を SOAP オブジェクトに変換することは可能ですか? そしてどうやって?

私のxmlローカルファイルが以下のようになっていると考えてください:

config.xml

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<Response xmlns="http://testuser.com/webservices/response">
<Result>
<SName>Test User</SName>
<UnitDesc>SAMPLE Test </UnitDesc> <RefreshRate>60</RefreshRate>
<Out>
<Definition>
<Code>ABC</Code>
<Description>(Specific)</Description>
<Action>true</Action>
<Despatch>false</Despatch>
</Definition>
<Definition>
<Code>CDE</Code><Description>(Specific)</Description>
<ActionDate>true</ActionDate>
</Definition>
</Out>
<SampleText>
<string>Test XML Parsing</string>
<string>Check how to convert it to SOAP response</string>
<string>Try if you know</string>
</SampleText>
<GeneralData>
<Pair>
<Name>AllowRefresh</Name>
<Value>Y</Value>
</Pair>
<Pair>
<Name>ListOrder</Name>
<Value>ACCENDING</Value>
</Pair>
</GeneralData>
</Result>
</Response>
</soap:Body>
</soap:Envelope>

現在のコードを以下に示します。

final String CONFIGURATION_FILE="config.xml";
File demoDataFile = new File("/mnt/sdcard/appData");
boolean fileAvailable=false;
File[] dataFiles=demoDataFile.listFiles(new FilenameFilter() {
@Override
    public boolean accept(File dir, String filename) {
        return filename.endsWith(".xml");
    }
});


for (File file : dataFiles) {

 if(file.getName().equals(CONFIGURATION_FILE))
 {
    fileAvailable=true;
 }


 }

if(fileAvailable)
    {
        //**What to do?**
    }
else
{

   //Create the envelope
   SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

    //Put request object into the envelope
    envelope.setOutputSoapObject(request);

    //Set other properties
    envelope.encodingStyle = SoapSerializationEnvelope.XSD;
    envelope.dotNet = true;
    String method="test";

        synchronized (transportLockObject)
        {
            String soapAction = "http://testuser.com/webservices/response/"+method;

            try {
                transport.call(soapAction, envelope);
            } catch (SSLHandshakeException she) {
                she.printStackTrace();
                SecurityService.initSSLSocketFactory(ctx);
                transport.call(soapAction, envelope);             
            }
        }

        //Get the response
        Object response = envelope.getResponse();

        //Check if response is available... if yes parse the response
        if (response != null)
        {
            if (sampleResponse != null)
            {
                sampleResponse.parse(response);
            }
        }
        else 
        {
            // Throw no response exception
            throw new NoResponseException("No response received for " + method + " operation");
        }

}
4

2 に答える 2

10

次のように、クラスを拡張HttpTransportSEしてメソッドをオーバーライドできます。call

public void call(String soapAction, SoapEnvelope envelope) throws IOException, XmlPullParserException
{
    if(localFileAvailable)
    {
        InputStream is = new FileInputStream(fileWithXml);
        parseResponse(envelope, is);
        is.close();
    }
    else
    {
        super.call(soapAction, envelope);
    }
}
于 2013-07-29T13:34:19.330 に答える
1

問題は、xml ファイルを SoapObject に変換する方法でした。では、入力 xml エンベロープを ksoap2 呼び出しに取得する方法。

これを行う方法は、意図した用途ではありませんが、実際には HttpTransportSE クラス内で利用できます。

エンベロープと入力ストリーム (xml ファイル) を取り込み、エンベロープの入力ヘッダーと本文を更新する "parseResponse" メソッドがあります。しかし賢いのは、これらを outHeader フィールドと outBody フィールドにコピーできることです。そうすれば、フィールドをマッピングするという面倒な作業がすべてなくなります。

        @Override
public void call(String soapAction, SoapEnvelope envelope) throws IOException, XmlPullParserException {
    if ( getFileInputStream() != null ){

        parseResponse(envelope, getFileInputStream());
        envelope.bodyOut = envelope.bodyIn;
        envelope.headerOut = envelope.headerIn;
        getFileInputStream().close();
    }

    super.call(soapAction,envelope);

}
于 2015-09-14T10:02:16.347 に答える