Http调用-静态封装类(RestTemplate)
1、问题描述
项目中封装了个restTemplate的静态调用类,分享下,希望能帮到需要的朋友。
2、解决方案
2.1 简要说明:
以前用httpclient用的比较多,后来开始用restTemplate,查了两者的区别,大部分无非就是:
(1)restTemplate是包含在spring包中的,使用起来更加方便一些,调用也简洁一些;
(2)restTemplate的低层支持多种调用,比如:httpclient、HttpURLConnection等吧;
个人认为两者都是为了发送http请求,本质上区别不大,无非就是restTemplate又做了一层封装,使用起来更加方便,代码更加简洁而已。。
2.2 静态调用类
完整代码:
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.*;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.client.RestTemplate;
import java.util.HashMap;
import java.util.Map;
/**
* http调用工具类,软件老王
*/
public class invokeUtils {
/**
* post调用,软件老王
*
* @param url
* @param jsonString
* @return
*/
public static String postInvoke(String url, String jsonString) {
return invoke(url, jsonString, null, RequestMethod.POST);
}
/**
* get调用,软件老王
*
* @param url
* @return
*/
public static String getInvoke(String url) {
return invoke(url, null, null, RequestMethod.GET);
}
/**
* 通用,软件老王
*
* @param url
* @param jsonString
* @param token
* @param requestMethod
* @return
*/
public static String invoke(String url, String jsonString, String token, RequestMethod requestMethod) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType("application/json; charset=UTF-8"));
headers.add("Accept", MediaType.APPLICATION_JSON.toString());
if (!StringUtils.isEmpty(token)) {
headers.add("Authorization", token);
}
HttpEntity<String> httpEntity;
if (!StringUtils.isEmpty(jsonString)) {
httpEntity = new HttpEntity<>(jsonString, headers);
} else {
httpEntity = new HttpEntity<>("parameters", headers);
}
RestTemplate rst = new RestTemplate();
ResponseEntity<String> responseEntity = null;
if (RequestMethod.POST.equals(requestMethod)) {
try {
responseEntity = rst.postForEntity(url, httpEntity, String.class);
} catch (Exception e) {
return e.getMessage();
}
return responseEntity.getBody();
}
try {
responseEntity = rst.exchange(url, HttpMethod.GET, httpEntity, String.class);
} catch (Exception e) {
return e.getMessage();
}
return responseEntity.getBody();
}
//测试
public static void main(String[] args) {
Map map = new HashMap<>();
map.put("name", "laowang");
map.put("des", "shuaige");
String jsonString = JSONObject.toJSONString(map);
invokeUtils.postInvoke("www.ruanjianlaowang.com", jsonString);
}
}
说明:
(1)入参为json格式,调用时候,需要把对象或者数组转换成json格式;MediaType是:application/json; charset=UTF-8
(2)3个静态方法,postInvoke和getInvoke,根据传参调用invoke;
(3)post请求使用的是:rst.postForEntity(url, httpEntity, String.class);
(4)get请求使用是:responseEntity = rst.exchange(url, HttpMethod.GET, httpEntity, String.class);
(5)可以结合上节提到的@PostConstruct标签,实现静态方法调用service动态方法,将调用入参、返回参数、响应时间等入库。
2.3 代码验证
(1)map转json,如下图;
(2)调用前,header中是:application/json; charset=UTF-8,body中是:{"des":"shuaige","name":"laowang"},如下图:
更多信息请关注公众号:「软件老王」,关注不迷路,软件老王和他的IT朋友们,分享一些他们的技术见解和生活故事。