2013-11-19 3 views
4

Я могу написать свой http-запрос по соединению, сделанному на сервере, но я не могу прочитать ответ с сервера (не уверен, есть ли какой-либо ответ или нет). Как я могу проверить его, а затем прочитать? Мой сервер возвращает JSON в ответ ..не удалось прочитать ответ в http-клиенте, используя netty

код

Клиент:

public class NettyClient { 



     public static void main(String[] args) throws Exception { 
      URI uri = new URI("http://myurl.com/v1/v2?param1=value1");   
      String scheme = uri.getScheme() == null? "http" : uri.getScheme(); 
      String host = uri.getHost(); 
      int port = 443; 

      boolean ssl = "https".equalsIgnoreCase(scheme); 

     // Configure the client. 
      EventLoopGroup group = new NioEventLoopGroup(); 
      try { 
       Bootstrap b = new Bootstrap(); 
       b.group(group) 
       .channel(NioSocketChannel.class) 
       .handler(new NettyClientInitializer(false)); 
       // Make the connection attempt. 
       Channel ch = b.connect(host, port).sync().channel(); 
       // Prepare the HTTP request. 
       HttpRequest request = new DefaultHttpRequest(
         HttpVersion.HTTP_1_1, HttpMethod.GET, "http://myurl.com/v1/v2?param1=value1"); 
       request.headers().set(HttpHeaders.Names.HOST, host); 
       request.headers().set(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.KEEP_ALIVE);    
       //request.headers().set(HttpHeaders.Names.ACCEPT_ENCODING, HttpHeaders.Values.GZIP); 

       // Send the HTTP request. 
       ch.writeAndFlush(request); 

       // Wait for the server to close the connection. 
       ch.closeFuture().sync(); 
      } finally { 
       // Shut down executor threads to exit. 
       group.shutdownGracefully(); 
      } 
     } 
} 

Initializer код:

public class NettyClientInitializer extends ChannelInitializer<SocketChannel> { 

    private final boolean ssl; 

    public NettyClientInitializer(boolean ssl) { 
     this.ssl = ssl; 
    } 

    @Override 
    public void initChannel(SocketChannel ch) throws Exception { 
     // Create a default pipeline implementation. 
     ChannelPipeline p = ch.pipeline(); 

     p.addLast("log", new LoggingHandler(LogLevel.INFO)); 
     // Enable HTTPS if necessary. 
     /* 
     if (ssl) { 
      SSLEngine engine = 
       SecureChatSslContextFactory.getClientContext().createSSLEngine(); 
      engine.setUseClientMode(true); 

      p.addLast("ssl", new SslHandler(engine)); 
     } 
*/ 
     p.addLast("codec", new HttpClientCodec()); 

     // Remove the following line if you don't want automatic content decompression. 
     // p.addLast("inflater", new HttpContentDecompressor()); 

     // Uncomment the following line if you don't want to handle HttpChunks. 
     //p.addLast("aggregator", new HttpObjectAggregator(1048576)); 
     p.addLast("handler", new NettyClientHandler()); 
    } 
} 

Handler Код:

public class NettyClientHandler extends SimpleChannelInboundHandler<HttpObject> { 

    @Override 
    public void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception { 
     if (msg instanceof HttpResponse) { 
      HttpResponse response = (HttpResponse) msg; 

      System.out.println("STATUS: " + response.getStatus()); 
      System.out.println("VERSION: " + response.getProtocolVersion()); 
      System.out.println(); 

      if (!response.headers().isEmpty()) { 
       for (String name: response.headers().names()) { 
        for (String value: response.headers().getAll(name)) { 
         System.out.println("HEADER: " + name + " = " + value); 
        } 
       } 
       System.out.println(); 
      } 

      if (HttpHeaders.isTransferEncodingChunked(response)) { 
       System.out.println("CHUNKED CONTENT {"); 
      } else { 
       System.out.println("CONTENT {"); 
      } 
     } 
     if (msg instanceof HttpContent) { 
      HttpContent content = (HttpContent) msg; 

      System.out.print(content.content().toString(CharsetUtil.UTF_8)); 
      System.out.flush(); 

      if (content instanceof LastHttpContent) { 
       System.out.println("} END OF CONTENT"); 
      } 
     } 
    } 

    @Override 
    public void exceptionCaught(
      ChannelHandlerContext ctx, Throwable cause) throws Exception { 
     cause.printStackTrace(); 
     ctx.close(); 
    } 


} 

В консоли можно увидеть запрос записывается, но после этого запрос очищается, канал затем неактивен, а затем незарегистрирован ,

Возможно, причина в том, что мои параметры запроса не отправляются или проблема json, или я что-то пропускаю в своем коде?

ответ

1

Проблема, вероятно, заключается в том, вы подключаетесь к серверу на порт 443

int port = 443; 
... 
Channel ch = b.connect(host, port).sync().channel(); 

Но ваш NettyClientInitializer не поддерживает SSL (это закомментировано трубопровод), и вы построить его, как если бы SSL не используется в любом случае

new NettyClientInitializer(false) 

Ваш код работает отлично, если вы измените порт на 80.

+0

теперь он дает мне 302 код состояния, то есть «Временно перемещено» .. пожалуйста, скажите мне, как это то, что обрабатывается я n netty? –

+0

Это 302 действительный HTTP-ответ, который вам удалось прочитать с помощью вашего netty-клиента. Почему ваш сервер возвращает 302, я не могу вам сказать, но проблема не в Netty. Вы должны решить (в своем NettyClientHandler), как иметь дело с 302. Если вы хотите еще проверить, вы можете использовать curl -v, чтобы попытаться использовать тот же URL-адрес из командной строки, и вы увидите возвращается 302. Это может быть не так очевидно при тестировании в браузере, потому что оно автоматически будет следовать за перенаправлением. –

+0

не могли бы вы рассказать мне в том же коде, как я могу закрыть соединение сразу, как только получу полный ответ? потому что сейчас требуется около 15 минут, чтобы полностью закрыть соединение, которое очень велико по моему требованию. –

Смежные вопросы