首页 资讯 社群 我的社区 搜索

Spring Boot使用RestTemplate调用其他微服务

LM123
2019-12-23 17:56:57

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的服务

用户评论