无法使用Netty将JSON POST到服务器

时间:2012-03-27 21:54:16

标签: json post netty channel

我遇到了一个非常非常基本的问题:使用HttpRequest POST使用Netty为服务器添加一点JSON。

连接频道后,我会像这样准备请求:

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);

最后一行打印出{"foo":"bar"},这是格式良好的JSON。

但是,我使用Flask在Python中编写的一个非常简单的echo服务器显示了请求,但它没有bodyjson字段,就像正文无法正确解析为JSON一样。 / p>

当我只使用curl发送相同的数据时,echo服务器会正​​确地找到并解析JSON:

curl --header "Content-Type: application/json" -d '{"foo":"bar"}' -X POST http://localhost:5000/post_path

我在Netty的管道形成于:

return Channels.pipeline(
    new HttpClientCodec(),
    new MyUpstreamHandler(...));

MyUpstreamHandler扩展SimpleChannelUpstreamHandler的位置,以及在频道连接后尝试发送HttpRequest的内容。

同样,我完全失去了。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:7)

正如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);

答案 1 :(得分:3)

不确定您是否保持http保持活动,但如果您这样做,则可能必须在标题中发送内容长度。