2012-03-27 2 views
4

정말 중요한 문제에 봉착했습니다. HttpRequest에서 POST까지 Netty를 사용하는 서버에 약간의 JSON을 사용합니다. 채널이 연결되면Netty를 사용하는 서버에 POST JSON을 수행 할 수 없음

는 I 요청 같이 제조 :

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를 사용하여 파이썬에서 작성한 매우 간단한 에코 서버가 요청을 표시하지만 본문을 JSON으로 올바르게 구문 분석 할 수없는 것처럼 body 또는 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(...)); 

경우 MyUpstreamHandlerSimpleChannelUpstreamHandler으로 확장되며 채널이 연결된 후 HttpRequest을 보내려고합니다.

다시 말하지만, 나는 완전히 손실되었습니다. 어떤 도움이라도 대단히 감사하겠습니다.

답변

3

http를 활성 상태로 유지했는지 여부는 확실하지 않지만 그렇게 할 경우 헤더에 콘텐츠 길이를 보내야 할 수 있습니다.

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