日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

REST访问(RestTemplate)

發布時間:2025/3/8 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 REST访问(RestTemplate) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.



https://www.cnblogs.com/softidea/p/6910198.html

經常需要發送一個GET/POST請求到其他系統(REST API),通過JDK自帶的HttpURLConnection、Apache HttpClient、Netty 4、OkHTTP 2/3都可以實現。

HttpClient的使用:http://rensanning.iteye.com/blog/1550436

Spring的RestTemplate封裝了這些庫的實現,使用起來更簡潔。

RestTemplate包含以下幾個部分:?
HttpMessageConverter 對象轉換器
ClientHttpRequestFactory 默認是JDK的HttpURLConnection
ResponseErrorHandler 異常處理
ClientHttpRequestInterceptor 請求攔截器

@Service public class AccountService { @Autowired private RestTemplate restTemplate; // ... }

(1)發送GET請求(getForObject()、getForEntity()、exchange())?

// 1-getForObject() User user1 = this.restTemplate.getForObject(uri, User.class); // 2-getForEntity() ResponseEntity<User> responseEntity1 = this.restTemplate.getForEntity(uri, User.class); HttpStatus statusCode = responseEntity1.getStatusCode(); HttpHeaders header = responseEntity1.getHeaders(); User user2 = responseEntity1.getBody(); // 3-exchange() RequestEntity requestEntity = RequestEntity.get(new URI(uri)).build(); ResponseEntity<User> responseEntity2 = this.restTemplate.exchange(requestEntity, User.class); User user3 = responseEntity2.getBody();

?

(2)發送POST請求(postForObject()、postForEntity()、exchange())?

// 1-postForObject() User user1 = this.restTemplate.postForObject(uri, user, User.class); // 2-postForEntity() ResponseEntity<User> responseEntity1 = this.restTemplate.postForEntity(uri, user, User.class); // 3-exchange() RequestEntity<User> requestEntity = RequestEntity.post(new URI(uri)).body(user); ResponseEntity<User> responseEntity2 = this.restTemplate.exchange(requestEntity, User.class);

?


(3)設置HTTP Header信息?

// 1-Content-Type RequestEntity<User> requestEntity = RequestEntity .post(new URI(uri)) .contentType(MediaType.APPLICATION_JSON) .body(user); // 2-Accept RequestEntity<User> requestEntity = RequestEntity .post(new URI(uri)) .accept(MediaType.APPLICATION_JSON) .body(user); // 3-Other RequestEntity<User> requestEntity = RequestEntity .post(new URI(uri)) .header("Authorization", "Basic " + base64Credentials) .body(user);

?

(4)異常處理?

捕獲HttpServerErrorException?

int retryCount = 0; while (true) { try { responseEntity = restTemplate.exchange(requestEntity, String.class); break; } catch (HttpServerErrorException e) { if (retryCount == 3) { throw e; } retryCount++; } }

?

自定義異常處理?

public class CustomErrorHandler extends DefaultResponseErrorHandler { @Override public void handleError(ClientHttpResponse response) throws IOException { } }

?

@Configuration public class RestClientConfig { @Bean public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); restTemplate.setErrorHandler(new CustomErrorHandler()); return restTemplate; } }

?


(5)設置超時時間?

@Configuration public class RestClientConfig { @Bean public RestTemplate restTemplate() { return new RestTemplate(clientHttpRequestFactory()); } private ClientHttpRequestFactory clientHttpRequestFactory() { HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(); factory.setReadTimeout(2000); factory.setConnectTimeout(2000); return factory; } }

?


(6)設置連接池?

@Configuration public class RestClientConfig { @Bean public ClientHttpRequestFactory httpRequestFactory() { return new HttpComponentsClientHttpRequestFactory(httpClient()); } @Bean public RestTemplate restTemplate() { return new RestTemplate(httpRequestFactory()); } @Bean public HttpClient httpClient() { Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory> create() .register("http", PlainConnectionSocketFactory.getSocketFactory()) .register("https", SSLConnectionSocketFactory.getSocketFactory()) .build(); PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry); connectionManager.setMaxTotal(5); connectionManager.setDefaultMaxPerRoute(5); RequestConfig requestConfig = RequestConfig.custom() .setSocketTimeout(8000) .setConnectTimeout(8000) .setConnectionRequestTimeout(8000) .build(); return HttpClientBuilder.create() .setDefaultRequestConfig(requestConfig) .setConnectionManager(connectionManager) .build(); } }

?

(7)發送文件?

MultiValueMap<String, Object> multiPartBody = new LinkedMultiValueMap<>(); multiPartBody.add("file", new ClassPathResource("/tmp/user.txt")); RequestEntity<MultiValueMap<String, Object>> requestEntity = RequestEntity .post(uri) .contentType(MediaType.MULTIPART_FORM_DATA) .body(multiPartBody);

?

(8)下載文件?

// 小文件 RequestEntity requestEntity = RequestEntity.get(uri).build(); ResponseEntity<byte[]> responseEntity = restTemplate.exchange(requestEntity, byte[].class); byte[] downloadContent = responseEntity.getBody(); // 大文件 ResponseExtractor<ResponseEntity<File>> responseExtractor = new ResponseExtractor<ResponseEntity<File>>() { @Override public ResponseEntity<File> extractData(ClientHttpResponse response) throws IOException { File rcvFile = File.createTempFile("rcvFile", "zip"); FileCopyUtils.copy(response.getBody(), new FileOutputStream(rcvFile)); return ResponseEntity.status(response.getStatusCode()).headers(response.getHeaders()).body(rcvFile); } }; File getFile = this.restTemplate.execute(targetUri, HttpMethod.GET, null, responseExtractor);

?

(9)Spring Boot的RestTemplateBuilder?

全局設置?

@Component public class CustomRestTemplateCustomizer implements RestTemplateCustomizer { @Override public void customize(RestTemplate restTemplate) { new RestTemplateBuilder() .detectRequestFactory(false) .basicAuthorization("username", "password") .uriTemplateHandler(new OkHttp3ClientHttpRequestFactory()) .errorHandler(new CustomResponseErrorHandler()) .configure(restTemplate); } }

?


單獨設置?

@Service public class MyRestClientService { private RestTemplate restTemplate; public MyRestClientService(RestTemplateBuilder restTemplateBuilder) { this.restTemplate = restTemplateBuilder .basicAuthorization("username", "password") .setConnectTimeout(3000) .setReadTimeout(5000) .rootUri("http://api.example.com/") .errorHandler(new CustomResponseErrorHandler()) .additionalMessageConverters(new CustomHttpMessageConverter()) .uriTemplateHandler(new OkHttp3ClientHttpRequestFactory()) .build(); } public String site() { return this.restTemplate.getForObject("http://rensanning.iteye.com/", String.class); } }

http://rensanning.iteye.com/blog/2362105

?

轉載于:https://www.cnblogs.com/softidea/p/9438783.html

總結

以上是生活随笔為你收集整理的REST访问(RestTemplate)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。