1

PHPSOAPWebサービスを呼び出そうとしています。WPFプロジェクトでWebサービスを正常に使用しているので、Webサービスが正しく機能することを知っています。同じWebサービスを使用して、Androidでアプリを構築しています。

WSDLファイルはここにあります:http ://www.wegotcha.nl/servicehandler/service.wsdl

これはAndroidアプリの私のコードです:

String SOAP_ACTION = "http://www.wegotcha.nl/servicehandler/CheckLogin";
        String NAMESPACE = "http://www.wegotcha.nl/servicehandler";
        String METHOD_NAME = "CheckLogin";
        String URL = "http://www.wegotcha.nl/servicehandler/servicehandler.php";
        String resultData = "";

        SoapSerializationEnvelope soapEnv = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

        SoapObject UserCredentials = new SoapObject("Types", "UserCredentials6");
        UserCredentials.addProperty("mail", params[0]);
        UserCredentials.addProperty("password", md5(params[1]));

        request.addSoapObject(UserCredentials);
        soapEnv.setOutputSoapObject(request);

        HttpTransportSE http = new HttpTransportSE(URL);
        http.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
        http.debug = true;

        try {
            http.call(SOAP_ACTION, soapEnv);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }

        SoapObject results = null;
        results = (SoapObject)soapEnv.bodyOut;

        if(results != null)
            resultData = results.getProperty(0).toString();

        return resultData;

fiddlerを使用して、次の情報を取得しました。Androidリクエスト:

<?xml version="1.0" encoding="utf-8"?>
<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:CheckLogin id="o0" c:root="1" xmlns:n0="http://www.wegotcha.nl/servicehandler">
<n1:UserCredentials6 i:type="n1:UserCredentials6" xmlns:n1="Types">
    <mail i:type="d:string">myemail</mail>
    <password i:type="d:string">myhashedpass</password>
</n1:UserCredentials6>
</n0:CheckLogin>
</v:Body>
</v:Envelope>

次の応答を取得します。

 Procedure 'CheckLogin' not present

WPFアプリによって生成された私の要求は完全に異なって見えます:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<UserCredentials6 xmlns="Types">
    <mail>mymail</mail>
    <password>mypassword</password>
</UserCredentials6>
</s:Body>
</s:Envelope>

お尻をググってみたら、この問題を自分で解決することはできませんでした。それ以来、私は多くのことを変更したので、Javaコードに奇妙なことがいくつかある可能性があります。皆さんが私を助けてくれることを願っています、ありがとう。

編集:

私のWebサービスはドキュメント/リテラル​​エンコーディングスタイルです。調査を行った結果、SoepEnvelope代わりに使用できるはずであることがわかりましSoapSerializationEnvelopeた。ただし、これを置き換えると、try cacheブロックの前にエラーが発生し、アプリがクラッシュします。

エラー:

11-04 16:23:26.786:E / AndroidRuntime(26447):原因:java.lang.ClassCastException:org.ksoap2.serialization.SoapObjectをorg.kxml2.kdom.Nodeにキャストできません

これはこれらの行によって引き起こされます:

request.addSoapObject(UserCredentials);
soapEnv.setOutputSoapObject(request);

これは解決策かもしれませんが、どうすればこれを実行できますか?この素晴らしいチュートリアルを除いて、SoapSerializationEnvelopeの代わりにSoapEnvelopeを使用することについては何も見つかりませんでした。

http://ksoap.objectweb.org/project/mailingLists/ksoap/msg00849.html

4

1 に答える 1

1

いくつかの奇妙なことが起こった。いくつかの新しいエラーが発生し、次のコードが機能するようになったので、行を削除しただけで(何千回も実行しました)、残りの部分を少し調整しました。

String SOAP_ACTION = "http://www.wegotcha.nl/servicehandler/CheckLogin";
String NAMESPACE = "http://www.wegotcha.nl/servicehandler";
String METHOD_NAME = "CheckLogin";
String URL = "http://www.wegotcha.nl/servicehandler/servicehandler.php";
String resultData = "";

SoapSerializationEnvelope soapEnv = new SoapSerializationEnvelope(SoapEnvelope.VER11);

SoapObject UserCredentials = new SoapObject("Types", "UserCredentials6");
UserCredentials.addProperty("mail", params[0]);
UserCredentials.addProperty("password", md5(params[1]));

// changed these lines
// request.addSoapObject(UserCredentials);
// soapEnv.setOutputSoapObject(request);
// into:
soapEnv.setOutputSoapObject(UserCredentials);

HttpTransportSE http = new HttpTransportSE(URL);
http.debug = true;

// little tweak here        
String results = null;
try {
    http.call(SOAP_ACTION, soapEnv);
    //another tweak here
results = soapEnv.bodyIn.toString();
} catch (IOException e) {
    e.printStackTrace();
} catch (XmlPullParserException e) {
    e.printStackTrace();
}

if(results != null)
    resultData = results;

return resultData;

そして今、私は正しくログインすることができます:)これは私がyesまたはnoを返す唯一の場所であるため、それらはあまり機能的な回避策ではありません。複合型の配列などを考えてみてください。しかし、それは別の話です。

于 2012-11-04T16:49:48.983 に答える