javascript
unity3d中画线有几种方式_Spring RestTemplate中几种常见的请求方式
原文 https://segmentfault.com/a/1190000011093597
在Spring Cloud中服務(wù)的發(fā)現(xiàn)與消費(fèi)一文中,當(dāng)我們從服務(wù)消費(fèi)端去調(diào)用服務(wù)提供者的服務(wù)的時(shí)候,使用了一個(gè)很好用的對(duì)象,叫做RestTemplate,當(dāng)時(shí)我們只使用了RestTemplate中最簡(jiǎn)單的一個(gè)功能getForEntity發(fā)起了一個(gè)get請(qǐng)求去調(diào)用服務(wù)端的數(shù)據(jù),同時(shí),我們還通過(guò)配置@LoadBalanced注解開(kāi)啟客戶端負(fù)載均衡,RestTemplate的功能不可謂不強(qiáng)大,那么今天我們就來(lái)詳細(xì)的看一下RestTemplate中幾種常見(jiàn)請(qǐng)求方法的使用。
本文是Spring Cloud系列的第六篇文章,了解前五篇文章的內(nèi)容有助于更好的理解本文:
1.使用Spring Cloud搭建服務(wù)注冊(cè)中心 2.使用Spring Cloud搭建高可用服務(wù)注冊(cè)中心 3.Spring Cloud中服務(wù)的發(fā)現(xiàn)與消費(fèi) 4.Eureka中的核心概念 5.什么是客戶端負(fù)載均衡
本文主要從以下四個(gè)方面來(lái)看RestTemplate的使用:
- GET請(qǐng)求
- POST請(qǐng)求
- PUT請(qǐng)求
- DELETE請(qǐng)求
OK,開(kāi)始吧。
環(huán)境搭建
首先我們要搭建一個(gè)測(cè)試環(huán)境,方便我們一會(huì)驗(yàn)證相應(yīng)的API。 服務(wù)注冊(cè)中心我就直接使用前文(使用Spring Cloud搭建服務(wù)注冊(cè)中心)中創(chuàng)建的服務(wù)注冊(cè)中心。 服務(wù)提供者和服務(wù)消費(fèi)者我創(chuàng)建在一個(gè)maven工程中,如果小伙伴對(duì)IntelliJ IDEA中創(chuàng)建maven多模塊項(xiàng)目還不了解的話,可以參考IntelliJ IDEA中創(chuàng)建Web聚合項(xiàng)目(Maven多模塊項(xiàng)目)。創(chuàng)建好的maven項(xiàng)目如下圖所示:
其中commons是一個(gè)公共模塊,是一個(gè)普通的JavaSE工程,我們一會(huì)主要將實(shí)體類(lèi)寫(xiě)在這個(gè)模塊中,provider和consumer是兩個(gè)spring boot項(xiàng)目,provider將扮演服務(wù)提供者的角色,consumer扮演服務(wù)消費(fèi)者的角色。
commons模塊主要用來(lái)提供實(shí)體類(lèi),內(nèi)容如下:
然后在provider和consumer模塊中添加對(duì)commons的依賴(lài),依賴(lài)代碼如下:
org.sang commons 1.0-SNAPSHOTprovider和consumer的開(kāi)發(fā)小伙伴們可以參考使用Spring Cloud搭建服務(wù)注冊(cè)中心和Spring Cloud中服務(wù)的發(fā)現(xiàn)與消費(fèi),我這里就不再贅述了。下文中我只列出provider和consumer的核心代碼,文末可以下載源碼。
在啟動(dòng)類(lèi)型聲明RestTemplate
@Beanpublic RestTemplate getRestTemplate() { return new RestTemplate();}@Autowiredprivate RestTemplate restTemplate;GET請(qǐng)求
在RestTemplate中,發(fā)送一個(gè)GET請(qǐng)求,我們可以通過(guò)如下兩種方式:
第一種:getForEntity
getForEntity方法的返回值是一個(gè)ResponseEntity,ResponseEntity是Spring對(duì)HTTP請(qǐng)求響應(yīng)的封裝,包括了幾個(gè)重要的元素,如響應(yīng)碼、contentType、contentLength、響應(yīng)消息體等。比如下面一個(gè)例子:
@RequestMapping("/gethello")public String getHello() { ResponseEntity 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("") .append("responseEntity.getStatusCode():").append(statusCode).append("") .append("responseEntity.getStatusCodeValue():").append(statusCodeValue).append("") .append("responseEntity.getHeaders():").append(headers).append(""); return result.toString();}關(guān)于這段代碼,我說(shuō)如下幾點(diǎn):
- getForEntity的第一個(gè)參數(shù)為我要調(diào)用的服務(wù)的地址,這里我調(diào)用了服務(wù)提供者提供的/hello接口,注意這里是通過(guò)服務(wù)名調(diào)用而不是服務(wù)地址,如果寫(xiě)成服務(wù)地址就沒(méi)法實(shí)現(xiàn)客戶端負(fù)載均衡了。
- getForEntity第二個(gè)參數(shù)String.class表示我希望返回的body類(lèi)型是String
- 拿到返回結(jié)果之后,將返回結(jié)果遍歷打印出來(lái)
最終顯示結(jié)果如下:
有時(shí)候我在調(diào)用服務(wù)提供者提供的接口時(shí),可能需要傳遞參數(shù),有兩種不同的方式,如下:
@RequestMapping("/sayhello")public String sayHello() { ResponseEntity responseEntity = restTemplate.getForEntity("http://HELLO-SERVICE/sayhello?name={1}", String.class, "張三"); return responseEntity.getBody();}@RequestMapping("/sayhello2")public String sayHello2() { Map map = new HashMap<>(); map.put("name", "李四"); ResponseEntity responseEntity = restTemplate.getForEntity("http://HELLO-SERVICE/sayhello?name={name}", String.class, map); return responseEntity.getBody();}- 可以用一個(gè)數(shù)字做占位符,最后是一個(gè)可變長(zhǎng)度的參數(shù),來(lái)一一替換前面的占位符
- 也可以前面使用name={name}這種形式,最后一個(gè)參數(shù)是一個(gè)map,map的key即為前邊占位符的名字,map的value為參數(shù)值
第一個(gè)調(diào)用地址也可以是一個(gè)URI而不是字符串,這個(gè)時(shí)候我們構(gòu)建一個(gè)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 responseEntity = restTemplate.getForEntity(uri, String.class); return responseEntity.getBody();}通過(guò)Spring中提供的UriComponents來(lái)構(gòu)建Uri即可。
當(dāng)然,服務(wù)提供者不僅可以返回String,也可以返回一個(gè)自定義類(lèi)型的對(duì)象,比如我的服務(wù)提供者中有如下方法:
@RequestMapping(value = "/getbook1", method = RequestMethod.GET)public Book book1() { return new Book("三國(guó)演義", 90, "羅貫中", "花城出版社");}對(duì)于該方法我可以在服務(wù)消費(fèi)者中通過(guò)如下方式來(lái)調(diào)用:
@RequestMapping("/book1")public Book book1() { ResponseEntity responseEntity = restTemplate.getForEntity("http://HELLO-SERVICE/getbook1", Book.class); return responseEntity.getBody();}運(yùn)行結(jié)果如下:
第二種:getForObject
getForObject函數(shù)實(shí)際上是對(duì)getForEntity函數(shù)的進(jìn)一步封裝,如果你只關(guān)注返回的消息體的內(nèi)容,對(duì)其他信息都不關(guān)注,此時(shí)可以使用getForObject,舉一個(gè)簡(jiǎn)單的例子,如下:
@RequestMapping("/book2")public Book book2() { Book book = restTemplate.getForObject("http://HELLO-SERVICE/getbook1", Book.class); return book;}getForObject也有幾個(gè)重載方法,如下:
這幾個(gè)重載方法參數(shù)的含義和getForEntity一致,我就不再贅述了。
POST請(qǐng)求
在RestTemplate中,POST請(qǐng)求可以通過(guò)如下三個(gè)方法來(lái)發(fā)起:
第一種:postForEntity
該方法和get請(qǐng)求中的getForEntity方法類(lèi)似,如下例子:
@RequestMapping("/book3")public Book book3() { Book book = new Book(); book.setName("紅樓夢(mèng)"); ResponseEntity responseEntity = restTemplate.postForEntity("http://HELLO-SERVICE/getbook2", book, Book.class); return responseEntity.getBody();}- 方法的第一參數(shù)表示要調(diào)用的服務(wù)的地址
- 方法的第二個(gè)參數(shù)表示上傳的參數(shù)
- 方法的第三個(gè)參數(shù)表示返回的消息體的數(shù)據(jù)類(lèi)型
我這里創(chuàng)建了一個(gè)Book對(duì)象,這個(gè)Book對(duì)象只有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;}服務(wù)提供者接收到服務(wù)消費(fèi)者傳來(lái)的參數(shù)book,給其他屬性設(shè)置上值再返回,調(diào)用結(jié)果如下:
postForEntity的其他重載方法如下:
這些方法的參數(shù)含義和getForEntity參數(shù)的含義一致,不再贅述。
第二種:postForObject
如果你只關(guān)注,返回的消息體,可以直接使用postForObject。用法和getForObject一致。
第三種:postForLocation
postForLocation也是提交新資源,提交成功之后,返回新資源的URI,postForLocation的參數(shù)和前面兩種的參數(shù)基本一致,只不過(guò)該方法的返回值為Uri,這個(gè)只需要服務(wù)提供者返回一個(gè)Uri即可,該Uri表示新資源的位置。
PUT請(qǐng)求
在RestTemplate中,PUT請(qǐng)求可以通過(guò)put方法調(diào)用,put方法的參數(shù)和前面介紹的postForEntity方法的參數(shù)基本一致,只是put方法沒(méi)有返回值而已。舉一個(gè)簡(jiǎn)單的例子,如下:
@RequestMapping("/put")public void put() { Book book = new Book(); book.setName("紅樓夢(mèng)"); restTemplate.put("http://HELLO-SERVICE/getbook3/{1}", book, 99);}book對(duì)象是我要提交的參數(shù),最后的99用來(lái)替換前面的占位符{1}
DELETE請(qǐng)求
delete請(qǐng)求我們可以通過(guò)delete方法調(diào)用來(lái)實(shí)現(xiàn),如下例子:
@RequestMapping("/delete")public void delete() { restTemplate.delete("http://HELLO-SERVICE/getbook4/{1}", 100);}delete方法也有幾個(gè)重載的方法,不過(guò)重載的參數(shù)和前面基本一致,不贅述。
OK,以上就是我們對(duì)RestTemplate能夠發(fā)送的請(qǐng)求的一個(gè)詳細(xì)介紹,有問(wèn)題歡迎留言討論。
本文案例地址:https://github.com/lenve/SimpleSpringCloud/tree/master/RestTemplate
總結(jié)
以上是生活随笔為你收集整理的unity3d中画线有几种方式_Spring RestTemplate中几种常见的请求方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 双色球可以提前多少期买?
- 下一篇: linux限制pptp连接数_性能调优,