传统状况下在java代码里访问restful服务,通常使用Apache
的HttpClient
。不过此种方法使用起来太过繁琐。spring提供了一种简单便捷的模板类来进行操做,这就是RestTemplate
。html
注意:默认状况下RestTemplate依赖于标准的JDK工具来创建HTTP链接。您能够切换到经过HttpAccessor.setRequestFactory(org.springframework.http.client.ClientHttpRequestFactory)
属性使用不一样的HTTP库,例如Apache HttpComponents,Netty和OkHttpjava
方法:git
delete() 在特定的URL上对资源执行HTTP DELETE操做github
exchange()
在URL上执行特定的HTTP方法,返回包含对象的ResponseEntity,这个对象是从响应体中
映射获得的spring
execute() 在URL上执行特定的HTTP方法,返回一个从响应体映射获得的对象api
getForEntity() 发送一个HTTP GET请求,返回的ResponseEntity包含了响应体所映射成的对象restful
getForObject() 发送一个HTTP GET请求,返回的请求体将映射为一个对象markdown
postForEntity()
POST 数据到一个URL,返回包含一个对象的ResponseEntity,这个对象是从响应体中映射得
到的app
postForObject() POST 数据到一个URL,返回根据响应体匹配造成的对象负载均衡
headForHeaders() 发送HTTP HEAD请求,返回包含特定资源URL的HTTP头
optionsForAllow() 发送HTTP OPTIONS请求,返回对特定URL的Allow头信息
postForLocation() POST 数据到一个URL,返回新建立资源的URL
put() PUT 资源到特定的URL
转:http://www.javashuo.com/article/p-czvxjuin-dd.html
https://github.com/lenve/SimpleSpringCloud/tree/master/RestTemplate在Spring Cloud中服务的发现与消费一文中,当咱们从服务消费端去调用服务提供者的服务的时候,使用了一个很好用的对象,叫作RestTemplate,当时咱们只使用了RestTemplate中最简单的一个功能getForEntity发起了一个get请求去调用服务端的数据,同时,咱们还经过配置@LoadBalanced注解开启客户端负载均衡,RestTemplate的功能不可谓不强大,那么今天咱们就来详细的看一下RestTemplate中几种常见请求方法的使用。
本文是Spring Cloud系列的第六篇文章,了解前五篇文章的内容有助于更好的理解本文:
1.使用Spring Cloud搭建服务注册中心
2.使用Spring Cloud搭建高可用服务注册中心
3.Spring Cloud中服务的发现与消费
4.Eureka中的核心概念
5.什么是客户端负载均衡
本文主要从如下四个方面来看RestTemplate的使用:
OK,开始吧。
首先咱们要搭建一个测试环境,方便咱们一会验证相应的API。
服务注册中心我就直接使用前文(使用Spring Cloud搭建服务注册中心)中建立的服务注册中心。
服务提供者和服务消费者我建立在一个maven工程中,若是小伙伴对IntelliJ IDEA中建立maven多模块项目还不了解的话,能够参考IntelliJ IDEA中建立Web聚合项目(Maven多模块项目)。建立好的maven项目以下图所示:
其中commons是一个公共模块,是一个普通的JavaSE工程,咱们一会主要将实体类写在这个模块中,provider和consumer是两个spring boot项目,provider将扮演服务提供者的角色,consumer扮演服务消费者的角色。
commons模块主要用来提供实体类,内容以下:
而后在provider和consumer模块中添加对commons的依赖,依赖代码以下:
<dependency>
<groupId>org.sang</groupId>
<artifactId>commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
provider和consumer的开发小伙伴们能够参考使用Spring Cloud搭建服务注册中心和Spring Cloud中服务的发现与消费,我这里就再也不赘述了。下文中我只列出provider和consumer的核心代码,文末能够下载源码。
在RestTemplate中,发送一个GET请求,咱们能够经过以下两种方式:
getForEntity方法的返回值是一个ResponseEntity<T>
,ResponseEntity<T>
是Spring对HTTP请求响应的封装,包括了几个重要的元素,如响应码、contentType、contentLength、响应消息体等。好比下面一个例子:
无参:
@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();
}
关于这段代码,我说以下几点:
最终显示结果以下:
有时候我在调用服务提供者提供的接口时,可能须要传递参数,有两种不一样的方式,以下:
有参:
@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();
}
第一个调用地址也能够是一个URI而不是字符串,这个时候咱们构建一个URI便可,参数神马的都包含在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();
}
经过Spring中提供的UriComponents来构建Uri便可。
固然,服务提供者不只能够返回String,也能够返回一个自定义类型的对象,好比个人服务提供者中有以下方法:
@RequestMapping(value = "/getbook1", method = RequestMethod.GET)
public Book book1() {
return new Book("三国演义", 90, "罗贯中", "花城出版社");
}
对于该方法我能够在服务消费者中经过以下方式来调用:
@RequestMapping("/book1")
public Book book1() {
ResponseEntity<Book> responseEntity = restTemplate.getForEntity("http://HELLO-SERVICE/getbook1", Book.class);
return responseEntity.getBody();
}
运行结果以下:
getForObject函数其实是对getForEntity函数的进一步封装,若是你只关注返回的消息体的内容,对其余信息都不关注,此时可使用getForObject,举一个简单的例子,以下:
@RequestMapping("/book2")
public Book book2() {
Book book = restTemplate.getForObject("http://HELLO-SERVICE/getbook1", Book.class);
return book;
}
getForObject也有几个重载方法,以下:
这几个重载方法参数的含义和getForEntity一致,我就再也不赘述了。
在RestTemplate中,POST请求能够经过以下三个方法来发起:
该方法和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();
}
我这里建立了一个Book对象,这个Book对象只有name属性有值,将之传递到服务提供者那里去,服务提供者代码以下:
@RequestMapping(value = "/getbook2", method = RequestMethod.POST)
public Book book2(@RequestBody Book book) {
System.out.println(book.getName());
book.setPrice(33);
book.setAuthor("曹雪芹");
book.setPublisher("人民文学出版社");
return book;
}
服务提供者接收到服务消费者传来的参数book,给其余属性设置上值再返回,调用结果以下:
postForEntity的其余重载方法以下:
这些方法的参数含义和getForEntity参数的含义一致,再也不赘述。
若是你只关注,返回的消息体,能够直接使用postForObject。用法和getForObject一致。
postForLocation也是提交新资源,提交成功以后,返回新资源的URI,postForLocation的参数和前面两种的参数基本一致,只不过该方法的返回值为Uri,这个只须要服务提供者返回一个Uri便可,该Uri表示新资源的位置。
在RestTemplate中,PUT请求能够经过put方法调用,put方法的参数和前面介绍的postForEntity方法的参数基本一致,只是put方法没有返回值而已。举一个简单的例子,以下:
@RequestMapping("/put")
public void put() {
Book book = new Book();
book.setName("红楼梦");
restTemplate.put("http://HELLO-SERVICE/getbook3/{1}", book, 99);
}
book对象是我要提交的参数,最后的99用来替换前面的占位符{1}
delete请求咱们能够经过delete方法调用来实现,以下例子:
@RequestMapping("/delete")
public void delete() {
restTemplate.delete("http://HELLO-SERVICE/getbook4/{1}", 100);
}
delete方法也有几个重载的方法,不太重载的参数和前面基本一致,不赘述。
OK,以上就是咱们对RestTemplate可以发送的请求的一个详细介绍,有问题欢迎留言讨论。
本文案例地址:https://github.com/lenve/SimpleSpringCloud/tree/master/RestTemplate