如果是spring框架,需要引入包:
pom文件引用依赖:
<dependency>
<groupId>org.apache.httpcomponentsgroupId>
<artifactId>httpclientartifactId>
<version>4.5.3version>
dependency>
编写一个RestTemplateUtil工具类,继承“RestTemplate”类并重写用到的方法;
如果项目是springboot架构,第一步请忽略。
public class RestTemplateUtil {
private static final Logger logger = LoggerFactory.getLogger(RestTemplateUtil.class);
/**
* 1)url: 请求地址;
* 2)method: 请求类型(如:POST,PUT,DELETE,GET);
* 3)requestEntity: 请求实体,封装请求头,请求内容
* 4)responseType: 响应类型,根据服务接口的返回类型决定
* 5)uriVariables: url中参数变量值
*/
public static <T> ResponseEntity sendRequest(String url, HttpMethod method, T requestEntity, Class responseType, Object... uriVariables, String w3Account) {
RestTemplate restTemplate=new RestTemplate();
// 设置请求头:ContentType、Token、Cookie、User-Agent
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("application/json");
headers.setContentType(type);
//这是请求头里的一些参数配置,结合自己的情况填写。
headers.set("userName",w3Account);
headers.set("clientType","ISCENARIO");
headers.set("requestId","c021ec9f-11dd-47f7-bb2b-01bae5388779");
HttpEntity<T> entity = new HttpEntity<T>(requestEntity, headers);
// 响应默认返回类型为String
responseType = (responseType == null ? String.class : responseType);
ResponseEntity response = null;
try {
if(null == uriVariables) {
response = restTemplate.exchange(url, method, entity, responseType);
} else {
response = restTemplate.exchange(url, method, entity, responseType, uriVariables);
}
}
catch (RestClientException e) {
logger.error("Send request to the url:{} error.", url);
}
return response;
}
}
我这边业务传入的数据是JSON串,如果对象直接传入即可。
//将数据发送给远端
Map<String,Object> data = new HashMap();
String dataStr = JSON.toJSONString(data, true);
JSONObject json = JSONObject.parseObject(dataStr);
String url = String.valueOf(properties.get("url"));
logger.info("=====请求参数=====>>"+url+"\n"+json);
ResponseEntity<Map> result = RestTemplateUtil.sendRequest(url,HttpMethod.POST,json,Map.class,null,null);
logger.info("====调用返回结果=====>>"+result.getBody());
GET/POST请求参数调用方式(封装参数到url)
方式一:这种方式如果遇到参数类型是Long、Integer的会将null值转换为字符串“null”,导致调用出错,可以采取第二种方式
@GetMapping("/getEmployeeInfo")
public Map<String,Object> getEmployeeInfo(@RequestParam("windField") String windField, @RequestParam("windCode") String windCode,
@RequestParam("start") Integer start, @RequestParam("length") Integer length){
URI url = null;
// 将参数放入键值对类NameValuePair中,再放入集合中,封装url
List<NameValuePair> params = new ArrayList<>();
params.add(new BasicNameValuePair("windField", windField));
params.add(new BasicNameValuePair("windCode", windCode));
params.add(new BasicNameValuePair("start", start.toString()));
params.add(new BasicNameValuePair("length", length.toString()));
try {
url = new URIBuilder().setScheme("http").setHost("172.0.0.1").setPort(8080).setPath("/TEST").setParameters(params).build();
} catch (URISyntaxException e) {
e.printStackTrace();
}
ResponseEntity<Map> responseEntity = HttpClientUtil.sendRequest(url.toString(), HttpMethod.GET, null, Map.class, null);
return responseEntity.getBody();
}
方式二:利用占位符去处理参数
@GetMapping("/queryLateInfoCollect")
public ResponseData getLateInfoCollect(@RequestParam("flag") Integer flag, @RequestParam("startTime") Long startTime, @RequestParam("endTime") Long endTime, @RequestParam("start") Integer start, @RequestParam("length") Integer length){
String url ="http://172.0.0.1:8008/TEST?flag={flag}&startTime={startTime}&endTime={endTime}&start={start}&length={length}";
ResponseEntity<ResponseData> responseEntity = HttpClientUtil.sendRequest(url, HttpMethod.GET, null, ResponseData.class, flag,startTime,endTime,start,length);
return responseEntity.getBody();
}
参考:https://www.cnblogs.com/wwct/p/12325173.html