0%

springboot中使用RestTemplate调用rest服务

日常开发中,调用远程的rest服务是很常见的,比如微服务情况下的rest服务调用,又或者是调用第三方服务。微服务下的调用有服务注册与发现机制来调用,也可以使用RestTemplate方式来调用;而要是第三方服务,那么一般情况下是通过HTTP请求来调用。

接下来就看说一下在springboot项目中,用RestTemplate来调用远程rest服务,包括第三方服务。

首先我们的web项目中一般会有web依赖,此依赖中已有RestTemplate类,如下所示:

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

其次假设有这样一个rest服务接口,提供一个简单的返回(服务的启动地址为“http://127.0.0.1:8080”),如下所示:

1
2
3
4
5
6
7
8
9
10
11
@RestController
@Slf4j
public class RestServerController {

@GetMapping("/rest/{name}")
public String rest(@PathVariable String name) {
log.info("request -> {}", name);
return "Hello, " + name + " !";
}

}

那么我们要想调用这个服务,只需要用RestTemplate实例的方法即可成功调用。而RestTemplate默认是不会自动注入在spring容器中的,但是RestTemplateBuilder这个用来构建RestTemplate的实例是被注入的,所以需要用其来构建RestTemplate

配置一个构建RestTemplate的配置类如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Configuration
public class RestTemplateConfig {

@Resource
private RestTemplateBuilder restTemplateBuilder;

@Bean
public RestTemplate buildRestTemplate() {
return restTemplateBuilder
.rootUri("http://127.0.0.1:8080")
.setConnectTimeout(Duration.ofSeconds(5))
.build();
}
}

最后在调用放做类似如下方式的调用即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Service
public class RestTemplateService {

private RestTemplate restTemplate;

@Autowired
public RestTemplateService(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}

public void callRest() {
String response = restTemplate.getForObject("/rest/{name}", String.class, "lazycece");
System.out.println(response);
}
}