Httpcli4.5发送http请求和post重定向
摘要: Java发送http请求有多种方式,一种是通过HTTPClient这种第三方的开源框架去实现。一种是HttpURLConnection去实现,这是java比较原生的发送http请求的方式,再实际开发中,使用HttpClient这种方式较多,功能也更加强大,本文就这种方式展开讨论
HttpClient介绍
超文本传输协议(HTTP)可能是当今Internet上使用的最重要的协议。Web服务,具有网络功能的设备以及网络计算的增长继续将HTTP协议的作用扩展到用户驱动的Web浏览器之外,同时增加了需要HTTP支持的应用程序的数量。尽管java.net 软件包提供了用于通过HTTP访问资源的基本功能,但它并未提供许多应用程序所需的全部灵活性或功能。Jakarta Commons HttpClient 组件试图通过提供高效,最新且功能丰富的程序包来实现此空白,以实现最新HTTP标准和建议的客户端。
HttpClient组件是 为扩展而设计的,同时提供了对基本HTTP协议的强大支持,对于构建HTTP感知的客户端应用程序(例如Web浏览器,Web服务客户端或利用或扩展HTTP协议进行分布式通信的系统)的任何人来说,HttpClient组件都可能感兴趣。许多项目使用HttpClient提供核心的HTTP功能。
HttpClient历史
HttpClient于2001年作为Jakarta Commons的子项目启动,该项目基于Jakarta Slide项目开发的代码 。它于2004年从Commons中提拔,毕业于另一个雅加达项目。2005年,在雅加达创建了HttpComponents项目,其任务是开发HttpClient 3.x的后继产品,并维护现有代码库,直到准备好接管新代码库为止。该共享项目,摇篮HttpClient的,离开雅加达 ,2007年成为一个独立的顶级项目。同年晚些时候, HttpComponents 该项目还离开了雅加达,成为一个独立的顶级项目,负责维护HttpClient。Commons HttpClient项目现已停产,并且不再开发。它已被其HttpClient和HttpCore模块中的Apache HttpComponents项目取代,它们提供了更好的性能和更大的灵活性。
所以,在使用HTTPClient时要注意版本,HTTPCLient3.x和4.x的使用上有明显区别,本文使用的时HTTPClient4.5
HTTPClient4.5所需要的依赖
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5</version> </dependency>
代码示例:
public class HttpClientRequest { /** * 通过url发送get请求并得到请求响应的结果 * * @param url 请求的url * @return 响应的结果 */ public static String doGet(String url) { String result = ""; // 通过址默认配置创建一个httpClient实例 try (CloseableHttpClient httpClient = HttpClients.createDefault()) { // 创建httpGet远程连接实例 HttpGet httpGet = new HttpGet(url); // 设置请求头信息,鉴权 请求的配置信息在实际开发中为了程序的健壮性和扩展性,应该在配置文件中进行配置 httpGet.setHeader("Authorization", "Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0"); // 设置配置请求参数 RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(35000)// 连接主机服务超时时间 .setConnectionRequestTimeout(35000)// 请求超时时间 .setSocketTimeout(60000)// 数据读取超时时间 .build(); // 为httpGet实例设置配置 httpGet.setConfig(requestConfig); // 执行get请求得到返回对象 try (CloseableHttpResponse response = httpClient.execute(httpGet)) { // 通过返回对象获取返回数据 HttpEntity entity = response.getEntity(); // 通过EntityUtils中的toString方法将结果转换为字符串 result = EntityUtils.toString(entity); } } catch (IOException e) { e.printStackTrace(); } return result; } /** * 发送post请求 * * @param url * @param requestParam * @return */ public static String doPost(String url, String requestParam) { String result = ""; // 创建一个httpClient实例 配置post请求的重定向(如果使用默认配置httpClient默认get请求可以重定向,post的响应不可重定向) try (CloseableHttpClient httpClient = HttpClientBuilder.create().setRedirectStrategy(new LaxRedirectStrategy()).build()) { // 创建httpGet远程连接实例 HttpPost httpPost = new HttpPost(url); // 请求的配置信息在实际开发中为了程序的健壮性和扩展性,应该在配置文件中进行配置 // 设置配置请求参数 RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(35000)// 连接主机服务超时时间 .setConnectionRequestTimeout(35000)// 请求超时时间 .setSocketTimeout(60000)// 数据读取超时时间 .build(); // 为httpGet实例设置配置 httpPost.setConfig(requestConfig); StringEntity stringEntity = new StringEntity(requestParam, "UTF-8"); stringEntity.setContentEncoding("UTF-8"); httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded"); httpPost.setEntity(stringEntity); // 执行get请求得到返回对象 try (CloseableHttpResponse response = httpClient.execute(httpPost)) { // 通过EntityUtils中的toString方法将结果转换为字符串 result = EntityUtils.toString(response.getEntity()); } } catch (IOException e) { e.printStackTrace(); } return result; } }
测试接口:
@RestController public class TestController { @GetMapping("/httpClientGet") public String httpClientGet(String name) { return "hello httpClientGet!"; } @PostMapping("/httpClientPost") public String httpClientPost(String name, int id) { System.out.println(name); return "hello httpClientPost!"; } }
单元测试:
public class HttpClientRequestTest { @Test public void doGetTest() { String url = "http://localhost:8080/httpClientGet?name=wang"; String result = HttpClientRequest.doGet(url); String expect = "hello httpClientGet!"; Assert.assertEquals(result, expect); System.out.println(result); } @Test public void doPostTest() { String url = "http://localhost:8080/httpClientPost"; String requestParam = "name=wang&id=1"; String result = HttpClientRequest.doPost(url, requestParam); String expect = "hello httpClientPost!"; Assert.assertEquals(result, expect); System.out.println(result); } }
测试结果:
get:
post: