對Spring 的RestTemplate進行包裝

ido發表於2018-04-20

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

相關文章