如何在Blackberry中使用SOAP Web服务

时间:2013-11-05 15:43:50

标签: web-services soap blackberry java-me ksoap2

我正在开发一个黑莓应用程序。我需要调用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();
}

结果我得到null。请查看代码并帮我纠正它。 提前致谢

2 个答案:

答案 0 :(得分:2)

实际上问题不是将0和100传递为String ...

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));

this link helped me

在问这个问题之前,我还面临着模拟器没有识别出库的问题。它显示错误消息,例如“没有库Ksoap2_j2me.jar” - 已解决from this link

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

答案 1 :(得分:1)

很难说你发布了什么,但我的猜测是你遇到了某种网络问题。我猜你初始化result = null;,然后你的ht.call()号召唤IOException,留下结果null

您正在使用kso​​ap2,它是为通用J2ME客户端编写的库。但是,BlackBerry网络不能像所有其他J2ME平台一样工作。

您正在使用您的连接params字符串控制BlackBerry网络 transport ,该字符串是硬编码的:

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

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

我认为你有几个选择:

1。连接后缀字符串

您可以尝试动态选择正确的后缀字符串,具体取决于您的应用运行时的条件。例如,这可以允许设备通过Wi-Fi连接(如果可用),或者通过BES连接(如果可用)。 BlackBerry新手开发人员可能会对应用程序代码需要担心这一点感到惊讶(阅读here for morewatch this)。

如果您想简单地用动态字符串替换CONNECTION_PARAMS,可以查看implementation here

2。连接工厂

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

由于您可以访问the ksoap source code,因此您可以更改它。看起来连接代码位于ServiceConnectionMidp.java

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

您可以将类更改为the connection from a ConnectionFactory,而不是将连接参数附加到传递给此类的url,而是自定义以支持您想要的网络传输。

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