2

我正在开发一个黑莓应用程序。我需要调用soap webservices,但我无法这样做,并且得到null了回应。以下是我的代码:

private static final String CONNECTION_PARAMS = ";deviceside=true";

SoapObject request = new SoapObject("http://service.action.com/", 
                                    "findActiveSecurities");            

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut = request;         
HttpTransportBasicAuth ht = 
     new HttpTransportBasicAuth("http://myurl.com/ebclient/services/MobileClientService?wsdl"+CONNECTION_PARAMS, 
                                "myusername", 
                                "mypassword");

PropertyInfo propInfo=new PropertyInfo();
propInfo.type=PropertyInfo.INTEGER_CLASS;

//adding parameters
request.addProperty("arg0","NSE");
request.addProperty("arg1","0");
request.addProperty("arg2","100");


envelope.setOutputSoapObject(request);

try {
    ht.call(SOAP_ACTION, envelope);
    result = (SoapObject)envelope.getResponse();
    System.out.println(result);
} catch (IOException e) {
    e.printStackTrace();
} catch (XmlPullParserException e) {
    e.printStackTrace();
}

结果我得到了空值。请查看代码并帮助我更正它。提前致谢

4

2 回答 2

2

实际上问题不是将 0 和 100 作为字符串传递...

request.addProperty("arg0","NSE");
request.addProperty("arg1","0");
request.addProperty("arg2","100");

我用

request.addProperty("arg0","NSE");
request.addProperty("arg1",new Integer(0));
request.addProperty("arg2",new Integer(1000));

这个链接也帮助了我。

同样在问这个问题之前,我遇到了一些模拟器无法识别库的问题。它显示错误消息,例如“没有库 Ksoap2_j2me.jar” -从此链接解决。

抱歉英语不好,但我认为这可以节省其他开发人员的时间。

于 2013-11-06T14:20:15.940 回答
1

从您发布的内容很难判断,但我的猜测是您遇到了某种网络问题。我猜你初始化了result = null;,然后你调用ht.call()throws IOException,留下 result null

您正在使用 ksoap2,它是为通用 J2ME 客户端编写的库。但是,BlackBerry 网络的工作方式与所有其他 J2ME 平台不同。

您正在使用硬编码的连接参数字符串控制 BlackBerry 网络传输:

private static final String CONNECTION_PARAMS = ";deviceside=true";

不幸的是,此字符串后缀可能不适用于所有网络条件(或任何,如果您没有正确的设备 APN 设置)。

我认为你有几个选择:

1.连接后缀字符串

您可以尝试根据应用运行时的条件动态选择正确的后缀字符串。例如,这可以允许设备通过 Wi-Fi 连接(如果可用)或通过 BES(如果可用)连接。刚接触 BlackBerry 的开发人员可能会对应用程序代码需要担心这一点感到惊讶(阅读此处了解更多信息,或观看此内容)。

如果您想简单地替换CONNECTION_PARAMS为动态字符串,您可以在此处查看实现

2.连接工厂

在 OS 5.0 中,BlackBerry 添加了ConnectionFactory类,这是对必须组装连接字符串的旧方法的重大改进。如果您只需要支持 OS 5.0 及更高版本,您可能会选择重写代码以使用ConnectionFactory.

由于您可以访问ksoap 源代码,因此您可以更改它。看起来连接代码在ServiceConnectionMidp.java中:

public ServiceConnectionMidp(String url) throws IOException {
    connection = (HttpConnection) Connector.open(url, Connector.READ_WRITE, true);
}

您可以更改类以从 ConnectionFactory 获取连接,而不是将连接参数附加到url传递给此类的连接,该连接经过定制以支持您想要的网络传输。

这样做意味着,如果您想更新代码以使用新版本的 ksoap2,则需要再次进行这些修改。然而,考虑到 BlackBerry Java 的未来,这似乎是一个合理的妥协。

于 2013-11-06T10:43:21.980 回答