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"」というものを見たことがありませんが、それが問題と関係があるのでしょうか?