Http 协议应该是互联网中最重要的协议。持续增长的 web 服务、可联网的家用电器等都在继承并拓 展着 Http 协议,向着浏览器之外的方向发展。
虽然 jdk 中的 java.net 包中提供了一些基本的方法,通过 http 协议来访问网络资源,但是大多数场 景下,它都不够灵活和强大。HttpClient 致力于填补这个空白,它可以提供有效的、最新的、功能丰 富的包来实现 http 客户端
以下是一个简单的请求例子:
@Test public void test01() throws Exception { CloseableHttpClient httpclient = HttpClients.createDefault(); HttpGet httpget = new HttpGet("http://www.baidu.com/"); CloseableHttpResponse response = httpclient.execute(httpget); try { System.out.println(response); } catch (Exception e) { } finally { response.close(); } }
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(可选)和片段信息(可选)。
HttpGet httpget =
new HttpGet("http://www.google.com/search?hl=en&q=httpclient&btnG=Google+Search&aq= f&oq=");
HttpClient 提供 URIBuilder 工具类来简化 URIs 的创建和修改过程。
@Test public void test02() throws Exception { 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请求后,就会对其进行解析,然后把响应发给客户端,这个响应就是HTTP response.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