Springboot提供的RestTemplate可以进行微服务之间的接口调用,在实际的开发中用到的比较多,这里做一个简单的总结
一、使用postForObject()方法传参
1、当服务消费者传参为实体类对象时,
//服务消费者方法
@ResponseBody
@RequestMapping("/entity")
public Object testRestTemplate() {
Student student = new Student();
student.setId("001");
student.setName("jack");
student.setAge(20);
String url = "http://127.0.0.1:8091/orderService/service/entity";
//使用postForObject(String url,Object request,Class<T> responseType)
String result = restTemplate.postForObject(url,student,String.class);
System.out.println("返回数据:" + result);
return result;
}
//服务提供者方法(接口)
/**
* 当RestTemplate传递实体类Entity为参数时,
* 使用@RequestBody()Entity entity进行接收;
* 也可以使用@RequestBody() Map<String,Object> map 进行接收
* 使用@RequestBody()JSONObject jsonObj进行接收
*
* HttpServletRequest接收为null
* 使用 String id,String name.....接收也为null
* @param student
* @return
*/
@ResponseBody
@RequestMapping("/entity")
public String testRestTemplate(@RequestBody(required = false) Student student) {
System.out.println("对象 接收请求参数:"+student);
student.setName("tom");
return "实体类对象"+student;
}
2、当服务消费者传参为JSON对象时
//服务消费者方法
@ResponseBody
@RequestMapping("/jsonEntity")
public String testRestTemplate02() {
JSONObject jsonObj = new JSONObject();
jsonObj.put("id", "001");
jsonObj.put("name", "jack");
jsonObj.put("age", 20);
String url = "http://127.0.0.1:8091/orderService/service/jsonEntity";
String result = restTemplate.postForObject(url, jsonObj, String.class);
System.out.println("返回数据:" + result);
return result;
}
//服务提供者方法(接口)
/**
* 当RestTemplate传递JSON对象为参数,
* 使用@RequestBody() Entity entity可以进行接收
* 使用@RequestBody() Map<String,Object> map可以进行接收
* 使用@RequestBody()JSONObject jsonObj进行接收
*
* 使用HttpServletRequest接收值为null,
* 使用String id,String name......接收值为Null
*
* @param request
* @return
*/
@ResponseBody
@RequestMapping("/jsonEntity")
public String testRestTemplate02(@RequestBody(required = false)Student student) {
System.out.println("json对象 接收请求参数:" + student)
return "json对象"+student;
}
3、当服务消费者传参为JSON字符串时
//服务消费者方法
@ResponseBody
@RequestMapping("/jsonEntityStr")
public String testRestTemplate03() {
JSONObject jsonObj = new JSONObject();
jsonObj.put("id", "001");
jsonObj.put("name", "jack");
jsonObj.put("age", 20);
//设置协议头
/*
* org.springframework.http.HttpEntity;
* org.springframework.http.HttpHeaders;
* org.springframework.http.MediaType;
*/
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
headers.setContentType(type);
//将要发送的数据和协议头放到请求体对象中,作为参数传递
HttpEntity<String> httpEntity = new HttpEntity<String>(jsonObj.toString(), headers);
String url = "http://127.0.0.1:8091/orderService/service/jsonEntityStr";
String result = restTemplate.postForObject(url, jsonObj.toString(), String.class);
System.out.println("返回请求参数:" + result);
return result;
}
//服务提供者方法(接口)
/**
* 当RestTemplate传递JSON字符串为参数,
* 需要先进行发送协议头设置
* 1、可使用@RequestBody() Entity entity 接收
* 2、使用@RequestBody() JSONObject jsonObj 接收
* 3、使用@RequestBody() Map<> map 接收
*
* 若使用HttpServletRequest接收,则接收值为Null
*使用String id,String name.....接收值为Null
*
* @param student
* @return
*/
@ResponseBody
@RequestMapping("/jsonEntityStr")
public String testRestTemplate03(@RequestBody(required = false)Map<String,Object> map) {
String name = map.get("name").toString();
System.out.println("json对象字符串 接收请求参数:"+ name );
//Student student = new Student();
return "json对象字符串"+name;
}
二、使用postForEntity()方法
postForEntity()方法和postForObject()方法的使用差不多,不同的地方在于返回值不一样,postForObject()返回的是我们设置的 Class responseType 的T类型对象
postForEntity()返回的是整个响应体对象
//服务消费者
@ResponseBody
@RequestMapping("/postForEntity")
public String getRestTemplate() {
Student student = new Student();
student.setId("001");
student.setName("jack");
student.setAge(20);
String url = "http://127.0.0.1:8091/orderService/service/entity";
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, student, String.class);
restTemplate.post
System.out.println("返回信息:"+responseEntity);
//返回信息:<200,实体类对象Student(id=001, name=tom, age=20),
// [Content-Type:"text/plain;
// charset=UTF-8", Content-Length:"48", Date:"Sun, 23 May 2021 07:00:57 GMT", Keep-Alive:"timeout=60", Connection:"keep-alive"]>
return null;
}
//服务提供者
@ResponseBody
@RequestMapping("/entity")
public String testRestTemplate(@RequestBody(required = false) Student student) {
System.out.println("对象 接收请求参数:"+student);
student.setName("tom");
return "实体类对象"+student;
}
输出内容如下:
三、getForObject()方法使用
//服务消费者方法
@ResponseBody
@RequestMapping("/getForObject")
public String getEntity() {
String url = "http://127.0.0.1:8091/orderService/service/getForObject?id=001&&name=tom&&age=34";
String result = restTemplate.getForObject(url,String.class);
System.out.println(result);
return result;
}
//服务提供者方法(接口)
/** 当传参方式为get方式时
* 使用HttpServletRequest request
* 使用String id,String name.....
* 使用@RequestBody() Map<> map
* @param name
* @return
*/
@ResponseBody
@RequestMapping("/getForObject")
public String testGetMethod(String id,String name){
return name;
}