1、maven坐标
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.6.6</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
2、调用http接口返回的数据模板
import cn.hutool.json.JSON;
import lombok.Data;
/**
* 接口返回模板
*/
@Data
public class ResponseDataVo {
private Integer status;
private JSON result;
}
3、封装的异常类
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 封装的异常类
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class OpenApiInvokeException extends RuntimeException {
private final String targetUrl;
private final String message;
public OpenApiInvokeException(String targetUrl, String message) {
this.targetUrl = targetUrl;
this.message = message;
}
}
4、调用http的第三方接口(get、post)
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.*;
import cn.hutool.json.JSONUtil;
import java.util.Map;
/**
* 调用http接口工具类
*/
public class HttpClientUtil {
private final String apiHost;
public HttpClientUtil(String apiHost) {
this.apiHost = apiHost;
}
/**
* 该get请求方法仅支持?传参。例如:http://localhost:9090/api/getMethod?name=xxx&age=12
* @param method 请求方法
* @param apiUrl 请求的uri
* @param queryParams 请求参数
* @return
*/
public ResponseDataVo httpGet(final Method method, final String apiUrl, Map<String, Object> queryParams){
final StringBuilder queryString = new StringBuilder();
if (null != queryParams) {
// 将queryParams转换为queryString(key=val&key2=val2)
for (final String key : queryParams.keySet()) {
queryString.append(StrUtil.format("{}={}", key, queryParams.get(key))).append("&");
}
if (!queryParams.isEmpty()) {
queryString.deleteCharAt(queryString.length() - 1);
}
}
final HttpRequest httpRequest = HttpUtil.createRequest(method, StrUtil.format("{}/{}{}",
this.apiHost, apiUrl, queryString.length() > 0 ? ("?" + queryString.toString()) : ""));
return this.doInvoke(httpRequest);
}
/**
* 该post请求方法仅支持body传参
* @param method 请求方法
* @param apiUrl 请求的uri
* @param requestBody body请求参数
* @return
*/
public ResponseDataVo httpPost(final Method method, final String apiUrl, final Map<String, Object> requestBody){
// 将requestBody转换为JSON字符串
final String requestBodyString = null != requestBody ? JSONUtil.toJsonStr(requestBody) : null;
HttpRequest httpRequest = HttpUtil.createPost(this.apiHost + "/" + apiUrl);
if (null != requestBodyString) {
httpRequest.body(requestBodyString, ContentType.JSON.toString());
}
return this.doInvoke(httpRequest);
}
/**
* 公共调用http方法
* @param httpRequest
* @return
*/
private ResponseDataVo doInvoke(HttpRequest httpRequest) {
try {
//httpRequest.header("xxx","xxx"); 添加header可选,需要可以设置添加;这里不需要,就没有添加,做下提示
final HttpResponse httpResponse = httpRequest.execute();
if (!httpResponse.isOk()){
throw new OpenApiInvokeException(httpRequest.getUrl(),
"HttpStatus is " + httpResponse.getStatus() + ", Body is " + httpResponse.body());
}
return JSONUtil.toBean(httpResponse.body(), ResponseDataVo.class);
} catch (OpenApiInvokeException e) {
e.printStackTrace();
} catch (HttpException e) {
e.printStackTrace();
}
return null;
}
}
5、对4工具类的测试用例
import cn.hutool.core.map.MapUtil;
import cn.hutool.http.Method;
import java.util.HashMap;
import java.util.Map;
public class HttpTest {
public static void main(String[] args) {
String apiHost = "http://localhost:9090";
HttpClientUtil httpClientUtil = new HttpClientUtil(apiHost);
String getApiUrl = "/api/test/getMethod";
String postApiUrl = "/api/test/postMethod";
Map<String, Object> queryParams = MapUtil.builder(new HashMap<String, Object>())
.put("name", "tom")
.put("age", 12)
.map();
Map<String, Object> requestBody = MapUtil.builder(new HashMap<String, Object>())
.put("address", "tianjin")
.put("org", "A组")
.map();
//get调用
ResponseDataVo httpGetDataVo = httpClientUtil.httpGet(Method.GET, getApiUrl, queryParams);
System.out.println("========get请求结果=========== " + httpGetDataVo.getResult());
//post调用
ResponseDataVo httpPostDataVo = httpClientUtil.httpPost(Method.POST, postApiUrl, requestBody);
System.out.println("========post请求结果=========== " + httpGetDataVo.getResult());
}
}
这里整理一下,比较简单。网上找的有的都不能用,以后再用到,直接用就好了。学习记录一下,勿喷!