《HttpClient官方文档》1.1 执行请求(一)

1.1. 执行请求

HttpClient最基本的功能就是执行HTTP方法。 一个HTTP方法的执行包含一次或多次HTTP请求与响应,通常由HttpClient的内部处理。
用户提供一个请求对象,HttpClient发送该请求到目标服务器,服务器返回相应的响应对象,如果执行未成功则抛出一个异常。

很自然地,HttpClient的API的主要入口点就是定义了上述协议的HttpClient接口。下面是一个最简单的请求执行过程例子

CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpget = new HttpGet("http://localhost/");
CloseableHttpResponse response = httpclient.execute(httpget);
try {
    <...>
} finally {
    response.close();
}

1.1.1. HTTP 请求

所有HTTP请求都有由方法名,请求URI和HTTP协议版本组成的请求行。

HttpClient支持开箱即用HTTP/1.1规范中定义的所有HTTP方法:GETHEAD,POSTPUTDELETE,TRACE and OPTIONS。它们都有一个特定的类对应这些方法类型: HttpGet,HttpHeadHttpPost,HttpPutHttpDelete,HttpTrace, and HttpOptions.

请求的URI是统一资源定位符,它标识了应用于哪个请求之上的资源。HTTP请求的URI包含协议方案,主机名,可选的端口,资源路径,可选查询和可选片段。

HttpGet httpget = new HttpGet(
     "http://www.google.com/search?hl=en&q=httpclient&btnG=Google+Search&aq=f&oq=");

HttpClient 提供 URIBuilder 实用类来简化请求 URL的创建和修改.

URI uri = new URIBuilder()
        .setScheme("http")
        .setHost("www.google.com")
        .setPath("/search")
        .setParameter("q", "httpclient")
        .setParameter("btnG", "Google Search")
        .setParameter("aq", "f")
        .setParameter("oq", "")
        .build();
HttpGet httpget = new HttpGet(uri);
System.out.println(httpget.getURI());

输出内容为 >

http://www.google.com/search?q=httpclient&btnG=Google+Search&aq=f&oq=

1.1.2. HTTP 响应

HTTP响应是服务器端在接收和解释客户端请求消息后,返回客户端的消息。该消息的第一行包含协议版本以及后面跟着的数字形式的状态代码和相关的文本段。

HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,
HttpStatus.SC_OK, "OK");

System.out.println(response.getProtocolVersion());
System.out.println(response.getStatusLine().getStatusCode());
System.out.println(response.getStatusLine().getReasonPhrase());
System.out.println(response.getStatusLine().toString());

输出内容为 >

HTTP/1.1
200
OK
HTTP/1.1 200 OK

1.1.3. 消息头

HTTP消息可以包含多个描述该消息属性的头部诸如内容长度,内容类型等,HttpClient的提供方法来检索,添加,删除和枚举这些头部。

HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,
    HttpStatus.SC_OK, "OK");
response.addHeader("Set-Cookie",
    "c1=a; path=/; domain=localhost");
response.addHeader("Set-Cookie",
    "c2=b; path=\"/\", c3=c; domain=\"localhost\"");
Header h1 = response.getFirstHeader("Set-Cookie");
System.out.println(h1);
Header h2 = response.getLastHeader("Set-Cookie");
System.out.println(h2);
Header[] hs = response.getHeaders("Set-Cookie");
System.out.println(hs.length);

输出内容为 >

Set-Cookie: c1=a; path=/; domain=localhost
Set-Cookie: c2=b; path="/", c3=c; domain="localhost"
2

获得所有头部给定类型的最有效的方法是使用
HeaderIterator 接口.

HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,
    HttpStatus.SC_OK, "OK");
response.addHeader("Set-Cookie",
    "c1=a; path=/; domain=localhost");
response.addHeader("Set-Cookie",
    "c2=b; path=\"/\", c3=c; domain=\"localhost\"");

HeaderIterator it = response.headerIterator("Set-Cookie");

while (it.hasNext()) {
    System.out.println(it.next());
}

输出内容为 >

Set-Cookie: c1=a; path=/; domain=localhost
Set-Cookie: c2=b; path="/", c3=c; domain="localhost"

它还提供了方便的方法来解析HTTP消息成为独立头部元素。

HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,
    HttpStatus.SC_OK, "OK");
response.addHeader("Set-Cookie",
    "c1=a; path=/; domain=localhost");
response.addHeader("Set-Cookie",
    "c2=b; path=\"/\", c3=c; domain=\"localhost\"");

HeaderElementIterator it = new BasicHeaderElementIterator(
    response.headerIterator("Set-Cookie"));

while (it.hasNext()) {
    HeaderElement elem = it.nextElement();
    System.out.println(elem.getName() + " = " + elem.getValue());
    NameValuePair[] params = elem.getParameters();
    for (int i = 0; i < params.length; i++) {
        System.out.println(" " + params[i]);
    }
}

输出内容为 >

c1 = a
path=/
domain=localhost
c2 = b
path=/
c3 = c
domain=localhost

转载自 并发编程网 - ifeve.com

时间: 2024-11-16 18:26:03

《HttpClient官方文档》1.1 执行请求(一)的相关文章

《HttpClient官方文档》第六章 HTTP 缓存

第六章. HTTP缓存 6.1. 通用概念 HttpClient Cache 提供了用HttpClient(等效浏览器缓存的Java实现)来兼容HTTP / 1.1的缓存层.实现遵循责任链模式,HttpClient缓存的实现类可以替代默认无缓存的HttpClient;完全可以通过缓存实现的请求将不会触发实际的原始请求.在可以的情况下,使用GETs条件If-Modified-Since和/or If-None-Match请求头,会自动验证旧的缓存项.HTTP / 1.1缓存一般被设计成语义透明的,

《HttpClient官方文档》1.2 HttpClient 接口

1.2. HttpClient 接口 HttpClient 接口表示最基本的HTTP请求执行要约.它不会对请求执行过程加上约束或一些特定的信息,并且保留连接管理,状态管理,认证和处理重定向的细节到各自的实现中.这会使它更方便的使用额外功能来装饰接口,如响应内容缓存. 通常来说, HttpClient接口的实现负责处理特定方面的HTTP协议,比如重定向.身份认证处理.对连接的持久性和维持连接存活长短的决策之类的多个处理程序和策略接口实现的门面. 这使得用户能够有选择性的将一些自定义的,基于特定应用

《HttpClient 官方文档》第五章 Fluent API

第五章:流式 API 5.1 易用 API 接口 4.2版本的 HttpClient 带来了一组非常容易使用的流式 API(Fluent API) 接口.暴露的流式API(Fluent API) 接口中仅仅是 HttpClient 最基本的一些功能,这些接口是在不需要使用 HttpClient 丰富的灵活性时,为了一些简单的功能而准备的. 例如:流式接口(Fluent API) 增加了使用者对连接的管理和资源的分配上的便利性.这里有一系列通过 HttpClient 流式接口(Fluent API

《HttpClient官方文档》1.1 执行请求(二)

1.1.4. HTTP 实体 HTTP 消息可以携带与其相关联的请求或响应的内容实体.实体可以在一些请求和响应中找到,因为它们也是可选的.使用了实体的请求被称为封闭实体请求.HTTP规范定义了两种封闭实体的方法: POST 和PUT.响应通常期望包含一个内容实体. 这个规则也有特例,就像HEAD 方法和 204 No Content,304 Not Modified, 205 Reset Content 响应. HttpClient根据其内容来源以此区分三种类型的实体: streamed(流式)

《HttpClient官方文档》1.3 HTTP执行上下文

1.3 HTTP执行上下文 HTTP起初是被设计成一种无状态的.面向请求和响应的协议.然而实际的应用经常需要在请求-响应切换过程中保存状态信息.为了使应用能够维持处理状态,HttpClient允许HTTP请求可以在一个特殊的上下文环境(HttpContext)中执行.如果一个context在连续的HTTP请求中被复用,那么这些逻辑相关的请求可以参与到同一个逻辑会话中.HttpContext功能与java.util.Map<String, Object>类似,它是一组任意值的集合.一个应用程序可

《HttpClient官方文档》1.6 中止请求

1.6. 中止请求 在某些情况下,由于服务器端的高负载或者客户端存在过多的并发请求问题,HTTP请求不能在预期时间内执行完毕. 遇到这种情况,可能需要提前中止请求并开启阻塞在I/O操作的线程. 通过HttpUriRequest#abort()方法,可以在任何阶段中止由HttpClient执行的HTTP请求. 任何线程都可以调用这个方法,并且这个方法是线程安全的. 当一个HTTP请求被中止时,即使当前执行的线程阻塞在I/O操作,也可以通过抛出InterruptedIOException保证其畅通.

《HttpClient官方文档》HTTP验证4.4-4.7

4.4 HTTP验证和执行上下文 HttpClient依赖于AuthState类来追踪验证进程的状态的详细信息.HttpClient在执行HTTP请求执行时,创建AuthState的两个实例:一个对目标主机认证,另外一个用于代理认证.一旦目标主机或者代理要求用户验证,对应的AuthState实例将会在验证过程中被AuthScope,AuthScheme和Crednetials填充.这个AuthState可以被检查用于找出哪种类型要求验证,是否对应的AuthScheme被找到,以及凭证提供者可以找

《HttpClient官方文档》2.3 HTTP连接管理

2.3. HTTP 连接管理 2.3.1. 管理连接和连接管理器 HTTP 连接是复杂的. 有状态的. 非线程安全的对象,因此需要恰当的管理才能正常工作.HTTP连接一次只能由一个线程使用.HttpClient使用实现了HttpClientConnectionManager接口,被称为HTTP连接管理器的特殊实体去访问HTTP连接. HTTP连接管理器的作用是作为一个工厂类来为新的HTTP连接使用,管理持久连接的生命周期和同步访问,确保一次只能由一个线程使用连接. HTTP连接管理器内部与Man

《HttpClient官方文档》1.7. Redirect handling 翻译

1.7. 重定向处理 HttpClient能够处理所有类型的自动重定向,除了被那些需要用户干预被HTTP规范明确禁止的.考虑到根据HTTP规范中其他被转为GET请求的POST和PUT请求的重定向(状态码303),可以使用一个自定义的重定向策略来降低HTTP规范强制规定的POST方法自动重定向的限制. LaxRedirectStrategy redirectStrategy = new LaxRedirectStrategy(); CloseableHttpClient httpclient =