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; }