Spring Boot REST(一)核心接口
阿新 • • 發佈:2019-02-02
var pathvaria ont stc int nec 截器 san acc
Spring Boot REST(一)核心接口
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 的 HttpURLConnectionResponseErrorHandler
異常處理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
每天用心記錄一點點。內容也許不重要,但習慣很重要!
Spring Boot REST(一)核心接口