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