【Java】如何优雅的使用HttpClient

tech2023-10-18  95

HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。

简介

HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java net包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient。现在HttpClient最新版本为 HttpClient 4.5 .6(2015-09-11)

功能介绍 (1)实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等) (2)支持自动转向 (3)支持 HTTPS 协议 (4)支持代理服务器等

HttpClient流程

(1)创建HttpClient对象。 (2)创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。 (3)如果需要发送请求参数,可调用HttpGetsetParams方法来添加请求参数;对于HttpPost对象而言,可调用setEntity(HttpEntity entity)方法来设置请求参数。 (4)调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse对象。 (5)调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。 (6)释放连接。无论执行方法是否成功,都必须释放连接

使用案例: 1、POM中引入commons-httpclient组件

<!-- commons-httpclient --> <dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> <version>3.1</version> <scope>compile</scope> </dependency>

2、创建HttpClient工具类

import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.methods.RequestEntity; import org.apache.commons.httpclient.methods.StringRequestEntity; import org.apache.commons.httpclient.params.HttpMethodParams; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; /** * @Title: * @Description: Http工具类 * @author: Real * @Version: 1.0 */ public class HttpTool { private static Logger logger = LoggerFactory.getLogger(HttpTool.class); private HttpTool() {} /** * POST请求 * * @param url url * @param paramJson 参数的json格式 */ public static String sendPost(String url, String paramJson) { logger.info("开始发起POST请求,请求地址为{},参数为{}", url, paramJson); // 创建httpClient实例对象 HttpClient httpClient = new HttpClient(); // 设置httpClient连接主机服务器超时时间:15000毫秒 httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(15000); // 创建post请求方法实例对象 PostMethod postMethod = new PostMethod(url); // 设置post请求超时时间 postMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 60000); postMethod.addRequestHeader("Content-Type", "application/json"); try { //json格式的参数解析 RequestEntity entity = new StringRequestEntity(paramJson, "application/json", "UTF-8"); postMethod.setRequestEntity(entity); httpClient.executeMethod(postMethod); String result = postMethod.getResponseBodyAsString(); postMethod.releaseConnection(); return result; } catch (IOException e) { logger.error("POST请求发出失败,请求的地址为{},参数为{},错误信息为{}", url, paramJson, e.getMessage(), e); } return null; } /** * GET请求 * * @param urlParam url请求,包含参数 */ public static String sendGet(String urlParam) { logger.info("开始发起GET请求,请求地址为{}", urlParam); // 创建httpClient实例对象 HttpClient httpClient = new HttpClient(); // 设置httpClient连接主机服务器超时时间:15000毫秒 httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(15000); // 创建GET请求方法实例对象 GetMethod getMethod = new GetMethod(urlParam); // 设置post请求超时时间 getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 60000); getMethod.addRequestHeader("Content-Type", "application/json"); try { httpClient.executeMethod(getMethod); String result = getMethod.getResponseBodyAsString(); getMethod.releaseConnection(); logger.info("返回信息为{}", result); return result; } catch (IOException e) { logger.error("GET请求发出失败,请求的地址为{},错误信息为{}", urlParam, e.getMessage(), e); } return null; } }

3、测试get请求、post请求

public class HttpTest { @Test public void postTest(){ String name= "jack"; String age = "26"; JSONObject jsonObject = new JSONObject(); jsonObject.put("name", name); jsonObject.put("age ", age ); String usage_url = "http://127.0.0.1:8080/getUserDetails"; String result = HttpTool.sendPost(usage_url,jsonObject.toString()); System.out.println("POST提交结果:" + result); } @Test public void getTest(){ String usage_url = "http://127.0.0.1:8080/getUserDetails?name=jack&age=26"; String result = HttpTool.sendGet(usage_url); System.out.println("GET提交结果:" + result); } }

以上~

最新回复(0)