三、详解restTemplate

RestTemplate概览
  • 借助 RestTemplate,Spring应用能够方便地使用REST资源,Spring的 RestTemplate访问使用了模版方法的设计模式.

  • RestTemplate定义了36个与REST资源交互的方法,其中的大多数都对应于HTTP的方法。 其实,这里面只有11个独立的方法,其中有十个有三种重载形式,而第十一个则重载了六次,这样一共形成了36个方法。

    • getForEntity() 发送一个HTTP GET请求,返回的ResponseEntity包含了响应体所映射成的对象

    • getForObject() 发送一个HTTP GET请求,返回的请求体将映射为一个对象

    • postForEntity() POST 数据到一个URL,返回包含一个对象的ResponseEntity,这个对象是从响应体中映射得到的

    • postForObject() POST 数据到一个URL,返回根据响应体匹配形成的对象

    • delete() 在特定的URL上对资源执行HTTP DELETE操作

    • exchange() 在URL上执行特定的HTTP方法,返回包含对象的ResponseEntity,这个对象是从响应体中
      映射得到的

    • execute() 在URL上执行特定的HTTP方法,返回一个从响应体映射得到的对象

    • postForObject() POST 数据到一个URL,返回根据响应体匹配形成的对象

    • headForHeaders() 发送HTTP HEAD请求,返回包含特定资源URL的HTTP头

    • optionsForAllow() 发送HTTP OPTIONS请求,返回对特定URL的Allow头信息

    • postForLocation() POST 数据到一个URL,返回新创建资源的URL

    • put() PUT 资源到特定的URL

测试之前首先创建一个Rest服务,这里给出controller层代码
@RestController
public class UserController {
    @Autowired
    private UserService userService;
 
    @RequestMapping(value = "getAll")
    public List<UserEntity> getUser() {
        List<UserEntity> list = userService.getAll();
        return list;
    }
 
    @RequestMapping("get/{id}")
    public UserEntity getById(@PathVariable(name = "id") String id) {
        return userService.getById(id);
    }
 
 
    @RequestMapping(value = "save")
    public String save(UserEntity userEntity) {
        return "保存成功";
    }
 
 
    @RequestMapping(value = "saveByType/{type}")
    public String saveByType(UserEntity userEntity,@PathVariable("type")String type) {
        return "保存成功,type="+type;
    }
}
get请求:

RestTemplate的get方法有:getForEntity()和getForObject()

  • 无参数的getForEntity
@RequestMapping("getForEntity")
public List<UserEntity> getAll2() {
	ResponseEntity<List> responseEntity = 					       restTemplate.getForEntity("http://localhost/getAll", List.class);
    HttpHeaders headers = responseEntity.getHeaders();
    HttpStatus statusCode = responseEntity.getStatusCode();
    int code = statusCode.value();
    List<UserEntity> list = responseEntity.getBody();
  
    System.out.println(list.toString());
    return list;
}
  • 有参数的getForEntity,参数列表使用{}进行url路径占位符
//有参数的 getForEntity 请求,参数列表
@RequestMapping("getForEntity/{id}")
public UserEntity getById2(@PathVariable(name = "id") String id) {
	ResponseEntity<UserEntity> responseEntity = 		restTemplate.getForEntity("http://localhost/get/{id}", UserEntity.class, id);
    UserEntity userEntity = responseEntity.getBody();
    return userEntity;
    }
  • 有参数的getForEntity,参数使用map封装
//有参数的 get 请求,使用map封装参数
@RequestMapping("getForEntity/{id}")
public UserEntity getById4(@PathVariable(name = "id") String id) {
     HashMap<String, String> map = new HashMap<>();
     map.put("id",id);
     ResponseEntity<UserEntity> responseEntity = restTemplate.getForEntity("http://localhost/get/{id}", UserEntity.class, map);
     UserEntity userEntity = responseEntity.getBody();
     return userEntity;
    }
  • 但是,通常情况下我们并不想要Http请求的全部信息,只需要相应体即可.对于这种情况,RestTemplate提供了 getForObject() 方法用来只获取 响应体信息. getForObject 和 getForEntity 用法几乎相同,指示返回值返回的是 响应体,省去了我们 再去 getBody() .

  • 无参数的getForObject

//无参数的 getForObject 请求
@RequestMapping("getAll2")
public List<UserEntity> getAll() {
	List<UserEntity> list = restTemplate.getForObject("http://localhost/getAll", List.class);
	System.out.println(list.toString());
	return list;
}
  • 有参数的 getForObject 请求,使用参数列表
//有参数的 getForObject 请求
@RequestMapping("get2/{id}")
public UserEntity getById(@PathVariable(name = "id") String id) {
   UserEntity userEntity = restTemplate.getForObject("http://localhost/get/{id}", UserEntity.class, id);
   return userEntity;
}
  • 有参数的 get 请求,使用map封装请求参数
//有参数的 get 请求,使用map封装请求参数
@RequestMapping("get3/{id}")
public UserEntity getById3(@PathVariable(name = "id") String id) {
    HashMap<String, String> map = new HashMap<>();
    map.put("id",id);
    UserEntity userEntity = restTemplate.getForObject("http://localhost/get/{id}", UserEntity.class, map);
    return userEntity;
}
Post请求
  • 无参数的postForEntity
//post 请求,提交 UserEntity 对像
@RequestMapping("saveUser")
public String save(UserEntity userEntity) {
	ResponseEntity<String> responseEntity = 		restTemplate.postForEntity("http://localhost/save", userEntity, String.class);
	String body = responseEntity.getBody();
    return body;
    }
  • 有参数的postForEntity
// 有参数的 postForEntity 请求
@RequestMapping("saveUserByType/{type}")
public String save2(UserEntity userEntity,@PathVariable("type")String type) {
   ResponseEntity<String> responseEntity = restTemplate.postForEntity("http://localhost/saveByType/{type}", userEntity, String.class, type);
   String body = responseEntity.getBody();
   return body;
}

// 有参数的 postForEntity 请求,使用map封装
@RequestMapping("saveUserByType2/{type}")
public String save3(UserEntity userEntity,@PathVariable("type")String type) {
    HashMap<String, String> map = new HashMap<>();
    map.put("type", type);
	ResponseEntity<String> responseEntity = restTemplate.postForEntity("http://localhost/saveByType/{type}", userEntity, String.class,map);
    String body = responseEntity.getBody();
    return body;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值