netty4 HTTPclient 可添加参数

下了netty4的demo,但是发现给例子不能添加参数。所以自己改了一下,用netty实现http协议get请求并追加参数。

HttpSnoopClient.java
 1 import io.netty.bootstrap.Bootstrap;
 2 import io.netty.channel.Channel;
 3 import io.netty.channel.EventLoopGroup;
 4 import io.netty.channel.nio.NioEventLoopGroup;
 5 import io.netty.channel.socket.nio.NioSocketChannel;
 6 import io.netty.handler.codec.http.ClientCookieEncoder;
 7 import io.netty.handler.codec.http.DefaultCookie;
 8 import io.netty.handler.codec.http.DefaultFullHttpRequest;
 9 import io.netty.handler.codec.http.HttpHeaders;
10 import io.netty.handler.codec.http.HttpMethod;
11 import io.netty.handler.codec.http.HttpRequest;
12 import io.netty.handler.codec.http.HttpVersion;
13 import io.netty.handler.ssl.SslContext;
14 import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
15 import java.net.URI;
16 
17 /**
18  * A simple HTTP client that prints out the content of the HTTP response to
19  * {@link System#out} to test {@link HttpSnoopServer}.
20  */
21 public final class HttpSnoopClient {
22 
23     static final String URL = System.getProperty("url", "http://www.baidu.com/s");
24     static final String PARAM = "?wd=罗龙龙";
25 
26     public static void main(String[] args) throws Exception {
27         URI uri = new URI(URL);
28         String scheme = uri.getScheme() == null? "http" : uri.getScheme();
29         String host = uri.getHost() == null? "127.0.0.1" : uri.getHost();
30         int port = uri.getPort();
31         if (port == -1) {
32             if ("http".equalsIgnoreCase(scheme)) {
33                 port = 80;
34             } else if ("https".equalsIgnoreCase(scheme)) {
35                 port = 443;
36             }
37         }
38 
39         if (!"http".equalsIgnoreCase(scheme) && !"https".equalsIgnoreCase(scheme)) {
40             System.err.println("Only HTTP(S) is supported.");
41             return;
42         }
43 
44         // Configure SSL context if necessary.
45         final boolean ssl = "https".equalsIgnoreCase(scheme);
46         final SslContext sslCtx;
47         if (ssl) {
48             sslCtx = SslContext.newClientContext(InsecureTrustManagerFactory.INSTANCE);
49         } else {
50             sslCtx = null;
51         }
52 
53         // Configure the client.
54         EventLoopGroup group = new NioEventLoopGroup();
55         try {
56             Bootstrap b = new Bootstrap();
57             b.group(group)
58              .channel(NioSocketChannel.class)
59              .handler(new HttpSnoopClientInitializer(sslCtx));
60 
61             // Make the connection attempt.
62             Channel ch = b.connect(host, port).sync().channel();
63             System.out.println("*************"+uri.getRawQuery()+"*************");
64             // Prepare the HTTP request.
65             HttpRequest request = new DefaultFullHttpRequest(
66                     HttpVersion.HTTP_1_1, HttpMethod.GET, uri.getRawPath()+PARAM);
67             request.headers().set(HttpHeaders.Names.HOST, host);
68             request.headers().set(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.CLOSE);
69             request.headers().set(HttpHeaders.Names.ACCEPT_ENCODING, HttpHeaders.Values.GZIP);
70 
71             // Set some example cookies.
72             request.headers().set(
73                     HttpHeaders.Names.COOKIE,
74                     ClientCookieEncoder.encode(
75                             new DefaultCookie("my-cookie", "foo"),
76                             new DefaultCookie("another-cookie", "bar")));
77 
78             // Send the HTTP request.
79             ch.writeAndFlush(request);
80 
81             // Wait for the server to close the connection.
82             ch.closeFuture().sync();
83         } finally {
84             // Shut down executor threads to exit.
85             group.shutdownGracefully();
86         }
87     }
88 }
HttpSnoopClientHandler.java
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.HttpContent;
import io.netty.handler.codec.http.HttpHeaders;
import io.netty.handler.codec.http.HttpObject;
import io.netty.handler.codec.http.HttpResponse;
import io.netty.handler.codec.http.LastHttpContent;
import io.netty.util.CharsetUtil;

public class HttpSnoopClientHandler extends SimpleChannelInboundHandler<HttpObject> {

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

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

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

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

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

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

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

HttpSnoopClientInitializer.java

 1 import io.netty.channel.ChannelInitializer;
 2 import io.netty.channel.ChannelPipeline;
 3 import io.netty.channel.socket.SocketChannel;
 4 import io.netty.handler.codec.http.HttpClientCodec;
 5 import io.netty.handler.codec.http.HttpContentDecompressor;
 6 import io.netty.handler.ssl.SslContext;
 7 
 8 public class HttpSnoopClientInitializer extends ChannelInitializer<SocketChannel> {
 9 
10     private final SslContext sslCtx;
11 
12     public HttpSnoopClientInitializer(SslContext sslCtx) {
13         this.sslCtx = sslCtx;
14     }
15 
16     @Override
17     public void initChannel(SocketChannel ch) {
18         ChannelPipeline p = ch.pipeline();
19 
20         // Enable HTTPS if necessary.
21         if (sslCtx != null) {
22             p.addLast(sslCtx.newHandler(ch.alloc()));
23         }
24 
25         p.addLast(new HttpClientCodec());
26 
27         // Remove the following line if you don‘t want automatic content decompression.
28         p.addLast(new HttpContentDecompressor());
29 
30         // Uncomment the following line if you don‘t want to handle HttpContents.
31         //p.addLast(new HttpObjectAggregator(1048576));
32 
33         p.addLast(new HttpSnoopClientHandler());
34     }
35 }

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。