<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ### 13.2.3 REST Client 上一章講到如何在SpringBoot中提供RESTfull服務,本章將介紹系統之間,如何發起REST請求。 SpringBoot提供了RestTemplate來輔助發起一個REST請求,默認通過JDK自帶的HttpURLConnection來作為底層HTTP消息的發送,使用JackSon 來序列化服務器響應的JSON數據 #### 13.2.3.1 RestTemplate RestTemplate是核心類,提供了所有訪問Rest服務的接口,盡管實際上可以使用HTTP Client類或者java.net.URL 來完成,但RestTemplate提供了Restful風格的的API。 RestTemplate有6個主要得方法對應于Restful的6個主要得Http Method。 | HTTP Method | Java API | | ----------- | ----------------------------- | | DELETE | delete | | GET | getForObject,getForEntity | | HEAD | headForHeaders | | OPTIONS | optionsForAllow | | POST | postForObject,postForLocation | | PUT | put | | 其他 | exchange(通用) | SpringBoot 提供了RestTemplateBuilder來創建一個RestTemplat。應用可以通過如下代碼來創建一個RestTemplate實例 ~~~java @Autowired RestTemplateBuilder restTemplateBuilder; public void foo(){ RestTemplate client = restTemplateBuilder.build(); } ~~~ 下面列舉一下使用RestTemplate來查詢訂單和創建訂單 ~~~java /*一個測試類*/ @Controller @RequestMapping("/test") public class RestClientTestCrontroller { @Value(value = "${api.order}") String base ; @Autowired RestTemplateBuilder restTemplateBuilder; @GetMapping("/get/{orderId}") public @ResponseBody Order testGetOrder(@PathVariable String orderId) throws Exception{ RestTemplate client = restTemplateBuilder.build(); String uri = base+"/order/{orderId}"; //核心代碼 Order order = client.getForObject(uri, Order.class,orderId); return order; } } ~~~ base是在配置文件application.properties中配置的訂單API地址 ~~~properties api.order=http://127.0.0.1:8080/api/v1 ~~~ 代碼首先構造RestTemplate,然后調用getForObject,此方法接受三個參數,第一個是URI 模板,第二個參數是期望返回的對象,后面是URI模板對應的參數列表。參數列表既可以是數組,也可以是個Map,如上有可以寫成 ~~~java Map map = new HashMap(); map.put("orderId",orderId); Order order = client.getForObject(uri, Order.class,map); ~~~ 如果還想獲取響應的HTTP頭相關信息,可以調用client.getForEntity,此方法返回ResponseEntity,包含了頭信息 ~~~java ResponseEntity<Order> responseEntity = client.getForEntity(uri, Order.class, orderId); Order order = responseEntity.getBody(); HttpHeaders headers = responseEntity.getHeaders(); ~~~ 添加訂單可以使用postForObject方法,此方法接受三個參數,第一個是URI,第二個是Post參數,可以是HttpEntity,或者是某個POJO對象,POJO對象在這種情況下回自動轉成HTTPEntity,第三個參數是期望返回的類型,這個例子期望返回類型是String ~~~java @GetMapping("/addorder") public @ResponseBody String testAddOrder() throws Exception{ RestTemplate client = restTemplateBuilder.build(); String uri = base+"/order"; Order order = new Order(); order.setName("test"); String ret = client.postForObject(uri, order, String.class); //{success:true,message:"添加成功"} return ret; } ~~~ 或者使用HttpEntity ~~~java HttpEntity<Order> body = new HttpEntity<Order>(order); String ret = client.postForObject(uri, body, String.class); ~~~ 使用HttpEnity的好處是可以提供額外的HTTP頭信息。 如果期望返回的類型是一個列表,如List<Order>,不能簡單調用xxxForObject,因為存在泛型的類型擦除,RestTemplate在反序列化的時候并不知道實際反序列化的類型,因此可以使用ParameterizedTypeReference來包含泛型類型,代碼如下 ```java RestTemplate client = restTemplateBuilder.build(); //根據條件查詢一組訂單 String uri = base+"/orders?offset={offset}"; Integer offset = 1; //無參數 HttpEntity body = null; ParameterizedTypeReference<List<Order>> typeRef = new ParameterizedTypeReference<List<Order>>() {}; ResponseEntity<List<Order>> rs = client.exchange(uri, HttpMethod.GET, body, typeRef, offset); List<Order> order = rs.getBody(); ``` 注意到typeRef實際定義是用{}結束,這里實際上創建了一個ParameterizedTypeReference子類,依據在類定義中的泛型信息是保留的原則,typeRef保留了期望返回的泛型List<Order> exchange 是一個基礎的Rest調用接口,除了需要指明HTTP Method外,調用跟其他方法都類似。 > 除了使用ParameterizedTypeReference來保留泛型信息外,也可以通過getForObject方法先映射成String,然后通過ObjectMapper來轉為指定類型,可以參考第三章Jackson來了解。 #### 13.2.3.2 定制 RestTemplate 創建一個配置類實現RestTemplateCustomizer接口的customize方法,此方法會 ~~~java @Configuration public class RestConf implements RestTemplateCustomizer { public void customize(RestTemplate restTemplate) { SimpleClientHttpRequestFactory jdkHttp = (SimpleClientHttpRequestFactory)restTemplate.getRequestFactory(); jdkHttp.setConnectTimeout(1000); } } ~~~ 如上代碼,customize方法會定制RestTemplate,上面的代碼設置鏈接超時時間為1000毫秒。Spring Boot因為默認使用了JDK的URLConnection作為底層的HTTP工具,如果想使用了OkHttp。需要添加如下依賴 ~~~xml <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.0.1</version> </dependency> ~~~ 那上面的代碼應該是 ~~~java public void customize(RestTemplate restTemplate) { OkHttp3ClientHttpRequestFactory okHttp = (OkHttp3ClientHttpRequestFactory)restTemplate.getRequestFactory(); okHttp.setReadTimeout(5000); okHttp.setWriteTimeout(3000); } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看