程序开发中,经常碰到需要远程接口调用的业务场景,一般的get请求直接使用Hutool工具类就很方便,但是Hutool的post请求有时候出现调用失败的问题。
博主调试微信公众号的相关接口使用hutool就一直报错,我还以为是自己的参数不符合微信要求呢,结果换成自己的工具类调用腾讯,立刻就通了。
所以这里把自己封装的工具类展示出来,以供参考或借鉴。
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
/**
* restTemplate 远程访问工具类
*
* @author gbx
* @since 2021-02-26 14:36
*/
public class RestClientUtils {
/**
* 使用restTemplate发送post请求
*
* @param restTemplate 请求工具
* @param uri 请求路径
* @param token 访问令牌
* @param jsonObject 请求参数
* @param message 请求功能详情说明
* @return 响应结果
*/
public static String sendPostString(RestTemplate restTemplate, String uri, String token, JSONObject jsonObject, String message) {
String body;
try {
HttpEntity<String> formEntity = getFormEntity(jsonObject, token);
body = restTemplate.postForEntity(uri, formEntity, String.class).getBody();
} catch (Exception e) {
throw new RuntimeException("调用上游服务器失败:" + message, e);
}
return body;
}
/**
* 获取POST请求的请求体对象
*
* @param jsonObject 封装请求参数信息的实体
* @param token 接口访问令牌
* @return 处理结果
*/
public static HttpEntity<String> getFormEntity(JSONObject jsonObject, String token) {
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
headers.setContentType(type);
headers.add("Accept", MediaType.APPLICATION_JSON.toString());
if (StringUtils.isNotBlank(token)) {
headers.add("token", token);
}
HttpEntity<String> formEntity;
if (jsonObject != null) {
formEntity = new HttpEntity<>(jsonObject.toString(), headers);
} else {
formEntity = new HttpEntity<>(headers);
}
return formEntity;
}
}
PS: 工具类中生成调用对象的时候,如果存在token,以约定的实际token key名为准,比如博主这里key就叫 token,所以直接加在header里,你如果叫 Authorization ,那你就在header中添加这个key。