Spring RestTemplate簡介及使用


Spring RestTemplate介紹

1、springRestTemplate 簡介

spring 提供的同步請求Rest服務的客戶端,RestTemplate提供了多種便捷訪問遠程Http服務的方法,能夠大大提高客戶端的編寫效率。

是Spring用於同步client端的核心類,簡化了與http服務的通信,並滿足RestFul原則,程序代碼可以給它提供URL,並提取結果。默認情況下,RestTemplate默認依賴jdk的HTTP連接工具。當然你也可以 通過setRequestFactory屬性切換到不同的HTTP源,比如Apache HttpComponents、Netty和OkHttp。

在RestTemplate 之前可以使用apache下開源的HttpClient,使用httpClient需要自己處理請求和返回值,需要自己封裝httpClient連接池,使用完之后需要釋放鏈接等。

spring官網對RestTemplate 介紹如下

RestTemplate: The original Spring REST client with a synchronous, template method API.

2、springRestTemplate 初始化及配置

實例化RestTemplate,並對RestTemplate做配置。在內部,RestTemplate默認使用SimpleClientHttpRequestFactory和DefaultResponseErrorHandler來分別處理HTTP的創建和錯誤,但也可以通過setRequestFactory和setErrorHandler來覆蓋。

//默認構造方法,使用的是java.net.HttpURLConnection執行請求
RestTemplate template = new RestTemplate();
//如果需要處理字符串返回值需要更改字符編碼
    List<HttpMessageConverter<?>> list = template.getMessageConverters();
    for (HttpMessageConverter<?> httpMessageConverter : list) {
        if(httpMessageConverter instanceof StringHttpMessageConverter) {
            ((StringHttpMessageConverter) httpMessageConverter).setDefaultCharset(Charset.forName(charset));
            break;
        }
    }
//統一使用增加header方式處理

//使用httpClient初始化
RestTemplate template = new RestTemplate(new HttpComponentsClientHttpRequestFactory());

//使用okhttp3初始化
RestTemplate template = new RestTemplate(new OkHttp3ClientHttpRequestFactory());

template.setRequestFactory(okHttp3ClientHttpRequestFactory())

//可以在ClientHttpRequestFactory中設置超時時間、讀取超時時間
private  OkHttp3ClientHttpRequestFactory okHttp3ClientHttpRequestFactory() {
        OkHttp3ClientHttpRequestFactory okHttp3ClientHttpRequestFactory = new OkHttp3ClientHttpRequestFactory();
        okHttp3ClientHttpRequestFactory.setConnectTimeout(60000);
        okHttp3ClientHttpRequestFactory.setReadTimeout(30000);
            return okHttp3ClientHttpRequestFactory;
    }

3、get請求

3.1、getForObject()方法

public <T> T getForObject(String url, Class<T> responseType, Object... uriVariables){}
public <T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables)
public <T> T getForObject(URI url, Class<T> responseType)
 	/**
     * 無參數get請求,直接獲取實體對象
     */
    @Test
    public void testRestTemplate(){
        String url ="http://localhost:8081/show/org/get/1";
        Org s= restTemplate.getForObject(url, Org.class);
        System.out.println(s.getOrgName());
        System.out.println(s.getOrgNo());
    }

     /**
     * 使用占位符,傳遞參數,在get后加{1},參數會自動替換占位符
     */
    @Test
    public void testRestTemplate2(){
        String url ="http://localhost:8081/show/org/get/{1}";
        Org s= restTemplate.getForObject(url, Org.class,"555");
        System.out.println(s.getOrgName());
        System.out.println(s.getOrgNo());
    }

 	/**
     * 使用map,傳遞參數,需要在URL后拼接服務端參數名及map中key的名稱,
     * 如果key在map中沒有則會報異常
     * java.lang.IllegalArgumentException: Map has no value for 'ids'
     */
    @Test
    public void testRestTemplate3(){
        String url ="http://localhost:8081/show/org/get2?id={id}&orgNo={orgNo}";
        Map<String,String> map = new HashMap();
        map.put("id","5555");
        map.put("orgNo","66666");
        Org s= restTemplate.getForObject(url, Org.class,map);
        System.out.println(s.getOrgName());
        System.out.println(s.getOrgNo());
    }

3.2、getForEntity()方法

public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables){}
public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables){}
public <T> ResponseEntity<T> getForEntity(URI url, Class<T> responseType){}

getForEntity()方法返回的是ResponseEntity對象,如果要轉換成pojo,還需要使用JSON的工具類,fastjson或Jack son,ResponseEntity對象方便處理原生的response信息;

 /**
     * 無參數get請求,返回ResponseEntity對象
     */
    @Test
    public void testRestTemplate4(){
        String url ="http://localhost:8081/show/org/get/1";
        ResponseEntity<Org> s= restTemplate.getForEntity(url, Org.class);
        System.out.println(s.getStatusCode()+":"+s.getStatusCodeValue());
        System.out.println(" body :"+s.getBody());
        Org org = s.getBody();
        System.out.println(org.getOrgNo());
    }

4、post請求

post請求也有postForObject()方法和postForEntity()方法

4.1、postForObject()方法

	public <T> postForObject(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables)
throws RestClientException {}

	public <T> postForObject(String url, @Nullable Object request, Class<T> responseType, Map<String, ?> uriVariables)
throws RestClientException {}

	public &lt;T&gt; T postForObject(URI url, @Nullable Object request, Class<T> responseType,  responseType) throws RestClientException {}

/**
     * 無參數post請求,返回Object對象,使用map傳遞參數
     */
    @Test
    public void testRestTemplate5(){
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        MultiValueMap<String, String> map= new LinkedMultiValueMap<>();
        map.add("id", "123");
        map.add("orgNo", "123");
        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);
        String url ="http://localhost:8081/show/org/post";
        Org s= restTemplate.postForObject(url, request, Org.class);

    }

4.2、postForEntity()方法

@Override
	public <T> ResponseEntity<T> postForEntity(String url, @Nullable Object request,
			Class<T> responseType, Object... uriVariables) throws RestClientException {}

	@Override
	public <T> ResponseEntity<T> postForEntity(String url, @Nullable Object request,
			Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException {}

	@Override
	public <T> ResponseEntity<T> postForEntity(URI url, @Nullable Object request, Class<T> responseType)
			throws RestClientException {}

4.3、exchange()方法

exchange()可以指定HttpMethod,請求體requestEntity,建議在開發中使用exchange方法

 /**
     *
     */
    @Test
    public void testRestTemplate6(){
        String url ="http://localhost:8081/show/org/get/1";
        ResponseEntity<Org> s= restTemplate.exchange(url, HttpMethod.GET,null, Org.class);
        System.out.println(s.getBody());
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM