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