実際には基本的な問題に悩まされています。HttpRequest
〜POST
をNettyを使用するサーバーに使用しています。Nettyを使用してサーバーにJSONをPOSTできない
チャネルが接続されると、私はこのような要求を準備:
HttpRequest request = new DefaultHttpRequest(
HttpVersion.HTTP_1_1, HttpMethod.POST, postPath);
request.setHeader(HttpHeaders.Names.CONTENT_TYPE, "application/json");
String json = "{\"foo\":\"bar\"}";
ChannelBuffer buffer = ChannelBuffers.copiedBuffer(json, CharsetUtil.UTF_8);
request.setContent(buffer);
channel.write(request);
System.out.println("sending on channel: " + json);
最後の行は整形JSONである、{"foo":"bar"}
をプリントアウトします。
しかし、Flaskを使用してPythonで書いた本当に単純なエコーサーバはリクエストを表示しますが、本体が正しくJSONに解析されなかったようにbody
またはjson
フィールドはありません。
私は単に、その後、エコーサーバーが正しくJSONを見つけて解析しない、同じデータを送信するためにcurl
を使用します。
return Channels.pipeline(
new HttpClientCodec(),
new MyUpstreamHandler(...));
:ネッティーで
curl --header "Content-Type: application/json" -d '{"foo":"bar"}' -X POST http://localhost:5000/post_path
私のパイプラインを用いて形成されますMyUpstreamHandler
はSimpleChannelUpstreamHandler
を拡張し、チャネルの接続後にHttpRequest
を送信しようとします。
もう一度、私は完全に失っています。どんな助けでも大歓迎です。
これは確かに問題でした。 'request.setHeader(HttpHeaders.Names.CONTENT_LENGTH、String.valueOf(buffer.getByteArray()。length));' しかし、バッファの 'byte []'は、バッファからコピーされた 'json'から派生したものではありません。そして、それを振り返ると、「13」の代わりに「53」が返されていました。 ここでは、 'setHeader'の呼び出しを省略しました。Nettyが単に' request.setContent'に渡されたパラメータに基づいてそれを追加することを期待していました。 Jestanが指摘したように、私は 'buffer.readableBytes()'を使わなければなりません。 – shadowmatter