Spring 系列目录 (https://www.cnblogs.com/binarylei/p/10117436.html)
SpringBoot REST 系列相关的文章:
SpringBoot REST(一) 核心接口
SpringBoot REST(二) 源码分析
一, Spring 中与 REST 相关的注解
Spring 有以下相关的注解:
- ## 定义相关
- |-- @Controller
- |-- @RestController
- ## 映射相关
- |-- @RequestMapping
- |-- @GetMapping
- |-- @PostMapping
- |-- @PathVariable
- ## 请求相关
- |-- @RequestBody
- |-- @RequestParam
- |-- @RequestHeader
- |-- @CookieValue
- |-- RequestEntity
- ## 定义相关
- |-- @ResponseBody
- |-- ResponseEntity
- 1.1 RestController
@RestController 相当于 @ResponseBody 和 @Controller 的组合.
- @Target(ElementType.TYPE)
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- @Controller
- @ResponseBody
- public @interface RestController {
- @AliasFor(annotation = Controller.class)
- String value() default "";
- }
使用如下, 可以省略 @ResponseBody 注解:
- @RestController
- public class HelloController {
- @RequestMapping("/v1/test")
- public String test1() {
- return "test";
- }
- }
1.2 请求路径映射相关的注解
- // @PathVariable 解析请求路径中的参数
- @RequestMapping("/v1/{city_id}/{user_id}")
- public String test2(@PathVariable("city_id") String cityId,
- @PathVariable(value = "user_id") String userId) {
- return cityId;
- }
1.3 请求相关的注解
- // 1. @RequestParam 请求的参数
- @GetMapping("/v1/test4")
- public String test4(@RequestParam(name = "user_id", defaultValue = "2") String userId) {
- return userId;
- }
- // 2. @RequestHeader 请求头中的参数
- @GetMapping("/v1/get_header")
- public String test6(@RequestHeader("access_token") String token) {
- return token;
- }
- // 3. @RequestBody 请求可能是 JSON 或 xml
- @GetMapping("/v1/test5")
- public String test5(@RequestBody User user) {
- return user.getUsername();
- }
1.4 响应相关的注解
没有使用 @RestController 情况下返回 JSON 等格式需要使用 @ResponseBody 注解
- @RequestMapping("/v1/test")
- @ResponseBody
- public String test1() {
- return "test";
- }
1.5 RequestEntity 和 ResponseEntity
- @GetMapping("/v1/entity")
- public ResponseEntity<String> test8() {
- return ResponseEntity.ok("hello, world!");
- }
二, 客户端 RestTemplate
经常需要发送一个 GET/POST 请求到其他系统 (REST API), 通过 JDK 自带的 HttpURLConnection,Apache HttpClient,Netty 4,OkHTTP 2/3 都可以实现.
HttpClient 的使用: http://rensanning.iteye.com/blog/1550436
RestTemplate 的使用: https://rensanning.iteye.com/blog/2362105
Spring 的 RestTemplate 封装了这些库的实现, 使用起来更简洁.
RestTemplate 包含以下几个部分:
HttpMessageConverter
对象转换器
ClientHttpRequestFactory
默认是 JDK 的 HttpURLConnection
ResponseErrorHandler
异常处理
ClientHttpRequestInterceptor
请求拦截器
2.1 发送 GET 请求 getForObject(),getForEntity(),exchange()
- // 1. getForObject()
- User user1 = this.restTemplate.getForObject(uri, User.class);
- // 2. getForEntity()
- ResponseEntity<User> responseEntity1 = this.restTemplate.getForEntity(uri, User.class);
- HttpStatus statusCode = responseEntity1.getStatusCode();
- HttpHeaders header = responseEntity1.getHeaders();
- User user2 = responseEntity1.getBody();
- // 3. exchange()
- RequestEntity requestEntity = RequestEntity.get(new URI(uri)).build();
- ResponseEntity<User> responseEntity2 = this.restTemplate.exchange(requestEntity, User.class);
- User user3 = responseEntity2.getBody();
2.2 发送 POST 请求 postForObject(),postForEntity(),exchange()
- // 1. postForObject()
- User user1 = this.restTemplate.postForObject(uri, user, User.class);
- // 2. postForEntity()
- ResponseEntity<User> responseEntity1 = this.restTemplate.postForEntity(uri, user, User.class);
- // 3. exchange()
- RequestEntity<User> requestEntity = RequestEntity.post(new URI(uri)).body(user);
- ResponseEntity<User> responseEntity2 = this.restTemplate.exchange(requestEntity, User.class);
参考:
《REST 访问 (RestTemplate)》: https://rensanning.iteye.com/blog/2362105
《HTML 多媒体》: http://www.runoob.com/html/html-media.html
每天用心记录一点点. 内容也许不重要, 但习惯很重要!
来源: http://www.bubuko.com/infodetail-2943084.html