日常開發中,調用遠端的rest服務是很常見的,比如微服務情況下的rest服務調用,又或者是調用第三方服務。微服務下的調用有服務注冊與發現機制來調用,也可以使用
RestTemplate
方式來調用;而要是第三方服務,那麼一般情況下是通過HTTP請求來調用。
接下來就看說一下在springboot項目中,用
RestTemplate
來調用遠端rest服務,包括第三方服務。
首先我們的web項目中一般會有web依賴,此依賴中已有
RestTemplate
類,如下所示:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
其次假設有這樣一個rest服務接口,提供一個簡單的傳回(服務的啟動位址為“http://127.0.0.1:8080”),如下所示:
@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
的配置類如下:
@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();
}
}
最後在調用放做類似如下方式的調用即可:
@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);
}
}