1. 程式人生 > 其它 >第三天學習

第三天學習

RestTemplate

1.作用

​ RestTemplate是Spring提供的用於傳送HTTP請求的客戶端工具,它遵循Restful原則,RestTemplate預設依賴JDK的Http連線工具HttpUrlConnection,你也可以替換不同的源,比如OkHttp、Apache HttpComponents 等等。

2.SpringBoot整合RestTemplate,快速入門

1.匯入依賴

RestTemplate是spring的一個rest客戶端,在spring-web這個包下,spring boot的依賴如下

 <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
 </dependency>

2.新增配置類

@Configuration
public class WebConfig {

    @Bean
    public RestTemplate getRestTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        //解決中文亂碼
        restTemplate.getMessageConverters().set(1,new StringHttpMessageConverter(StandardCharsets.UTF_8));
        return restTemplate;
    }
}

3.注入RestTemplate使用

 @Autowired
 private RestTemplate restTemplate;

3.RestTemplate使用細節

3.1 get請求方法預覽

ForObject與ForEntity只有返回值型別不同,功能相同

/*forObject
            1.url請求路徑
            2.該url請求後返回型別,如果是一個實體類物件的json格式字串,可以直接幫你轉換成實體類物件
            3.uriVariables:URL後面接的引數http://localhost:8081/findById/1/lisi,可變參,可以不傳

  forEntity與forObject呼叫除了接收型別不一樣,其他都一樣
*/
 String forObject = restTemplate.getForObject("http://localhost:8081/findById/{id}/{name}", String.class,1,"lisi");

 ResponseEntity<String> forEntity = restTemplate.getForEntity("http://localhost:8081/findById/{id}", String.class, 1);

3.2 post方法請求預覽

 /*
    post請求請求體傳參
        1.url請求路徑
        2.請求引數(包括請求體與請求頭的引數)可以傳httpEntity,沒有可以傳null
        3.該url請求後返回型別,如果是一個實體類物件的json格式字串,可以直接幫你轉換成實體類物件
        4.uriVariables:URL後面接的引數http://localhost:8081/findById/1/lisi,可變參,可以不傳
         
    HttpEntity:http實體,建立時傳入請求體內容以及請求頭
    HttpHeaders:請求頭資訊直接new
           httpHeaders.add("token","tokenValue");新增頭資訊
           httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);設定請求引數型別,告知伺服器發的是什麼內容,以及編碼
    MediaType:常量類,MIME型別
*/
        //封裝請求體引數
        Map<Object,Object> body = new HashMap<>();
        body.put("id", 1);
        body.put("name", "張三");
        //封裝請求頭引數
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.add("token", "tokenValue");
        // 設定請求型別
        httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
        // 封裝引數和頭資訊
        HttpEntity<Map> httpEntity = new HttpEntity<>(body, httpHeaders);
        restTemplate.postForObject("http://www.baidu.com", httpEntity, String.class, 1, "lisi");
        

3.3 put請求方法預覽

3.4 delete請求方法預覽

4.ResponseEntity使用細節

4.1.接收RestTemplate中forEntity方法的請求結果

4.1.2 HttpStatus:狀態物件
ResponseEntity<String> entity = restTemplate.getForEntity("http://localhost:8081/findById/{id}/{name}",String.class, 1, "lisi");
 HttpStatus statusCode = entity.getStatusCode();
 String reasonPhrase = statusCode.getReasonPhrase();//獲取狀態描述
 int value = statusCode.value();//獲取狀態碼
 boolean flag = statusCode.is1xxInformational();//狀態碼是否是1開頭
 boolean flag = statusCode.is2xxSuccessful();//狀態碼是否是2開頭
 boolean flag = statusCode.is3xxRedirection();//狀態碼是否是3開頭
 boolean flag = statusCode.is4xxClientError();//狀態碼是否是4開頭
 boolean flag = statusCode.is5xxServerError();//狀態碼是否是5開頭

4.1.3 HttpHeaders:頭資訊物件

4.2.作為Controller方法的返回值型別

​ ResponseEntity標識整個http相應:狀態碼、頭部資訊以及相應體內容。因此我們可以使用其對http響應實現完整配置。僅使用@ResponseBody註解不能設定響應頭和響應狀態碼。

	@GetMapping("find")
    public ResponseEntity<Object> testResponseEneity(){
        return ResponseEntity.ok().build();
    }

可以通過程式設計方式指明響應狀態,所以根據不同場景返回不同狀態:

    @GetMapping("find")
    public ResponseEntity<Object> testResponseEneity(){
        if(1==1){
            return ResponseEntity.ok("該處可填寫響應體中內容");//ok代表狀態碼200 OK
        }
        //HttpStatus為列舉,其中聲明瞭常用響應碼與狀態描述
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
    }

另外,還可以設定http響應頭:

	@GetMapping("find")
    public ResponseEntity<Object> testResponseEneity(){
        return ResponseEntity.ok().header("token","tokenValue").build();
    }

ResponseEntity靜態方法:

BodyBuilder的方法: