一、Httpclient简介
Httpclient是Apache软件基金会的一个开源项目,它是Apache HttpComponents的一部分。它是一个支持Http协议的客户端库,可以模拟浏览器的功能,实现Http请求和响应数据的传输。它是一个很好的Java开源库,适用于任何需要发送Http请求的场景,可以使用多种协议,比如HTTP、HTTPS、FTP等等。
Httpclient有很多优点,比如可以通过自定义的方式控制请求的流程和参数,接收服务器返回的内容,验证服务器的响应等。同时,它也提供了很多可用的连接配置,例如超时时间、最大连接数等设置。延伸下去,它还可以帮助我们实现下载文件、发送邮件等操作,可以节省很多时间和精力。
二、Httpclient的使用方法
Httpclient的使用非常简单,一般来说分为两个部分:构建请求和处理响应。构建请求主要包括构造请求方法、设置请求头、设置请求参数和处理响应等。处理响应则是获取响应头、获取响应主体、获取响应码等等。
三、构建请求
1、构造请求方法
要构造一个Http请求方法,我们需要先实例化一个HttpClient对象。这个对象负责管理Http请求的所有资源。之后,我们可以通过执行GET、POST、DELETE等请求来获得HttpResponse对象:
CloseableHttpClient client = HttpClientBuilder.create().build(); HttpGet httpGet = new HttpGet(url); HttpResponse response = client.execute(httpGet);
其中,HttpGet类扩展了HttpRequestBase抽象类,因此HttpGet类具有扩展HttpRequestBase类的所有方法和属性。 response是HttpResponse接口的实现类,包含来自服务器的响应。
2、设置请求头
设置请求头可以使用HttpHead类。可以使用addHeader()方法向请求添加单个HTTP标题,也可以使用setHeader()方法将数组传递给请求中所有HTTP标题。下面的示例演示如何添加http头到一个HTTP GET请求:
HttpGet httpGet = new HttpGet("http://localhost:8080/restful/artists/"); httpGet.addHeader("Accept", "application/json"); httpGet.setHeader("User-Agent", "PostmanRuntime/7.26.8"); HttpResponse response = client.execute(httpGet);
3、设置请求参数
如果需要在请求中发送参数,则需要将其设置为HTTP GET方法的一部分。可以使用setURI()方法将请求的参数添加到URL中。如果请求是POST、PUT或DELETE请求,则可以使用setEntity()方法将请求的参数添加到请求正文中:
HttpPost httpPost = new HttpPost(url); StringEntity params = new StringEntity("{\"name\":\"test\"}"); httpPost.setEntity(params); httpPost.setHeader("Content-Type", "application/json"); HttpResponse response = client.execute(httpPost);
四、处理响应
1、获取响应码
获取响应状态码的最直接方式是直接调用HttpResponse的getStatusLine()方法:
int statusCode = response.getStatusLine().getStatusCode();
2、获取响应头
我们可以通过HttpResponse对象的getAllHeaders()方法获取响应头部信息,并且可以通过getHeaders()和getFirstHeader()方法获取指定响应头的信息:
Header[] headers = response.getAllHeaders(); Header authHeader = response.getFirstHeader("Authorization");
3、获取响应主体
获取Http响应主体的最基本的方式是通过HttpResponse对象的getEntity()方法来获取HttpEntity对象,然后从HttpEntity对象中读取内容:
HttpEntity entity = response.getEntity(); if (entity != null) { InputStream instream = entity.getContent(); ... }
五、连接管理
Httpclient有一套完整的连接管理方案,包括从长久或者临时的连接池中获取到连接、释放连接、关闭连接等等。基于这些连接管理可以解决一些网络方面的问题,比如超时或者过度连接限制等等。下面是一些基本的连接管理:
CloseableHttpClient httpClient = HttpClients.createDefault(); try { HttpHost target = new HttpHost("httpbin.org", 80, "http"); HttpGet getRequest = new HttpGet("/get"); RequestConfig config = RequestConfig.custom() .setConnectTimeout(5000) .setSocketTimeout(5000).build(); getRequest.setConfig(config); System.out.println("executing request to " + target); CloseableHttpResponse response = httpClient.execute( target, getRequest); try { HttpEntity entity = response.getEntity(); if (entity != null) { System.out.println("Response content length: " + entity.getContentLength()); } EntityUtils.consume(entity); } finally { response.close(); } } finally { httpClient.close(); }
六、总结
本文主要介绍了使用Java Httpclient实现Http请求和响应处理的技巧。无论是对于Java开发者还是对于需要进行Http请求的各种应用而言,Httpclient确实是一个很好的工具。