没有合适的资源?快使用搜索试试~ 我知道了~
HttpClient 4.3教程.pdf
需积分: 0 0 下载量 53 浏览量
2017-09-20
16:44:53
上传
评论 1
收藏 475KB PDF 举报
温馨提示
试读
51页
Http协议应该是互联网中最重要的协议。持续增长的 web服务、可联网的家用电器等都在继承并拓 展着 Http 协议,向着浏览器之外的方向发展。 虽然 jdk中的 java.net 包中提供了一些基本的方法,通过 http 协议来访问网络资源,但是大多数场 景下,它都不够灵活和强大。HttpClient 致力于填补这个空白,它可以提供有效的、最新的、功能丰 富的包来实现 http 客户端。
资源详情
资源评论
资源推荐
转自:
http://www.yeetrack.com/?p=779
前言
Http 协议应该是互联网中最重要的协议。持续增长的 web 服务、可联网的家用电器等都在继承并拓
展着 Http 协议,向着浏览器之外的方向发展。
虽然 jdk 中的 java.net 包中提供了一些基本的方法,通过 http 协议来访问网络资源,但是大多数场
景下,它都不够灵活和强大。HttpClient 致力于填补这个空白,它可以提供有效的、最新的、功能丰
富的包来实现 http 客户端。
为了拓展,HttpClient 即支持基本的 http 协议,还支持 http-aware 客户端程序,如 web 浏览器,
Webservice 客户端,以及利用 or 拓展 http 协议的分布式系统。
1、HttpClient 的范围/特性
是一个基于 HttpCore 的客户端 Http 传输类库
基于传统的(阻塞)IO
内容无关
2、HttpClient 不能做的事情
HttpClient 不是浏览器,它是一个客户端 http 协议传输类库。HttpClient 被用来发送和接受
Http 消息。HttpClient 不会处理 http 消息的内容,不会进行 javascript 解析,不会关心
content type,如果没有明确设置,httpclient 也不会对请求进行格式化、重定向 url,或者
其他任何和 http 消息传输相关的功能。
第一章 基本概念
1.1. 请求执行
HttpClient 最基本的功能就是执行 Http 方法。一个 Http 方法的执行涉及到一个或者多个 Http 请求
/Http 响应的交互,通常这个过程都会自动被 HttpClient 处理,对用户透明。用户只需要提供 Http 请
求对象,HttpClient 就会将 http 请求发送给目标服务器,并且接收服务器的响应,如果 http 请求执
行不成功,httpclient 就会抛出异样。
下面是个很简单的 http 请求执行的例子:
1. CloseableHttpClient httpclient = HttpClients.createDefault();
2. HttpGet httpget = new HttpGet("http://localhost/");
3. CloseableHttpResponse response = httpclient.execute(httpget);
4. try {
5. <...>
6. } finally {
7. response.close();
8. }
1.1.1. HTTP 请求
所有的 Http 请求都有一个请求行(request line),包括方法名、请求的 URI 和 Http 版本号。
HttpClient 支持 HTTP/1.1 这个版本定义的所有 Http 方法:GET,HEAD,POST,PUT,DELETE,TRACE 和
OPTIONS。对于每一种 http 方法,HttpClient 都定义了一个相应的类:
HttpGet, HttpHead, HttpPost, HttpPut, HttpDelete, HttpTrace 和 HttpOpquertions。
Request-URI 即统一资源定位符,用来标明 Http 请求中的资源。Http request URIs 包含协议名、主
机名、主机端口(可选)、资源路径、query(可选)和片段信息(可选)。
1. HttpGet httpget = new HttpGet(
2. "http://www.google.com/search?hl=en&q=httpclient&btnG=Google+Search&aq=
f&oq=");
HttpClient 提供 URIBuilder 工具类来简化 URIs 的创建和修改过程。
1. URI uri = new URIBuilder()
2. .setScheme("http")
3. .setHost("www.google.com")
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.println(httpget.getURI());
上述代码会在控制台输出:
1. http://www.google.com/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.println(response.getProtocolVersion());
5. System.out.println(response.getStatusLine().getStatusCode());
6. System.out.println(response.getStatusLine().getReasonPhrase());
7. System.out.println(response.getStatusLine().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 = response.getFirstHeader("Set-Cookie");
8. System.out.println(h1);
9. Header h2 = response.getLastHeader("Set-Cookie");
10. System.out.println(h2);
11. Header[] hs = response.getHeaders("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.println(it.next());
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");
5. response.addHeader("Set-Cookie",
6. "c2=b; path=\"/\", c3=c; domain=\"localhost\"");
7.
8. HeaderElementIterator it = new BasicHeaderElementIterator(
9. response.headerIterator("Set-Cookie"));
10.
11. while (it.hasNext()) {
12. HeaderElement elem = it.nextElement();
13. System.out.println(elem.getName() + " = " + elem.getValue());
14. NameValuePair[] params = elem.getParameters();
15. for (int i = 0; i < params.length; i++) {
16. System.out.println(" " + params[i]);
17. }
18. }
上述代码会在控制台输出:
1. c1 = a
2. path=/
3. domain=localhost
4. c2 = b
5. path=/
6. c3 = c
7. domain=localhost
1.1.4. HTTP 实体
Http 消息可以携带 http 实体,这个 http 实体既可以是 http 请求,也可以是 http 响应的。Http 实
体,可以在某些 http 请求或者响应中发现,但不是必须的。Http 规范中定义了两种包含请求的方
法:POST 和 PUT。HTTP 响应一般会包含一个内容实体。当然这条规则也有异常情况,如 Head 方
法的响应,204 没有内容,304 没有修改或者 205 内容资源重置。
HttpClient 根据来源的不同,划分了三种不同的 Http 实体内容。
streamed 流式: 内容是通过流来接受或者在运行中产生。特别是,streamed 这一类包含
从 http 响应中获取的实体内容。一般说来,streamed 实体是不可重复的。
self-contained 自我包含式:内容在内存中或通过独立的连接或其它实体中获得。self-
contained 类型的实体内容通常是可重复的。这种类型的实体通常用于关闭 http 请求。
剩余50页未读,继续阅读
刘彦青-Yannis
- 粉丝: 1w+
- 资源: 30
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0