日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spring restTemplate使用方法

發(fā)布時(shí)間:2023/12/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring restTemplate使用方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

https://github.com/lenve/SimpleSpringCloud/tree/master/RestTemplate在Spring Cloud中服務(wù)的發(fā)現(xiàn)與消費(fèi)一文中,當(dāng)我們從服務(wù)消費(fèi)端去調(diào)用服務(wù)提供者的服務(wù)的時(shí)候,使用了一個很好用的對象,叫做RestTemplate,當(dāng)時(shí)我們只使用了RestTemplate中最簡單的一個功能getForEntity發(fā)起了一個get請求去調(diào)用服務(wù)端的數(shù)據(jù),同時(shí),我們還通過配置@LoadBalanced注解開啟客戶端負(fù)載均衡,RestTemplate的功能不可謂不強(qiáng)大,那么今天我們就來詳細(xì)的看一下RestTemplate中幾種常見請求方法的使用。

本文是Spring Cloud系列的第六篇文章,了解前五篇文章的內(nèi)容有助于更好的理解本文:

1.使用Spring Cloud搭建服務(wù)注冊中心
2.使用Spring Cloud搭建高可用服務(wù)注冊中心
3.Spring Cloud中服務(wù)的發(fā)現(xiàn)與消費(fèi)
4.Eureka中的核心概念
5.什么是客戶端負(fù)載均衡

本文主要從以下四個方面來看RestTemplate的使用:

GET請求
POST請求
PUT請求
DELETE請求
OK,開始吧。

環(huán)境搭建
首先我們要搭建一個測試環(huán)境,方便我們一會驗(yàn)證相應(yīng)的API。
服務(wù)注冊中心我就直接使用前文(使用Spring Cloud搭建服務(wù)注冊中心)中創(chuàng)建的服務(wù)注冊中心。
服務(wù)提供者和服務(wù)消費(fèi)者我創(chuàng)建在一個maven工程中,如果小伙伴對IntelliJ IDEA中創(chuàng)建maven多模塊項(xiàng)目還不了解的話,可以參考IntelliJ IDEA中創(chuàng)建Web聚合項(xiàng)目(Maven多模塊項(xiàng)目)。創(chuàng)建好的maven項(xiàng)目如下圖所示:

?

其中commons是一個公共模塊,是一個普通的JavaSE工程,我們一會主要將實(shí)體類寫在這個模塊中,provider和consumer是兩個spring boot項(xiàng)目,provider將扮演服務(wù)提供者的角色,consumer扮演服務(wù)消費(fèi)者的角色。

commons模塊主要用來提供實(shí)體類,內(nèi)容如下:

?

然后在provider和consumer模塊中添加對commons的依賴,依賴代碼如下:

<dependency>
<groupId>org.sang</groupId>
<artifactId>commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
1
provider和consumer的開發(fā)小伙伴們可以參考使用Spring Cloud搭建服務(wù)注冊中心和Spring Cloud中服務(wù)的發(fā)現(xiàn)與消費(fèi),我這里就不再贅述了。下文中我只列出provider和consumer的核心代碼,文末可以下載源碼。

GET請求
在RestTemplate中,發(fā)送一個GET請求,我們可以通過如下兩種方式:

第一種:getForEntity
getForEntity方法的返回值是一個ResponseEntity<T>,ResponseEntity<T>是Spring對HTTP請求響應(yīng)的封裝,包括了幾個重要的元素,如響應(yīng)碼、contentType、contentLength、響應(yīng)消息體等。比如下面一個例子:

@RequestMapping("/gethello")
public String getHello() {
ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://HELLO-SERVICE/hello", String.class);
String body = responseEntity.getBody();
HttpStatus statusCode = responseEntity.getStatusCode();
int statusCodeValue = responseEntity.getStatusCodeValue();
HttpHeaders headers = responseEntity.getHeaders();
StringBuffer result = new StringBuffer();
result.append("responseEntity.getBody():").append(body).append("<hr>")
.append("responseEntity.getStatusCode():").append(statusCode).append("<hr>")
.append("responseEntity.getStatusCodeValue():").append(statusCodeValue).append("<hr>")
.append("responseEntity.getHeaders():").append(headers).append("<hr>");
return result.toString();
}
1
關(guān)于這段代碼,我說如下幾點(diǎn):

getForEntity的第一個參數(shù)為我要調(diào)用的服務(wù)的地址,這里我調(diào)用了服務(wù)提供者提供的/hello接口,注意這里是通過服務(wù)名調(diào)用而不是服務(wù)地址,如果寫成服務(wù)地址就沒法實(shí)現(xiàn)客戶端負(fù)載均衡了。
getForEntity第二個參數(shù)String.class表示我希望返回的body類型是String
拿到返回結(jié)果之后,將返回結(jié)果遍歷打印出來
最終顯示結(jié)果如下:

?

有時(shí)候我在調(diào)用服務(wù)提供者提供的接口時(shí),可能需要傳遞參數(shù),有兩種不同的方式,如下:

@RequestMapping("/sayhello")
public String sayHello() {
ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://HELLO-SERVICE/sayhello?name={1}", String.class, "張三");
return responseEntity.getBody();
}
@RequestMapping("/sayhello2")
public String sayHello2() {
Map<String, String> map = new HashMap<>();
map.put("name", "李四");
ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://HELLO-SERVICE/sayhello?name={name}", String.class, map);
return responseEntity.getBody();
}
1
可以用一個數(shù)字做占位符,最后是一個可變長度的參數(shù),來一一替換前面的占位符
也可以前面使用name={name}這種形式,最后一個參數(shù)是一個map,map的key即為前邊占位符的名字,map的value為參數(shù)值
第一個調(diào)用地址也可以是一個URI而不是字符串,這個時(shí)候我們構(gòu)建一個URI即可,參數(shù)神馬的都包含在URI中了,如下:

@RequestMapping("/sayhello3")
public String sayHello3() {
UriComponents uriComponents = UriComponentsBuilder.fromUriString("http://HELLO-SERVICE/sayhello?name={name}").build().expand("王五").encode();
URI uri = uriComponents.toUri();
ResponseEntity<String> responseEntity = restTemplate.getForEntity(uri, String.class);
return responseEntity.getBody();
}
1
通過Spring中提供的UriComponents來構(gòu)建Uri即可。

當(dāng)然,服務(wù)提供者不僅可以返回String,也可以返回一個自定義類型的對象,比如我的服務(wù)提供者中有如下方法:

@RequestMapping(value = "/getbook1", method = RequestMethod.GET)
public Book book1() {
return new Book("三國演義", 90, "羅貫中", "花城出版社");
}
1
對于該方法我可以在服務(wù)消費(fèi)者中通過如下方式來調(diào)用:

@RequestMapping("/book1")
public Book book1() {
ResponseEntity<Book> responseEntity = restTemplate.getForEntity("http://HELLO-SERVICE/getbook1", Book.class);
return responseEntity.getBody();
}
1
運(yùn)行結(jié)果如下:

?

第二種:getForObject
getForObject函數(shù)實(shí)際上是對getForEntity函數(shù)的進(jìn)一步封裝,如果你只關(guān)注返回的消息體的內(nèi)容,對其他信息都不關(guān)注,此時(shí)可以使用getForObject,舉一個簡單的例子,如下:

@RequestMapping("/book2")
public Book book2() {
Book book = restTemplate.getForObject("http://HELLO-SERVICE/getbook1", Book.class);
return book;
}
1
getForObject也有幾個重載方法,如下:

?

這幾個重載方法參數(shù)的含義和getForEntity一致,我就不再贅述了。

POST請求
在RestTemplate中,POST請求可以通過如下三個方法來發(fā)起:

第一種:postForEntity
該方法和get請求中的getForEntity方法類似,如下例子:

@RequestMapping("/book3")
public Book book3() {
Book book = new Book();
book.setName("紅樓夢");
ResponseEntity<Book> responseEntity = restTemplate.postForEntity("http://HELLO-SERVICE/getbook2", book, Book.class);
return responseEntity.getBody();
}
1
方法的第一參數(shù)表示要調(diào)用的服務(wù)的地址
方法的第二個參數(shù)表示上傳的參數(shù)
方法的第三個參數(shù)表示返回的消息體的數(shù)據(jù)類型
我這里創(chuàng)建了一個Book對象,這個Book對象只有name屬性有值,將之傳遞到服務(wù)提供者那里去,服務(wù)提供者代碼如下:

@RequestMapping(value = "/getbook2", method = RequestMethod.POST)
public Book book2(@RequestBody Book book) {
System.out.println(book.getName());
book.setPrice(33);
book.setAuthor("曹雪芹");
book.setPublisher("人民文學(xué)出版社");
return book;
}
1
服務(wù)提供者接收到服務(wù)消費(fèi)者傳來的參數(shù)book,給其他屬性設(shè)置上值再返回,調(diào)用結(jié)果如下:

?

postForEntity的其他重載方法如下:

?

這些方法的參數(shù)含義和getForEntity參數(shù)的含義一致,不再贅述。

第二種:postForObject
如果你只關(guān)注,返回的消息體,可以直接使用postForObject。用法和getForObject一致。

第三種:postForLocation
postForLocation也是提交新資源,提交成功之后,返回新資源的URI,postForLocation的參數(shù)和前面兩種的參數(shù)基本一致,只不過該方法的返回值為Uri,這個只需要服務(wù)提供者返回一個Uri即可,該Uri表示新資源的位置。

PUT請求
在RestTemplate中,PUT請求可以通過put方法調(diào)用,put方法的參數(shù)和前面介紹的postForEntity方法的參數(shù)基本一致,只是put方法沒有返回值而已。舉一個簡單的例子,如下:

@RequestMapping("/put")
public void put() {
Book book = new Book();
book.setName("紅樓夢");
restTemplate.put("http://HELLO-SERVICE/getbook3/{1}", book, 99);
}
1
book對象是我要提交的參數(shù),最后的99用來替換前面的占位符{1}

DELETE請求
delete請求我們可以通過delete方法調(diào)用來實(shí)現(xiàn),如下例子:

@RequestMapping("/delete")
public void delete() {
restTemplate.delete("http://HELLO-SERVICE/getbook4/{1}", 100);
}
1
delete方法也有幾個重載的方法,不過重載的參數(shù)和前面基本一致,不贅述。
---------------------
作者:_江南一點(diǎn)雨
來源:CSDN
原文:https://blog.csdn.net/u012702547/article/details/77917939/
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!

轉(zhuǎn)載于:https://www.cnblogs.com/CHWLearningNotes/p/10369623.html

總結(jié)

以上是生活随笔為你收集整理的spring restTemplate使用方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。