本篇內容來自翟永超的《Springcloud微服務實戰》,轉載請注明。
一、GET請求
在RestTemplate中,對GET請求可以通過如下兩個方法進行調用實現。
第一種:getForEntity函數。
該方法返回的是ResponseEntity,該對象是Spring對HTTP請求響應的封裝,其中主要存儲了HTTP的幾個重要元素,比如HTTP請求狀態碼的枚舉對象HttpStatus(也就是我們常說的404、500這些錯誤碼)、在它的父類HttpEntity中還存儲着HTTP請求的頭信息對象HttpHeaders以及泛型類型的請求體對象。
比如下面的例子,就是訪問USER-SERVER服務的/user請求,同時最后一個參數didi會替換url中的{1}占位符,而返回的ResponseEntity對象中的body內容類型會根據第二個參數轉換為String類型。
RestTemplaterestTemplate=newRestTemplate(); ResponseEntity<String>responseEntity=restTemplate.getForEntity("http://USERSERVICE/user?name={1}",String.class,"didi"); Stringbody=responseEntity.getBody();
若我們希望返回的body是一個User對象類型,也可以這樣實現:
RestTemplaterestTemplate=newRestTemplate(); ResponseEntity<User>responseEntity=restTemplate.getForEntity("http://USERSERVICE/user?name={1}",User.class,"didi"); Userbody=responseEntity.getBody();
上面的例子是比較常用的方法,getForEntity函數實際上提供了以下三種不同的重載實現。
1.getForEntity(Stringurl,Class responseType,Object...urlVariables):
該方法提供了三個參數,其中url為請求的地址,responseType為請求響應體body的包裝類型,urlVariables為url中的參數綁定。GET請求的參數綁定通常使用url中拼接的方式,
比如http://USER-SERVICE/user?name=did我們可以像這樣自已將參數拼接到url中,但更好的方法是在url中使用占位符並配合urlVariables參數實現GET請求的參數綁定,比如url定義為htip://USER-SERVICE/user?name={1},然后可以這樣來調用:
getForEntity("http://USER-SERVICE/user?name={1}",String.class,"didi")'其中第三個參數didi會替換url中的{1}占位符。
這里需要注意的是,由於urlVariables參數是一個數組,所以它的順序會對應url中占位符定義的數字順序。
2.getForEntity(String url,Class responseType,Map urlVariables):
該方法提供的參數中,只有urlVariables的參數類型與上面的方法不同。這里使用了Map類型,所以使用該方法進行參數綁定時需要在占位符中指定Map中參
數的key值,比如url定義為http://USER-SERVICE/user?name={name),在Map類型的urlVariables中,我們就需要put一個key為name的參數來綁
定url中{name}占位符的值,比如:
RestTemplate restTemplate=new RestTemplate(); Map<String,String> params=new HashMap<>(); params.put("name","dada"); ResponseEntity<String> responseEntity=restTemplate.getForEntity("http://USERSERVICE/user?name={name}",String.class,params);
3.getForEntity(URI url,Class responseType):
該方法使用URI對象來替代之前的url和urlVariables參數來指定訪問地址和參數綁定。URI是JDK java.net包下的一個類,它表示一個統一資源標識符(Uniform Resource Identifier)引用。比如下面的例子:
RestTemplate restTemplate=new RestTemplate(); UriComponents uriComponents=UriComponentsBuilder.fromUriString( "http://USER-SERVICE/user?name={name}") .build() .expand("dodo") .encode(); URI uri=uriComponents.toUri(); ResponseEntity<String> responseEntity=restTemplate.getForEntity(uri,String.class).getBody();
第二種:getForObject函數。
該方法可以理解為對getForEntity的進一步封裝,它通過HttpMessageConverterExtractor對HTTP的請求響應體body內容進行對象轉換,實現請求直接返回包裝好的對象內容。比如:
RestTemplate restTemplate=new RestTemplate(); String result=restTemplate.getForObject(uri,String.class);
當body是一個User對象時,可以直接這樣實現:
RestTemplate restTemplate=new RestTemplate(); User result=restTemplate.getForObject(uri,User.class);
當不需要關注請求響應除body外的其他內容時,該函數就非常好用,可以少一個從Response中獲取body的步驟。它與getForEntity函數類似,也提供了三種不同的重載實現。
1.getForObject(String url,Class responseType,Object...urlVariables):
與getForEntity的方法類似,url參數指定訪問的地址,responseType參數定義該方法的返回類型,urlVariables參數為url中占位符對應的參數。
2.getForObject(String url,Class responseType,Map urlVariables):
在該函數中,使用Map類型的urlVariables替代上面數組形式的urlVariables,因此使用時在url中需要將占位符的名稱與Map類型中的key一 一對應設置。
3.getForObject(URI url,Class responseType):
該方法使用URI對象來替代之前的url和urlVariables參數使用。
二、POST請求
在RestTemplate中,對POST請求時可以通過如下三個方法進行調用實現。
第一種:postForEntity函數。
該方法同GET請求中的getForEntity類似,會在調用后返回ResponseEntity<T>對象,其中T為請求響應的body類型。
比如下面這個例子,使用postForEntity提交POST請求到USER-SERVICE服務的/user接口,提交的body內容為user對象,請求響應返回的body類型為String。
RestTemplate restTemplate=new RestTemplate(); User user=newUser("didi",30); ResponseEntity<String> responseEntity=restTemplate.postForEntity("http://USER-SERVICE/user",user,String.class); String body=responseEntity.getBody();
postForEntity函數也實現了三種不同的重載方法。
1.postForEntity(String url,Object request,Class responseType,Object... uriVariables)
2.postForEntity(String url,Object request,Class responseType,Map uriVariables)
3.postForEntity(URI url,Object request,Class responseType)
這些函數中的參數用法大部分與getForEntity一致,比如,第一個重載函數和第二個重載函數中的uriVariables參數都用來對url中的參數進行綁定使用;
responseType參數是對請求響應的body內容的類型定義。
這里需要注意的是新增加的request參數,該參數可以是一個普通對象,也可以是一個HttpEntity對象。
如果是一個普通對象,而非HttpEntity對象的時候,RestTemplate會將請求對象轉換為一個HttpEntity對象來處理,其中Object就是request的類型,request內容會被視作完整的body來處理;
而如果request是一個HttpEntity對象,那么就會被當作一個完成的HTTP請求對象來處理,這個request中不僅包含了body的內容,也包含了header的內容。
第二種:postForObject函數。
該方法也跟getForObject的類型類似,它的作用是簡化postForEntity的后續處理。通過直接將請求響應的body內容包裝成對象來返回使用,比如下面的例子:
RestTemplate restTemplate=new RestTemplate(); User user=new User("didi",20); StringpostResult=restTemplate.postForObject("http://USER-SERVICE/user",user,String.class);
postForObject函數也實現了三種不同的重載方法:
1.postForObject(String url,Object request,Class responseType,Object... uriVariables)
2.postForObject(String url,Object request,Class responseType,Map uriVariables)
3.postForObject(URI url,Object request,Class responseType)
這三個函數除了返回的對象類型不同,函數的傳入參數均與postForEntity一致,因此可參考之前postForEntity的說明。
第三種:postForLocation函數。
該方法實現了以POST請求提交資源,並返回新資源的URI,比如下面的例子:
User user=new User("didi",40);
URI responseURI=restTemplate.postForLocation("http://USER-SERVICE/user",user);
postForLocation函數也實現了三種不同的重載方法:
1.postForLocation(String url,Object request,Object... urlVariables)
2.postForLocation(Stringurl,Object request,Map urlVariables)
3.postForLocation(URI url,Object request)
由於postForLocation函數會返回新資源的URI,該URI就相當於指定了返回類型,所以此方法實現的POST請求不需要像postForEntity和postForObject那樣指定responseType。其他的參數用法相同。
三、PUT請求
在RestTemplate中,對PUT請求可以通過put方法進行調用實現,比如:
RestTemplate restTemplate=new RestTemplate(); Longid=100011; User user=new User("didi",40); restTemplate.put("http://USER-SERVICE/user/{l}",user,id);
put函數也實現了三種不同的重載方法:
1.put(String url,Object request,Object... urlVariables)
2.put(String url,Object request,Map urlVariables)
3.put(URI url,Object request)
put函數為void類型,所以沒有返回內容,也就沒有其他函數定義的responseType參數,除此之外的其他傳入參數定義與用法與postForObject基本一致。
四、DELETE請求
在RestTemplate中,對DELETE請求可以通過delete方法進行調用實現,比如:
RestTemplate restTemplate=new RestTemplate(); Longid=10001L; restTemplate.delete("http://USER-SERVICE/user/{1)",id);
delete函數也實現了三種不同的重載方法:
1.delete(String url,Object... urlVariables)
2.delete(String url,Map urlVariables)
3.delete(URI url)
由於我們在進行REST請求時,通常都將DELETE請求的唯一標識拼接在url中,所以DELETE請求也不需要request的body信息,就如上面的三個函數實現一樣,非常簡單。
url指定DELETE請求的位置,urlVariables綁定url中的參數即可。