Spring Boot使用RestTemplate调用其他微服务
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的服务