import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory factory){
return new RestTemplate(factory);
}
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setReadTimeout(10000);//单位为ms
factory.setConnectTimeout(10000);//单位为ms
return factory;
}
}
接下来我要调用127.0.0.1:8081里面的内容
Get方法操作:
第一种、首先get调用不附带参数
//要被调用的方法
@GetMapping("/rest/get1")
@ResponseBody
public String getResult(){
return "SUCCESS";
}
/**
* 调用者
* @return
*/
@ResponseBody
@RequestMapping(params = "getMsgTest1")
public Result restTemplate() {
try {
String url="http://127.0.0.1:8081/rest/get1";
ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class);
//获取3方接口返回的数据通过entity.getBody();它返回的是一个字符串;
System.err.println(forEntity);
return Result.ok(forEntity);
} catch (Exception e) {
return Result.fail(e.getMessage());
}
}
返回结果如下
第二种、get调用附带参数
//被调用者
@GetMapping("/rest/get2")
@ResponseBody
public String getResult1(String name){
return "SUCCESS"+name;
}
/**
*调用者,请求后面加参数
* @return
*/
@ResponseBody
@RequestMapping(params = "getMsgTest2")
public Result restTemplate2() {
try {
String url="http://127.0.0.1:8081/rest/get2?name=sbbb";
ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class);
System.err.println(forEntity);
return Result.ok(forEntity);
} catch (Exception e) {
return Result.fail(e.getMessage());
}
}
返回结果如下
第三种,get请求,URL后面多个参数
//被调用者
@GetMapping("/rest/get3")
@ResponseBody
public String getResult3(SysMenuEntity menu){
return "SUCCESS"+menu.toString();
}
//注意这里接收参数可以用字段来接收,也可以用对象来接收,但是不能加@RequestBody注解
@ResponseBody
@RequestMapping(params = "getMsgTest3")
public Result restTemplate3() {
try {
String url="http://127.0.0.1:8081/rest/get3?name=测试&type=1";
ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class);
System.err.println(forEntity);
return Result.ok(forEntity);
} catch (Exception e) {
return Result.fail(e.getMessage());
}
}
get在后面添加多个参数比较麻烦的时候,直接用map
//被调用者,用字段或者实体类都可以接收,记得不要加@RequestBody注解
@RequestMapping("/getParams")
public Result getTest(SysMenuEntity menu) {
return Result.ok(menu.toString());
}
//调用者
@ResponseBody
@RequestMapping(params="getTest")
public Result getTest() {
String url="http://127.0.0.1:8081/getParams?name={name}&id={id}";
ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class,"test",5);
System.err.println(forEntity.toString());
return Result.ok(forEntity);
}
//或者
@ResponseBody
@RequestMapping(params="getTest")
public Result getTest() {
Map<String,Object> map = new HashMap<>();
map.put("name", "test");
map.put("id", 5);
String url="http://127.0.0.1:8081/getParams?name={name}&id={id}";
ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class,map);
System.err.println(forEntity.toString());
return Result.ok(forEntity);
}
总结,get调用方式都差不多
POST方法操作
//被调用者 注意这里要加上@RequestBody注解来接收
@PostMapping("/rest/get4")
@ResponseBody
public String getResult4(@RequestBody SysMenuEntity menu){
return "SUCCESS"+menu.toString();
}
//调用者
@ResponseBody
@RequestMapping(params = "getMsgTest4")
public Result restTemplate4() {
try {
String url="http://127.0.0.1:8081/rest/get4";
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
headers.setContentType(type);
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", "1");
map.put("name", "文件原名称");
HttpEntity<Map<String, Object>> request = new HttpEntity<Map<String, Object>>(map, headers);
ResponseEntity<String> entity = restTemplate.postForEntity(url, request, String.class);
System.err.println(entity);
return Result.ok(entity);
} catch (Exception e) {
return Result.fail(e.getMessage());
}
}
返回结果如下
说一下restTemplate.postForEntity 和restTemplate.postForObject的区别
前者就像上图一下获取信息较为详细,而后者则是获取上面信息里面的body
实操代码
//统一封装请求
public Result getResult(String url,Map<String,Object> map) {
try {
HttpHeaders headers = new HttpHeaders();
//定义请求参数类型,这里用json所以是MediaType.APPLICATION_JSON
//headers.setContentType(MediaType.APPLICATION_JSON);
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
headers.setContentType(type);
//RestTemplate带参传的时候要用HttpEntity<?>对象传递
HttpEntity<Map<String, Object>> request = new HttpEntity<Map<String, Object>>(map, headers);
ResponseEntity<String> entity = restTemplate.postForEntity(url, request, String.class);
//获取3方接口返回的数据通过entity.getBody();它返回的是一个字符串;
String body = entity.getBody();
JSONObject json = JSONObject.parseObject(new String(body));
return Result.ok(json);
} catch (Exception e) {
return Result.fail(e.getMessage());
}
}
实际调用
/**
*注意点:参数类型必须对应,不然提示缺少参数
* 控制密集架点击区的时候获取温度湿度
* @param request
* @return
*/
@ResponseBody
@RequestMapping(params="ReportStatus")
public Result ReportStatus(HttpServletRequest request) {
String id = request.getParameter("id");
Map<String, Object> dbData = commonService.findOneForJdbc(" select * from warehousesettingtree where id = ?",id);
int QuNo = Integer.parseInt(dbData.get("area_code").toString());
String serverIp=dbData.get("server_num").toString();
String port = dbData.get("http_port").toString();
String StoreCode = dbData.get("warehousecode").toString();
String url="http://"+serverIp+":"+port+"/IntelligentCabinetAPIServer/ReportStatus";
Map<String, Object> map = new HashMap<String, Object>();
map.put("StoreCode", StoreCode);//库码 string
map.put("QuNo",QuNo);//区号 int
Result result = getResult(url, map);
System.err.println("获取温湿度:"+result);
return result;
}