SpringBoot 使用RestTemplate調用第三方接口


HTTPClient

在RestTemplate出現之前,一般都是通過HTTPClient進行訪問第三方接口。但是過程比較復雜。

    public String httpClientTest() throws IOException {
        //1,創建httpClient
        CloseableHttpClient client = HttpClients.createDefault();
        //2,封裝請求參數
        List<BasicNameValuePair> list = new ArrayList<>();
        list.add(new BasicNameValuePair("name","tom"));
        //3,轉化參數
        String params = EntityUtils.toString(new UrlEncodedFormEntity(list, Consts.UTF_8));
        //4,創建HttpGet請求
        HttpGet httpGet = new HttpGet("url接口地址" + "?" + params);
        CloseableHttpResponse response = client.execute(httpGet);
        //5,獲取實體
        HttpEntity entity = response.getEntity();
        //將實體轉換為字符串
        String result = EntityUtils.toString(entity);
        response.close();
        return result;
    }

RestTemplate

相對於HTTPClient,RestTemplate簡潔。

1)注入Bean,將RestTemplate注入到容器之中。

    @Bean
    public RestTemplate getRestTemplate(){
        RestTemplate restTemplate = new RestTemplate();
        HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
        httpRequestFactory.setConnectionRequestTimeout(30*1000);
        httpRequestFactory.setReadTimeout(30*3000);
        httpRequestFactory.setConnectTimeout(30*3000);
        //修改字符集,否則返回的結果中會出現亂碼
        List<HttpMessageConverter<?>> list = restTemplate.getMessageConverters();
        for (HttpMessageConverter<?> httpMessageConverter:list){
            if(httpMessageConverter instanceof StringHttpMessageConverter){
                ((StringHttpMessageConverter)httpMessageConverter).setDefaultCharset(Charset.forName("utf-8"));
                break;
            }
        }
        return restTemplate;
    }

配置RestTemplate https請求 忽略ssl證書

@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
        return new RestTemplate(factory);
    }

    @Bean
    public ClientHttpRequestFactory simpleClientHttpRequestFactory() throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException {
        TrustStrategy acceptingTrustStrategy = (x509Certificates, authType) -> true;
        SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build();
        SSLConnectionSocketFactory connectionSocketFactory = new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier());

        HttpClientBuilder httpClientBuilder = HttpClients.custom();
        httpClientBuilder.setSSLSocketFactory(connectionSocketFactory);
        CloseableHttpClient httpClient = httpClientBuilder.build();

        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
        factory.setHttpClient(httpClient);
        factory.setReadTimeout(5000);// ms
        factory.setConnectTimeout(15000);// ms

        return factory;
    }
}

2)在調用第三方接口的controller里面注入RestTemplate。

@Autowired
private RestTemplate restTemplate;

RestTemplate常用方法

get請求方法

  post請求方法

 

 getForEntity與getForObject的區別

  兩者的返回類型不一樣,getForEntity的返回類型是固定的,只能是ResponseEntity,但是ResponseEntity里面包含的數據時可以變化的;getForObject的返回類型是可以變化的,也就是自定義。

  getForObject相對於getForEntity來說,多了一步類型轉換的步驟,可以理解getForObject對getForEntity獲得的數據進行了更進一步的封裝,只讓用戶注重於數據本身,而其他一些無關緊要的一些緊要的數據,比如請求頭,響應狀態這些數據全部都隱藏起來了,只讓用戶看到查詢出來的數據。

get請求方法

1)ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables)

public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables) throws RestClientException {
        RequestCallback requestCallback = this.acceptHeaderRequestCallback(responseType);
        ResponseExtractor<ResponseEntity<T>> responseExtractor = this.responseEntityExtractor(responseType);
        return (ResponseEntity)this.execute(url, HttpMethod.GET, requestCallback, responseExtractor, uriVariables);
}

請求的參數是對象,可以調用此方法。

User user=new User();
ResponseEntity<String> responseEntity=restTemplate.getForEntity("",String.class,user);

2)ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables)

public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException {
        RequestCallback requestCallback = this.acceptHeaderRequestCallback(responseType);
        ResponseExtractor<ResponseEntity<T>> responseExtractor = this.responseEntityExtractor(responseType);
        return (ResponseEntity)this.execute(url, HttpMethod.GET, requestCallback, responseExtractor, uriVariables);
}

請求的參數不是對象,而是幾個基本類型或String類型的參數。

Map<String,Object> map=new HashMap<>();
map.put("name","tom");
map.put("age",18);
ResponseEntity<String> responseEntity=restTemplate.getForEntity("接口地址",String.class,map);

3)ResponseEntity<T> getForEntity(URI url, Class<T> responseType)

public <T> ResponseEntity<T> getForEntity(URI url, Class<T> responseType) throws RestClientException {
        RequestCallback requestCallback = this.acceptHeaderRequestCallback(responseType);
        ResponseExtractor<ResponseEntity<T>> responseExtractor = this.responseEntityExtractor(responseType);
        return (ResponseEntity)this.execute(url, HttpMethod.GET, requestCallback, responseExtractor);
}

直接請求,不需要參數。

4)T getForObject(String url, Class<T> responseType, Object... uriVariables)

    public <T> T getForObject(String url, Class<T> responseType, Object... uriVariables) throws RestClientException {
        RequestCallback requestCallback = this.acceptHeaderRequestCallback(responseType);
        HttpMessageConverterExtractor<T> responseExtractor = new HttpMessageConverterExtractor(responseType, this.getMessageConverters(), this.logger);
        return this.execute(url, HttpMethod.GET, requestCallback, responseExtractor, (Object[])uriVariables);
    }

 5)T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables)

    public <T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException {
        RequestCallback requestCallback = this.acceptHeaderRequestCallback(responseType);
        HttpMessageConverterExtractor<T> responseExtractor = new HttpMessageConverterExtractor(responseType, this.getMessageConverters(), this.logger);
        return this.execute(url, HttpMethod.GET, requestCallback, responseExtractor, (Map)uriVariables);
    }

 6)T getForObject(URI url, Class<T> responseType)

    public <T> T getForObject(URI url, Class<T> responseType) throws RestClientException {
        RequestCallback requestCallback = this.acceptHeaderRequestCallback(responseType);
        HttpMessageConverterExtractor<T> responseExtractor = new HttpMessageConverterExtractor(responseType, this.getMessageConverters(), this.logger);
        return this.execute(url, HttpMethod.GET, requestCallback, responseExtractor);
    }

 

post請求方法

1)ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables)

    public <T> ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables) throws RestClientException {
        RequestCallback requestCallback = this.httpEntityCallback(request, responseType);
        ResponseExtractor<ResponseEntity<T>> responseExtractor = this.responseEntityExtractor(responseType);
        return (ResponseEntity)nonNull(this.execute(url, HttpMethod.POST, requestCallback, responseExtractor, uriVariables));
    }

2)ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType, Map<String, ?> uriVariables)

    public <T> ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException {
        RequestCallback requestCallback = this.httpEntityCallback(request, responseType);
        ResponseExtractor<ResponseEntity<T>> responseExtractor = this.responseEntityExtractor(responseType);
        return (ResponseEntity)nonNull(this.execute(url, HttpMethod.POST, requestCallback, responseExtractor, uriVariables));
    }

3)ResponseEntity<T> postForEntity(URI url, @Nullable Object request, Class<T> responseType)

    public <T> ResponseEntity<T> postForEntity(URI url, @Nullable Object request, Class<T> responseType) throws RestClientException {
        RequestCallback requestCallback = this.httpEntityCallback(request, responseType);
        ResponseExtractor<ResponseEntity<T>> responseExtractor = this.responseEntityExtractor(responseType);
        return (ResponseEntity)nonNull(this.execute(url, HttpMethod.POST, requestCallback, responseExtractor));
    }

4)T postForObject(String url, Object request, Class<T> responseType, Object... uriVariables)

public <T> T postForObject(String url, Object request, Class<T> responseType, Object... uriVariables) throws RestClientException {
        RequestCallback requestCallback = this.httpEntityCallback(request, responseType);
        HttpMessageConverterExtractor<T> responseExtractor = new HttpMessageConverterExtractor(responseType, this.getMessageConverters(), this.logger);
        return this.execute(url, HttpMethod.POST, requestCallback, responseExtractor, (Object[])uriVariables);
}

5)T postForObject(String url, Object request, Class<T> responseType, Map<String, ?> uriVariables)

public <T> T postForObject(String url, Object request, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException {
        RequestCallback requestCallback = this.httpEntityCallback(request, responseType);
        HttpMessageConverterExtractor<T> responseExtractor = new HttpMessageConverterExtractor(responseType, this.getMessageConverters(), this.logger);
        return this.execute(url, HttpMethod.POST, requestCallback, responseExtractor, (Map)uriVariables);
}

6)T postForObject(URI url, Object request, Class<T> responseType) 

public <T> T postForObject(URI url, Object request, Class<T> responseType) throws RestClientException {
        RequestCallback requestCallback = this.httpEntityCallback(request, responseType);
        HttpMessageConverterExtractor<T> responseExtractor = new HttpMessageConverterExtractor(responseType, this.getMessageConverters());
        return this.execute(url, HttpMethod.POST, requestCallback, responseExtractor);
    }

示例

//url(請求路徑)  entityJson(傳遞參數json串)   post傳參     此請求方式可用於列表條件查詢   添加修改方法(多參數傳值)
    public  String  postForObject(String url,String entityJson){
        HttpHeaders headers = new HttpHeaders();
        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
        headers.setContentType(type);
        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
        HttpEntity<String> formEntity = new HttpEntity<String>(entityJson, headers);
        String result=restTemplate.postForObject(url,formEntity,String.class); 
        return result;
    }
    public  String  postForObject(String url,HttpServletRequest request,String entityJson){
        HttpHeaders headers = new HttpHeaders();
        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
        headers.setContentType(type);
        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
        headers.add("token", request.getHeader("token"));
        headers.add("uid", request.getHeader("uid"));
        headers.add("userid", request.getHeader("userid"));
        
        HttpEntity<String> formEntity = new HttpEntity<String>(entityJson, headers);
        String result=restTemplate.postForObject(url,formEntity,String.class); 
        return result;
    }

 


免責聲明!

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



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