Spring的RestTemplate及大地簡化了REST Client的開發,但每次還要編寫大量的模板程式碼,程式碼不夠簡潔。我對他進行了一次包裝,採用介面來宣告REST介面,使用Annotation對interface的方法進行標註。如下宣告一個REST介面
//介面必須繼承BaseRestClient,提供了一個setUrl的基本方法。
public interface ITestRest extends BaseRestClient
{
//宣告一個REST方法,method是GET,在路徑裡面有個引數id,如: http://localhost:8080/get/{id}。返回一個UserInfo物件,由Json反射過來。
@RestClient(method = HttpMethod.GET)
UserInfo getUser(@PathParam(value = "id") String id);
//宣告一個REST方法,method用POST,除了路徑裡面的id,還有一個表單
@RestClient(method = HttpMethod.POST)
UserInfo postUser(@PathParam(value = "id") String id,@FormBody UserForm form);
//表單中含有檔案
@RestClient(method = HttpMethod.POST,hasFile = true)
UserInfo postUserWithFile(@PathParam(value = "id") String id,@FormBody UserFormWithFile form);
}
宣告Bean
@Bean
public ITestRest testRest(RestTemplate restTemplate){
ITestRest testRest= RestClientBuilder.newRestClient(ITestRest.class,restTemplate);
return testRest;
}
@Bean
public RestTemplate restTemplate(){
return new RestTemplateBuilder()
.additionalMessageConverters(new MappingJackson2HttpMessageConverter())
.additionalMessageConverters(new FormHttpMessageConverter()).build();
}
呼叫方
@Autowired
ITestRest testRest;
......
testRest.setUrl("http://localhost:8080/get/{id}");
UserInfo user=testRest.getUser("123456");
由於訪問路徑可能會變化,比如採用了叢集,所以在呼叫前需要set一下,url放到ThreadLocal裡面,執行緒安全。
如果不變,可以在@RestClient宣告中加上path指定訪問地址
github地址:https://github.com/bobdeng/ssrf