HttpClient提供URIBuilder工具类来简化URIs的创建和修改过程。
1. URI uri = new URIBuilder()
2.        .setScheme("http")
3.        .setHost("le")
4.        .setPath("/search")
5.        .setParameter("q", "httpclient")
6.        .setParameter("btnG", "Google Search")
7.        .setParameter("aq", "f")
8.        .setParameter("oq", "")
9.        .build();
10. HttpGet httpget = new HttpGet(uri);
11. System.out.URI());
上述代码会在控制台输出:
1. le/search?q=httpclient&btnG=Google+Search&aq=f&oq=
1.1.
2. HTTP响应
服务器收到客户端的http请求后,就会对其进行解析,然后把响应发给客户端,这个响应就是HTTP response.HTTP响应第一行是协议版本,之后是数字状态码和相关联的文本段。
1. HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,
2. HttpStatus.SC_OK, "OK");
3.
4. System.out.ProtocolVersion());
5. System.out.StatusLine().getStatusCode());
6. System.out.StatusLine().getReasonPhrase());
7. System.out.StatusLine().toString());
上述代码会在控制台输出:
1. HTTP/1.1
2. 200
3. OK
4. HTTP/1.1 200 OK
1.1.3. 消息
一个Http消息可以包含一系列的消息头,用来对http消息进行描述,比如消息长度,消息类型等等。HttpClient提供了方法来获取、添加、移除、枚举消息头。
1. HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,
2.    HttpStatus.SC_OK, "OK");
3. response.addHeader("Set-Cookie",
4. "c1=a; path=/; domain=localhost");
5. response.addHeader("Set-Cookie",
6. "c2=b; path=\"/\", c3=c; domain=\"localhost\"");
7. Header h1 = FirstHeader("Set-Cookie");
8. System.out.println(h1);
9. Header h2 = LastHeader("Set-Cookie");
10. System.out.println(h2);
11. Header[] hs = Headers("Set-Cookie");
12. System.out.println(hs.length);
上述代码会在控制台输出:
1. Set-Cookie: c1=a; path=/; domain=localhost
2. Set-Cookie: c2=b; path="/", c3=c; domain="localhost"
3.    2
最有效的获取指定类型的消息头的方法还是使用HeaderIterator接口。
1. HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,
2.    HttpStatus.SC_OK, "OK");
3. response.addHeader("Set-Cookie",
4. "c1=a; path=/; domain=localhost");
5. response.addHeader("Set-Cookie",
6. "c2=b; path=\"/\", c3=c; domain=\"localhost\"");
7.
8. HeaderIterator it = response.headerIterator("Set-Cookie");
9.
10. while (it.hasNext()) {
11.    System.out.());
12. }
上述代码会在控制台输出:
1. Set-Cookie: c1=a; path=/; domain=localhost
2. Set-Cookie: c2=b; path="/", c3=c; domain="localhost" HeaderIterator也提供非常便捷的方式,将Http消息解析成单独的消息头元素。
1. HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,
2.    HttpStatus.SC_OK, "OK");
3. response.addHeader("Set-Cookie",
4. "c1=a; path=/; domain=localhost");pdf转html
5. response.addHeader("Set-Cookie",
者text/html,HttpEntity类的getContentEncoding()方法就是读取这个编码的。如果头信息不存在,getContentLength()会返回-1,getContentType()会返回NULL。如果Content-Type信息存在,就会返回一个Header类。
当为发送消息创建Http实体时,需要同时附加meta信息。
1. StringEntity myEntity = new StringEntity("important message",
2.    ate("text/plain", "UTF-8"));
3.
4. System.out.ContentType());
5. System.out.ContentLength());
6. System.out.String(myEntity));
7. System.out.ByteArray(myEntity).length);
上述代码会在控制台输出:
1. Content-Type: text/plain; charset=utf-8
2. 17
3. important message
4. 17
1.1.5. 确保底层的资源连接被释放
为了确保系统资源被正确地释放,我们要么管理Http实体的内容流、要么关闭Http响应。
1. CloseableHttpClient httpclient = ateDefault();
2. HttpGet httpget = new HttpGet("localhost/");
3. CloseableHttpResponse response = ute(httpget);
4. try {
5.    HttpEntity entity = Entity();
6. if (entity != null) {
7.        InputStream instream = Content();
8. try {
9. // do something useful
10.        } finally {
11.            instream.close();
12.        }
13.    }
14. } finally {
15.    response.close();
16. }
关闭Http实体内容流和关闭Http响应的区别在于,前者通过消耗掉Http实体内容来保持相关的http连接,然后后者会立即关闭、丢
弃http连接。
请注意HttpEntity的writeTo(OutputStream)方法,当Http实体被写入到OutputStream后,也要确保释放系统资源。如果这个方法内调用了HttpEntity的getContent()方法,那么它会有一个java.io.InpputStream的实例,我们需要在finally中关闭这个流。