RestTemplate是spring提供的Http协议实现类。也就是说导入spring-boot-starter-web的项目可以直接使用RestTemplate类,就是基于模板方法设计模式的,封装了所有需要使用的API
在该类中主要针对6类请求方式封装的方法。
HTTP method | RestTemplate methods |
DELETE | delete |
GET | getForObject |
PUT | put |
POST | postForLocation |
对于springboot,声明一个Bean,使用时注入这个bean即可
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
@Autowired
private RestTemplate restTemplate;
在jsp项目,使用一个静态方法返回 restTemplate
/**
* 创建指定字符集的RestTemplate
*
* @param charset 编码
* @return 返回结果
*/
public static RestTemplate getInstance(String charset) {
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new StringHttpMessageConverter(Charset.forName(charset)));
return restTemplate;
}
get方式提供了两个方法:
getForObject:把响应体直接转换为对象。该方法返回值为特定类类型。舍弃了Response Header的东西,但是用起来比getForEntity方便。如果只需要获取响应体中内容(调用控制器方法的返回值)使用此方法。
getForEntity:返回值包含响应头和响应体。用起来比getForObject稍微麻烦一些。
getForEntity和getForObject除了返回值不一样以外,其他用法完全相同。
@RestController
public class ServerController {
@GetMapping(value = "/demo1")
public String demo1(){
return "demo1";
}
}
@Test
void testGetForObject() {
RestTemplate restTemplate = new RestTemplate();
// 第二个参数是请求控制器响应内容类型。决定getForObject方法返回值类型。
String result = restTemplate.getForObject("http://localhost:8080/demo1", String.class);
System.out.println(result);
}
@Test
void testGetForEntity(){
RestTemplate restTemplate = new RestTemplate();
// getForEntity第二个参数类型决定了ResponseEntity泛型类型,表示相应体中内容类型。
ResponseEntity result = restTemplate.getForEntity("http://localhost:8080/demo1", String.class);
// 取出相应体内容。
System.out.println(result.getBody());
// 取出请求状态码。
System.out.println(result.getStatusCode());
// 通过getHeaders()取出响应头中想要的信息,以ContentType举例。
System.out.println(result.getHeaders().getContentType());
}
@RequestMapping("/demo2")
public String demo2(String name,int age){
return "name:"+name+",age:"+age;
}
添加测试方法
getForObject第一个参数URL中使用URL重写方式包含请求参数。参数后面使用{序号}格式进行占位,序号。从1开始。
注意:getForObject第三个开始的参数顺序要和序号严格对应
@Test
void testGetForObjectWithParam(){
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.getForObject("http://localhost:8080/demo2?age={1}&name={2}", String.class, 123, "张三");
System.out.println(result);
}
根据占位符{key}进行对应,占位符中key的内容就是Map中key对应的Value
@Test
void testGetForObjectWithMapParam(){
RestTemplate restTemplate = new RestTemplate();
Map map = new HashMap<>();
map.put("age",15);
map.put("name","map传参");
String result = restTemplate.getForObject("http://localhost:8080/demo2?age={age}&name={name}", String.class, map);
System.out.println(result);
}
@RequestMapping("/demo3/{name}/{age}")
public String demo3(@PathVariable String name,@PathVariable int age){
return "restfule:name:"+name+",age:"+age;
}
@Test
void testGetForObjectRestful() {
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.getForObject("http://localhost:8080/demo3/张三/12", String.class);
System.out.println(result);
}
其他后续用到再说