0

SOAP Web サービスと通信する Android アプリケーションを作成しており、そのために KSoap2 を使用しています。KSoap 2 は、1 つを除いて、私が行う呼び出しに対して機能しています (ただし、少し信頼性が低い場合もあります)。私が行っている特定のサービス コールは、「登録コード」とともにユーザー情報を取得するアカウントを登録することです。このコードは、ユーザーがアプリにアカウントを登録できるようにする前に、ユーザーが学校のメンバーであることを確認するために使用されます。問題は次のとおりです。Web サービスが期待する登録コードが「student123」であるとします。Web サービス呼び出しにどのような文字列を渡しても、コードが無効であるという応答が常に返されます。

メソッドを手動で呼び出すことができ、問題なく動作し、この Android と同じ目的で開発した iPhone アプリケーションから同じ SOAP メソッドを呼び出すこともできるため、Web サービスが問題ではないことを確信できます。 1。

私の質問は次のとおりです。KSoap2 は、Web サービスを呼び出すときに文字列を変更できますか? 登録コードを「a」のような 1 文字だけに変更しようとしましたが、無効なコードの応答が返されます。これが私のコードの一部です。これは、AsyncTask を拡張するクラス内にあります。

protected Object doInBackground(UserProfile...profiles) 
    {
        SoapObject request = new SoapObject(NAMESPACE, REGISTER);

        Vector<PropertyInfo> properties = makeProperties(ServiceCall.REGISTER, profiles[0]);

        for(int i = 0; i < properties.size(); ++i)
        {
            request.addProperty(properties.get(i));
        }

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet = true;
        envelope.setOutputSoapObject(request);

        try
        {
            HttpTransportSE transport = new HttpTransportSE(URL);
            transport.debug = true;

            transport.call(SOAP_NAMESPACE + REGISTER, envelope);
            Log.d("REGREQUEST", transport.requestDump);
            Log.d("REGRESPONSE", transport.responseDump);
            Log.d("EXECUTE", "In Register Execute");

            Object result = (Object)envelope.getResponse();
            //Log.d("Result", "Register result: " + result.toString());

            return result;          
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

        return null;

doInBackground メソッドに渡される UserProfile クラスは、登録情報を含む一連の文字列の単なるホルダーです。そしてその部分に関しては、

Vector<PropertyInfo> properties = makeProperties(ServiceCall.REGISTER, profiles[0]);

この関数は、次のように、渡された文字列と名前で PropertyInformation を作成する makeProperties という関数を呼び出すだけです。

private PropertyInfo makeProperty(String name, String value)
{
    PropertyInfo newProperty = new PropertyInfo();
    newProperty.setName(name);
    newProperty.setValue(value);
    newProperty.setType(PropertyInfo.STRING_CLASS);

    return newProperty;
}

Web サービスが期待する値の名前は「registrationCode」です。前述のとおり、フィールドの値をいじってみました。したがって、この呼び出しの例は...

PropertyInfo regCode = makeProperty("registrationCode", "student123");

Web サービスは明らかに、registrationCode フィールドに一致する何かを取得しており、受け取った値が無効であると応答しています。残念ながら、テストのこの段階では、これが使用できるパラメーターを必要とする唯一の Web サービス呼び出しであるため、他のサービス呼び出しで同じエラーが発生しているかどうかを実際にテストすることはできません。誰にもヒントはありますか?

さらに情報があれば教えてください。どんな助けでも大歓迎です!

編集: requestDump の出力は次のとおりです。

05-04 12:59:51.434: D/REGREQUEST(17492): <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>
<createStudentAccount xmlns="http://URL/" id="o0" c:root="1">
<fName i:type="d:string">Chandler</fName>
<lName i:type="d:string">Bing</lName>
<middleName i:type="d:string">M</middleName>
<userName i:type="d:string">lulz</userName>
<registrationCode i:type="d:string">student123</registrationCode>
<password i:type="d:string">pass</password>
<instructorName i:type="d:string">Instructor1</instructorName>
<schoolLocation i:type="d:string">Location1</schoolLocation>
</createStudentAccount></v:Body></v:Envelope>

この「i:type="d:string"」というものを見たことがありませんが、それが問題と関係があるのでしょうか?

4

0 に答える 0