【问题标题】:How to consume SOAP Webservices in Blackberry如何在 Blackberry 中使用 SOAP Web 服务
【发布时间】:2013-11-05 15:43:50
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    实际上问题是不是将 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));
    

    还有this link helped me。

    在问这个问题之前,我还遇到了模拟器无法识别库的问题。它显示类似“没有库 Ksoap2_j2me.jar”之类的错误消息 - 已解决 from this link。

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      我认为你有几个选择:

      1。连接后缀字符串

      您可以尝试根据应用运行时的条件动态选择正确的后缀字符串。例如,这可以允许设备通过 Wi-Fi 连接(如果可用)或通过 BES(如果可用)连接。刚接触 BlackBerry 的开发人员可能会惊讶于应用程序代码需要担心这一点(阅读 here for more 或 watch 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,而不是将连接参数附加到传递给此类的the connection from a ConnectionFactory,以支持您想要的网络传输。

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

      【讨论】:

      • 感谢您的回答,但我已经解决了这个问题。您的回答对此非常有用 +1。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      • 2017-10-15
      • 2012-04-20
      • 1970-01-01
      相关资源
      最近更新 更多