• Spring Boot REST(一)核心接口


    Spring Boot REST(一)核心接口

    Spring 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html)

    SpringBoot REST 系列相关的文章:

    1. SpringBoot REST(一)核心接口
    2. 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 包含以下几个部分:

    1. HttpMessageConverter 对象转换器
    2. ClientHttpRequestFactory 默认是 JDK 的 HttpURLConnection
    3. ResponseErrorHandler 异常处理
    4. ClientHttpRequestInterceptor 请求拦截器

    RestTemplate 结构

    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);  
    

    参考:

    1. 《REST访问(RestTemplate)》:https://rensanning.iteye.com/blog/2362105
    2. 《HTML 多媒体》:http://www.runoob.com/html/html-media.html

    每天用心记录一点点。内容也许不重要,但习惯很重要!

  • 相关阅读:
    利用calc()宽度计算做响应式布局
    设置背景图片后,使用backgroup-size出现的问题
    三、算法与控制结构
    C++数值计算
    python认识及环境变量
    Unity查找Editor下Project视图中特定的资源
    UGUI ScrollRect滑动居中CenterOnChild实现
    unity与android交互总结
    UGUI笔记
    UGUI性能优化
  • 原文地址:https://www.cnblogs.com/binarylei/p/10349067.html
Copyright © 2020-2023  润新知