RestTemplate位於spring-web
模塊,org.springframework.web.client
包下,是Spring同步客戶端HTTP訪問的核心類,它強制使用Restful原則來簡化和HTTP服務端的交互。它處理HTTP連接,分離應用程序代碼來提供URL(可能需要很少的模板變量)和提取結果。
注意:默認,RestTemplete依賴標准的JDK工具類來建立HTTP連接,你可以通過setRequestFactory
屬性使用不同的HTTP庫來替換他,比如Apache HttpComponent,Netty和OkHttp.
另外,exchange
和execute
方法是以上方法的通用版本能夠用於支持額外的較少使用的組合(例如:HTTP PARCH,攜帶響應體的HTTP PUT),但是請注意,所使用的基礎HTTP庫也必須支持所需的組合。
每一個HTTP方法都有三個變種:兩個接收一個URI的模板字符串和URI變量(數組和變量),第三種接收一個URI,請注意,對於URI模板,嘉定必須進行編碼。 eg: restTemplate.getForObject("https://example.com/hotel list")
會變成https://example.com/hotel%20list
這也意味着,如果URI模板或URI變量已被編碼,則會發生雙重編碼 eg: https://example.com/hotel%20list
變成了https://example.com/hotel%2520list
為了避免這種情況,請使用URI
方法變體來提供(或重新使用)以前編碼的URI。 要准備完全控制編碼的URI,請考慮使用org.springframework.web.util.UriComponentsBuilder
.
在內部模板使用HttpMessageConverter
實例在POJO之間來回轉換HTTP消息。 默認情況下,通過setMessageConverters
已注冊主要mime類型的轉換器,但您也可以注冊其他轉換器.
該模板使用org.springframework.http.client.SimpleClientHttpRequestFactory
和DefaultResponseErrorHandler
作為分別創建HTTP連接或處理HTTP錯誤的默認策略。 可以分別通過setRequestFactory
和setErrorHandler
覆蓋這些默認值。
Demo
引入Maven依賴
<properties> <!-- JDK版本 --> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>1.5.22.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>1.5.22.RELEASE</version> <scope>test</scope> </dependency> </dependencies>
創建消息實體類
public class MsgBean { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "MsgBean{" + "id=" + id + ", name='" + name + '\'' + '}'; } }
創建SpringBoot運行主類
@SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
創建RestTemplate配置類,獲取TestTemplate對象
@Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate(ClientHttpRequestFactory factory) { return new RestTemplate(factory); } @Bean public ClientHttpRequestFactory simpleClientHttpRequestFactory() { SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); factory.setReadTimeout(5000);//5秒 factory.setConnectTimeout(15000);//15秒 return factory; } }
創建被調用服務類ServerController,來模擬一個微服務,可通過restful API調用
/** * Created by fubin on 2019/9/24. * 被調用的controller */ @RestController @RequestMapping("server") public class ServerController { @GetMapping("/get") public MsgBean get(){ MsgBean msgBean = new MsgBean(); msgBean.setId(1); msgBean.setName("msg1"); return msgBean; } @PostMapping("/post") public MsgBean post(){ MsgBean msgBean = new MsgBean(); msgBean.setId(1); msgBean.setName("msg1"); return msgBean; } /** * post 方法傳值 * @param id * @param name * @return */ @PostMapping("/postParam") public String postParam(@RequestParam("id") String id, @RequestParam("name") String name){ System.out.println("Post id:"+id); System.out.println("Post name:"+name); return "post succ"; } /** * post 方法傳值 * @param id * @param name * @return */ @PutMapping("/put") public String put(@RequestParam("id") String id,@RequestParam("name") String name){ System.out.println("put id:"+id); System.out.println("put name:"+name); return "del succ"; } /** * del方法傳值 * @param id * @return */ @DeleteMapping("/del") public String del(@RequestParam("id") String id){ System.out.println("del id:"+id); return "del succ"; } }
創建一個服務調用類InvokeController,通過RestRemplate調用ServerController的服務