Не удается отправить JSON на сервер с помощью Netty - PullRequest
4 голосов
/ 28 марта 2012

Я застрял на очень-очень простой проблеме: используя HttpRequest до POST крошечный бит JSON для сервера, использующего Netty.

Как только канал подключен, я готовлю запроскак это:

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.

Однако, действительно простой эхо-сервер, который я написал на Python с использованием Flask, показывает запрос, но у него нет поля body или json, как если бы тело не могло быть правильно проанализировано в JSON.

Когда я просто использую curl для отправки тех же данных, тогда эхо-сервер делаетнайти и проанализировать 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 ]

7 голосов
/ 28 марта 2012

Как сказал Вибс, вам нужно установить несколько 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);
3 голосов
/ 28 марта 2012

Не уверен, что у вас включен http или нет, но если это так, вам, возможно, придется отправить длину содержимого в заголовке.

...