1. 简介
httpclent是java中一个关于http协议的程序包 ,主要适用于java模拟浏览器使用HTTP协议进行通信,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。Http协议是互联网中一个使用最广泛的一个协议。
2. 组成
主要使用有三个部分组成。
- httpcomponents core,主要是由一些低层次的组件构成,实现了Http协议的底层框架,可以用来构成客户端和服务端的http服务。支持阻塞和非阻塞I/O,同时支持java中NIO。
- httpcomponents client,是基于core模块构建的http agent,提供一些高级的http服务。
- httpcomponents asyncclient,是基于core中NIO方式实现的,用来支持大量并
在实际使用中,我们一般不直接使用core模块,而是使用httpcomponent client模块构建我们的程序。httpclient一般使用流程都是执行一个http请求,然后得到制定服务器的响应response,然后根据响应我们做出响应的处理。
一个典型的例子如下所示
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpget = new HttpGet("http://localhost/");
CloseableHttpResponse response = httpclient.execute(httpget);
try {
<...>
} finally {
response.close();
}
3. http 请求(request)
Http请求的格式如下:
<request-line>
<headers>
<blank line>
[<request-body>]
在HTTP请求中,第一行必须是一个请求行(request line),用来说明请求类型、要访问的资源以及使用的HTTP版本。紧接着是一个首部(header)小节,用来说明服务器要使用的附加信息。在首部之后是一个空行,再此之后可以添加任意的其他数据[称之为主体(body)]。
在HTTP中,定义了多种请求类型,通常我们关心的只有GET请求和POST请求。只要在Web浏览器上输入一个URL,浏览器就将基于该URL向服务器发送一个GET请求,以告诉服务器获取并返回什么资源。
Httpclient可以通过BasicHttpRequestl新建一个请求,如下所示
HttpRequest request = new BasicHttpRequest("GET", "/",
HttpVersion.HTTP_1_1);
System.out.println(request.getRequestLine().getMethod());
System.out.println(request.getRequestLine().getUri());
System.out.println(request.getProtocolVersion());
System.out.println(request.getRequestLine().toString());
输出
GET
/
HTTP/1.1
GET / HTTP/1.1
HttpClient支持各种请求,GET,HEAD, POST, PUT, DELETE, TRACE and OPTIONS.。对应的各种请求方式为 HttpGet,HttpHead, HttpPost, HttpPut, HttpDelete, HttpTrace, and HttpOptions。
例如get请求方式
HttpGet httpget = new HttpGet(
"http://www.google.com/search?hl=en&q=httpclient&btnG=Google+Search&aq=f&oq=");
Httpclent提供一个URIBuilder类用来构建一些需要请求的URI;如:
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);
4. http 响应(Response)
如下所示,HTTP响应的格式与请求的格式十分类似 , 在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求的资源情况。:
<status-line>
<headers>
<blank line>
[<response-body>]
可以用BasicHttpResponse构建一个响应。
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