2012-03-27 20 views
4

実際には基本的な問題に悩まされています。HttpRequestPOSTを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 

私のパイプラインを用いて形成されますMyUpstreamHandlerSimpleChannelUpstreamHandlerを拡張し、チャネルの接続後にHttpRequestを送信しようとします。

もう一度、私は完全に失っています。どんな助けでも大歓迎です。

答えて

3

http keep aliveを有効にしているかどうかわからない場合は、ヘッダーにコンテンツの長さを送信する必要があります。

+1

これは確かに問題でした。 'request.setHeader(HttpHeaders.Names.CONTENT_LENGTH、String.valueOf(buffer.getByteArray()。length));' しかし、バッファの 'byte []'は、バッファからコピーされた 'json'から派生したものではありません。そして、それを振り返ると、「13」の代わりに「53」が返されていました。 ここでは、 'setHeader'の呼び出しを省略しました。Nettyが単に' request.setContent'に渡されたパラメータに基づいてそれを追加することを期待していました。 Jestanが指摘したように、私は 'buffer.readableBytes()'を使わなければなりません。 – shadowmatter

8

Veebsによると、いくつかのhttpヘッダーを設定する必要があります。私も同じ問題を抱え、何時間も失ってしまいました。

import static org.jboss.netty.handler.codec.http.HttpHeaders.Names.*; 

    ...... 

    HttpRequest httpRequest = new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, "/post_path"); 

    final ChannelBuffer content = ChannelBuffers.copiedBuffer(jsonMessage, CharsetUtil.UTF_8); 

    httpRequest.setHeader(CONTENT_TYPE, "application/json"); 
    httpRequest.setHeader(ACCEPT, "application/json"); 

    httpRequest.setHeader(USER_AGENT, "Netty 3.2.3.Final"); 
    httpRequest.setHeader(HOST, "localhost:5000"); 

    httpRequest.setHeader(CONNECTION, "keep-alive"); 
    httpRequest.setHeader(CONTENT_LENGTH, String.valueOf(content.readableBytes())); 

    httpRequest.setContent(content); 

    channel.write(httpRequest); 
関連する問題