6

カスタム ポートで JSON オブジェクトをサーバーに送信しようとしています。ただし、サーバーからの応答はありません。エラーは文字列エンティティにある可能性があると思いますが、それが何であるかわかりません。

私はこれらの他の問題を見てきました:

Java で JSON を使用した HTTP POST

JSONをJavaサーバーに投稿する

ライブラリを使用せずにJavaで正しいエンティティを使用してhttpポストリクエストを作成するにはどうすればよいですか?

AndroidのデータをJSON形式でサーバーにPOSTする方法は?

それらのどれも私の問題を解決していません。「Java で JSON を使用した HTTP POST」の解決策 (16 票) を試していますが、うまくいきません。

これが私のコードです:

public void reset() {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        try {
            System.out.println("Start");
            jsonURL = "http://x.x.x.x:3994";
            HttpPost request = new HttpPost(jsonURL);
            StringEntity params = new StringEntity("{\"id\":1,\"method\":\"object.deleteAll\",\"params\":[\"subscriber\"]}");
            request.addHeader("Content-Type", "application/json");
            request.setEntity(params);
            HttpResponse response = httpClient.execute(request);
            System.out.println("End");
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            httpClient.getConnectionManager().shutdown();
        }
    }

コンソールは開始時に「開始」を出力しますが、「終了」からの出力も例外からのスタックトレースも取得しません。デバッグ中、デバッガーは " httpClient.execute(request)" 行で停止し、続行しません。

端末からこのコマンドを実行すると:

echo '{"id":1, "method":"object.deleteAll", "params":["subscriber"]} ' | nc x.x.x.x 3994

すべてが適切に実行され、リクエストがサーバーによって受信されます。

私の問題はおそらくにあると思いますが、StringEntityよくわかりません。

編集:

Wireshark を使用して、サーバーに送信されるこのパケットをキャプチャできました。

POST / HTTP/1.1 Content-Type: application/json Content-Length: 60
Host: x.x.x.x:3994 Connection: Keep-Alive User-Agent:
Apache-HttpClient/4.2.1 (java 1.5)

{"id":1,"method":"object.deleteAll","params":["subscriber"]}

そして、サーバーから戻ってくるこのパケット:

{"id":null,"error":{"code":-32700,"message":"Unexpected character ('P' (code 80)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')"}}
{"id":null,"error":{"code":-32700,"message":"Unexpected character ('c' (code 99)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')"}}
{"id":null,"error":{"code":-32700,"message":"Unexpected character ('C' (code 67)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')"}}
{"id":null,"error":{"code":-32700,"message":"Unexpected character ('C' (code 67)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')"}}
{"id":null,"error":{"code":-32700,"message":"Unexpected character ('H' (code 72)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')"}}
{"id":null,"error":{"code":-32700,"message":"Unexpected character ('C' (code 67)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')"}}
{"id":null,"error":{"code":-32700,"message":"Unexpected character ('U' (code 85)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')"}}
{"id":null,"error":{"code":-32700,"message":"Line must contain a JSON object"}}
4

1 に答える 1

4

実際の例では、nc を使用しています。これは、HTTP を使用せずに、TCP に直接書き込んでいることを意味します。正しいですか?

したがって、HTTPClient を使用した HTTP 呼び出しは、予期しないデータを送信しています。エラーは、HTTP ラッパーが問題であることを示しています。

「POST」のような予期しない文字「P」、「Content-Type」のような「C」など。サーバーは各行を読み取り、生の JSON 文字列を期待していますが、代わりに HTTP を取得しています。

解決策: 代わりに生のJava ソケットを使用することをお勧めします。

于 2013-02-08T15:06:08.357 に答える