2

私はブラックベリーアプリケーションに取り組んでいます。SOAP Web サービスを呼び出す必要がありますが、それができず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 を取得しています。コードを見て、修正するのを手伝ってください。前もって感謝します

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()スローしIOException、結果を残しnullます。

汎用 J2ME クライアント用に作成されたライブラリである ksoap2 を使用しています。ただし、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);
}

urlこのクラスに渡された に接続パラメーターをアタッチする代わりに、必要なネットワーク トランスポートをサポートするようにカスタマイズされた ConnectionFactory から接続を取得するようにクラスを変更できます。

これを行うと、新しいバージョンの ksoap2 を使用するようにコードを更新する場合は、これらの変更を再度行う必要があります。ただし、BlackBerry Java の将来を考えると、それは合理的な妥協のように思えます。

于 2013-11-06T10:43:21.980 に答える