程序开发中,经常碰到需要远程接口调用的业务场景,一般的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
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
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
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。