一、前言
之前对发送http请求,使用过okhttp,还有httpclient等,这次就直接使用springboot的RestTemplate了。
二、不同的请求方式
我这里只针对POST请求做说明:
下面针对post请求做三种说明:
1、调用的接口参数用@RequestParam标识
此种在APIfox中传参方式是地址栏传参数,没有请求体。
/**
* 发送没有请求体的请求
* @param url 请求url
* @param reqParam 地址栏参数
* @return 想要结果
*/
public static JSONObject httpPostResult(String url, Map<String, Object> reqParam) {
String params = getParameter(reqParam);
if (StringUtils.isBlank(params)) {
log.error("获取sign失败,sign=null");
return null;
}
HttpEntity<Map<String, String>> httpEntity = new HttpEntity<>(setHeaders());
//解析请求结果
String result = new RestTemplate().postForObject(url + params, httpEntity, String.class);
return JSONObject.parseObject(result);
}
/**
* 对地址栏的参数进行拼接
* @param map 地址栏参数
* @return 拼接后的结果
*/
public static String getParameter(Map<String, Object> map) {
try {
if (MapUtil.isEmpty(map)) {
return null;
}
String result = "";
for (String key : map.keySet()) {
if (Objects.nonNull(map.get(key) )) {
if (!"".equals(result)) {
result += "&";
}
result = result + key + "=" + map.get(key);
}
}
return result;
} catch (Exception e) {
log.error("map转参出错", e);
}
return null;
}
/**
* 设置请求头
* @return 请求头
*/
private static HttpHeaders setHeaders() {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("Accept", MediaType.APPLICATION_JSON.toString());
httpHeaders.add("Accept-Charset", "UTF-8");
return httpHeaders;
}
在Apifox中调用如下:
请求体body=none。
对应的curl命令如下:
curl --location --request POST 'http://xxx:8080/tree/getTree?param1=abc¶m2=123¶m3=def' \
2、调用的接口参数用@RequestBody标识
此种在APIfox中传参方式是地址栏需要传参数,且有请求体。
/**
* 发送带有地址栏参数,有请求体的请求
* @param url 请求 url
* @param reqParam url上的参数
* @param reqBody 请求体
* @return 响应结果
*/
public static JSONObject httpPostResult(String url, Map<String, Object> reqParam, Map<String, Object> reqBody) {
String params = getParameter(reqParam);
if (StringUtils.isBlank(params)) {
log.error("获取sign失败,sign=null");
return null;
}
//封装请求头和内容
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(reqBody, setHeaders());
//解析请求结果
String result = new RestTemplate().postForObject(url + params, requestEntity, String.class);
return JSONObject.parseObject(result);
}
Apifox上我就只展示body了:
Params和上面的没有请求体的一样。
curl命令如下:
curl --location --request POST 'http://xxx:8080/tree/getTree?param1=abc¶m2=123¶m3=def' --header 'Content-Type: application/json' \
--data-raw '{"parentId":80}'
这个命令里面的data-raw的值就是请求体。
3、调用的接口参数没有标识
这种的是所有的参数都使用form-data的格式进行传输:
这种就必须使用LinkedMultiValueMap对参数进行封装:
/**
* 发送form-data请求
* @param url 请求 url
* @param data 请求体
* @return 响应结果
*/
public JSONObject httpPostResult(String url, MultiValueMap<String, String> data) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
//解析请求结果
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(data, headers);
ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class);
return JSONObject.parseObject(response.getBody());
}
对应的controller中不需要任何注解:
@PostMapping("/postRequest")
public JSONObject intervalData(ChargeLogIntervalDataReq request) {
String url = "http://xxx:8081/api/list";
MultiValueMap<String, String> data = new LinkedMultiValueMap<>();
data.put("page", Lists.newArrayList(request.getPage()));
data.put("limit", Lists.newArrayList(request.getLimit()));
return httpUtils.httpPostResult(url, data);
}
这里要注意,MultiValueMap的value得是list才行。
--------------你知道的越多,不知道的越多-------------