我正在尝试将我的Android APP开发连接到Web服务,但似乎无法捕获响应(引发上述错误);我的APP代码的片段如下:
@Override
protected String doInBackground(String... params) {
String URL = "https://MyDomain/Services/AccountManager.asmx";
String NAMESPACE = "http://tempuri.org/";
String METHOD_NAME = parameters.get("METHOD_NAME");
String ReturnValue;
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
// addProperty for each KeyPair in the Parameters HashMap
for (Map.Entry<String, String> parameter : parameters.entrySet()) {
if (!parameter.getKey().startsWith("_") && parameter.getKey() != "METHOD_NAME") {
request.addProperty(parameter.getKey() , parameter.getValue());
}
}
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.implicitTypes = true;
envelope.setOutputSoapObject(request);
HttpTransportSE httpTransportSE = new HttpTransportSE(URL);
try {
httpTransportSE.call(NAMESPACE + METHOD_NAME, envelope);
SoapPrimitive soapPrimitive = (SoapPrimitive) envelope.getResponse();
ReturnValue = soapPrimitive.getAttribute("StatusCode").toString();
} catch (Exception ex) {
ReturnValue = "Error: " + ex.getMessage();
}
return ReturnValue;
}
错误由行引发
SoapPrimitive soapPrimitive = (SoapPrimitive) envelope.getResponse();
我读了许多文章/帖子,建议将上一行更改为下一行:
Object soapPrimitive = (Object) envelope.getResponse();
尽管这样做可以“解决”错误,但随后未命名服务的返回值:
好
2119100
278
Ë
...而不是处于可用的“配对”状态;
response.getAttribute("AccountNumber") = 2119100
response.getAttribute("AccountBalance") = 278
response.getAttribute("StatusCode") = "E"
我确实可以控制Web服务,所以如果可以的话,可以在那里进行编辑。服务的C#代码段:
[WebMethod(
Description = "Account Lookup",
MessageName = "Account",
EnableSession = false)]
public string Account(
string PostCode,
string Surname,
out double? AccountBalance,
out string AccountNumber,
out string StatusCode)
{
// MY STUFF HERE
AccountBalance = 50;
AccountNumber = 123456;
StatusCode = "A";
Return "OK";
}
上面是实际服务的大幅缩减版本,(用于生产)它将返回[例如]财务交易的完整明细,包括期初余额,当期余额,增值税,利息,折扣等,因此,跟踪未命名的索引列表将逐渐成为维护的噩梦。
[编辑22/02/2019]
我已经更改(并简化了)WebService,以使其仅采用INPUT值
[WebMethod(
Description = "Account Lookup",
MessageName = "Account",
EnableSession = false)]
public string Account(
string PostCode,
string Surname)
..并且从该方法中,我对处理“输出”参数的私有方法进行了更深入的调用。然后,WebMethod将这些参数转换为JSON字符串并返回。这个(相当丑陋的方法)一直有效,直到我想返回一个数据数组,然后直接回到原始错误。
...下一步(由于无法找到有效的解决方案)将尝试与XML响应相同。
最佳答案
envelope.getResponse()
调用可能返回SoapPrimitive
的集合。
尝试类似
Vector responseVector = (Vector) envelope.getResponse();
for (Vector res : responseVector) {
SoapPrimitive soapPrimitive = (SoapPrimitive) res;
// your code here using soapPrimitives
}
如果元素的类型仍然不同于
SoapPrimitive
,则将有一个新的Exception
,您可以进行相应的转换。