摘要:
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);
测试结果:
post: