我正在创建一个与 SOAP Web 服务通信的 Android 应用程序,并且我正在使用 KSoap2 来完成它。KSoap 2 对于我拨打的电话一直有效(尽管有时有点不可靠),除了一个。我正在进行的特定服务调用是注册一个帐户,该帐户需要一些用户信息以及“注册码”。此代码用于确保用户在让他们使用应用程序注册帐户之前是学校的成员。问题是这样的:假设 Web 服务期望的注册码是“student123”。无论我将什么字符串传递给 Web 服务调用,我总是得到一个响应,说代码无效。
我可以肯定 Web 服务不是问题,因为我可以手动调用该方法并且它工作得很好,我什至可以从我为与此 Android 相同目的开发的 iPhone 应用程序中调用相同的 SOAP 方法一。
所以我的问题是:KSoap2 在调用 Web 服务时会改变字符串吗?我尝试将注册码更改为像“a”这样的单个字符,但它仍然返回无效的代码响应。这是我的一些代码。这是在扩展 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]);
调用时,此函数仅调用一个名为 makeProperties 的函数,该函数使用传递的字符串和名称创建一个 PropertyInformation,如下所示:
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"" 的东西,这可能与问题有关吗?