import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;import org.apache.http.client.methods.HttpUriRequest;import org.springframework.http.HttpMethod;import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;import java.net.URI;public class HttpComponentsClientRestfulHttpRequestFactory extends HttpComponentsClientHttpRequestFactory {@Overrideprotected HttpUriRequest createHttpUriRequest(HttpMethod httpMethod, URI uri) {if (httpMethod == HttpMethod.GET) {return new HttpGetRequestWithEntity(uri);}return super.createHttpUriRequest(httpMethod, uri);}/*** 定义HttpGetRequestWithEntity实现HttpEntityEnclosingRequestBase抽象类,以支持GET请求携带body数据*/private static final class HttpGetRequestWithEntity extends HttpEntityEnclosingRequestBase {public HttpGetRequestWithEntity(final URI uri) {super.setURI(uri);}@Overridepublic String getMethod() {return HttpMethod.GET.name();}}}2 HttpUtil — hutool 提供HttpUtil 其实是 HttpRequest 的封装 。
它支持各种封装好的get、post、put请求 。
2.1 get 请求public static String get(String urlString, Charset customCharset) {return ((HttpRequest)HttpRequest.get(urlString).charset(customCharset)).execute().body();}public static String get(String urlString) {return get(urlString, HttpGlobalConfig.timeout);}public static String get(String urlString, int timeout) {return HttpRequest.get(urlString).timeout(timeout).execute().body();}// form 表单格式的入参public static String get(String urlString, Map<String, Object> paramMap) {return HttpRequest.get(urlString).form(paramMap).execute().body();}// form 表单格式的入参,并设置超时时间public static String get(String urlString, Map<String, Object> paramMap, int timeout) {return HttpRequest.get(urlString).form(paramMap).timeout(timeout).execute().body();}2.2 post 请求这些请求最终调用的都是 HttpRequest 的 execute() 方法 。
// form 表单格式的入参public static String post(String urlString, Map<String, Object> paramMap) {return post(urlString, paramMap, HttpGlobalConfig.timeout);}// form 表单格式的入参,并设置超时时间public static String post(String urlString, Map<String, Object> paramMap, int timeout) {return HttpRequest.post(urlString).form(paramMap).timeout(timeout).execute().body();}// body 格式入参public static String post(String urlString, String body) {return post(urlString, body, HttpGlobalConfig.timeout);}// body 格式入参,并设置超时时间public static String post(String urlString, String body, int timeout) {return HttpRequest.post(urlString).timeout(timeout).body(body).execute().body();}2.3 一个例子Map<String, Object> param = new HashMap<>();param.put("userId", userId);String res = HttpUtil.post(url, JsonUtil.of(param));3 HttpRequest — hutool 提供HttpRequest 提供了非常方便构造请求的构造函数 。当参数比较多、header比较多的时候,可以使用这种方式 。(这里使用了构造模式)
3.1 底层是Java的HttpURLConnectionHttpRequest 底层又是使用了 java 提供的 HttpURLConnection
上源码:
最终都需要执行这个execute方法,这个方法调用了hutool封装的HttpConnection,这个HttpConnection又使用了java提供的HttpURLConnection 。
// hutool 执行方法public HttpResponse execute(boolean isAsync) {this.urlWithParamIfGet();this.initConnection();this.send();HttpResponse httpResponse = this.sendRedirectIfPossible();if (null == httpResponse) {httpResponse = new HttpResponse(this.httpConnection, this.charset, isAsync, this.isIgnoreResponseBody());}return httpResponse;}public class HttpConnection {private final URL url;private final Proxy proxy;// 这个连接 HttpURLConnection ,是java提供的private HttpURLConnection conn;...// 省略无数代码}3.2 一个例子private String invoke(String url, String isMock, Map<String, Object> map) {String result = HttpRequest.post(url).body(JSONUtil.toJsonStr(map)).execute().body();return result;}
推荐阅读
- 13个JavaScript 一行程序,让你看起来像个专家
- JavaScript 数组操作必须熟练运用的 10 个方法
- Java程序员找工作的难点在哪里?找工作对症下药,注意这3点
- Java,处理工具类,BeanUtils工具包,map对象转成JavaBean
- 织梦CMS仿站:列表页的完整调用
- 你真的懂Java的ArrayList吗?
- Java加密解密算法世界
- 「Java原理探索」「AQS」教你自定义实现自己的同步器
- Java循环结构——switch语句
- Javascript 中New 操作符 解读
