越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。
HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
新建一个 SpringBoot 工程,引入 httpclient 的 POM 依赖:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.6</version>
</dependency>
详细使用示例
GET 无参
调用接口:
http://localhost:8080/http/listUsers
没有入参。
HttpClientController#doGetNoParams() :GET请求接口不带参数
@RestController
@RequestMapping("/httpClient")
public class HttpClientController {
@Autowired
private HttpClientService httpClientService;
// GET请求接口不带参数
@GetMapping("/doGetNoParams")
public String doGetNoParams() {
return httpClientService.doGetNoParams();
}
}
HttpClientServiceImpl#doGetNoParams() :GET 请求接口不带参数
@Slf4j
@Service
public class HttpClientServiceImpl implements HttpClientService {
// GET请求接口不带参数
@Override
public String doGetNoParams() {
String result = HttpClientUtil.doGetNoParams();
log.info("【发送GET请求】返回结果为:{}", result);
if (!StringUtil.isBlank(result)) {
TaskCenterUtil taskCenterUtil = TaskCenterUtil.getTaskCenterUtil();
taskCenterUtil.submitTask(() -> {
log.info("【子线程】开启了一个新线程,当前线程名为:{}", Thread.currentThread().getName());
return null;
});
}
log.info("【主线程】当前线程名为:{}", Thread.currentThread().getName());
return result;
}
}
说明:
- 当 HTTP 调用成功后,通过线程池开一个子线程,去异步执行任务;主线程继续向下执行
HttpClientUtil#doGetNoParams() :GET请求接口不带参数
@Slf4j
public class HttpClientUtil {
// 服务器ip
public static final String IP = "http://localhost";
// 端口
public static final String PORT = ":8080";
// GET请求接口不带参数
public static final String GET_URL_NO_PARAMS = IP + PORT + "/http/listUsers";
// GET请求接口不带参数
public static String doGetNoParams() {
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
// 创建 GET 请求
HttpGet httpGet = new HttpGet(GET_URL_NO_PARAMS);
httpGet.setHeader("Accept-Encoding", "identity");
log.info("【发送GET请求】请求地址为:{}", GET_URL_NO_PARAMS);
CloseableHttpResponse httpResponse = null;
try {
httpResponse = httpClient.execute(httpGet);
HttpEntity httpEntity = httpResponse.getEntity();
log.info("【发送GET请求】成功,相应状态为:{}", httpResponse.getStatusLine());
if (HttpStatus.SC_OK == httpResponse.getStatusLine().getStatusCode() && null != httpEntity) {
String result = EntityUtils.toString(httpEntity);
log.info("【发送GET请求】成功,响应内容为:{}", re