Как Java-разработчик, я обычно вызываю внешние сервисы через интерфейс PRC, но на этот раз бизнес-процессы предоставляют только Http-интерфейс, поэтому я немного беспокоюсь...
Основное использование RestTemplate
Resttemplate Spring реализован, HTTP-запрос на шаблон Restful Style. Использовать Resttemplate Manse может упростить сложность запрошенной операции, а стандартизированный стиль кода.
Получить запрос
// 将返回结果转换成POJO对象
public <T> T getForObject(String url, Class<T> responseType)
// 返回Http原生信息(状态码、请求头、body)
public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType)
Практика: получите девиз дня Nuggets
@Data
public class Result<T> implements Serializable {
private int err_no;
private String err_msg;
private T data;
}
private String urlFormat = "https://api.juejin.cn/growth_api/v1/get_coder_calendar?aid=%s&uuid=7037140143551399436";
private RestTemplate restTemplate = new RestTemplate();
@Test
public void testGet() {
String url = String.format(urlFormat, "xxx");
Result result = restTemplate.getForObject(url, Result.class);
System.out.println(result);
}
Сегодня «Наггетс» подписали девиз:
Result(err_no=0, err_msg=success, data={aphorism=文档书写能力对工程师来说,与代码能力一样重要, should_or_not=宜追查到底})
Отправить запрос
// 将返回结果转换成POJO对象
public <T> T postForObject(String url, Object request, Class<T> responseType)
// 返回Http原生信息(状态码、请求头、body)
public <T> ResponseEntity<T> postForEntity(String url, Object request, Class<T> responseType)
Практика: автоматическая лотерея Nuggets
private String urlFormat = "https://api.juejin.cn/growth_api/v1/lottery/draw?aid=%s&uuid=6994739894300935684&_signature=_02B4Z6wo00901IFbWBAAAIDCsQ1vhfdqjSiBXlyAAEICZNX6.YFOgtHG7h9uKHxa1gwR5xaQh55ytA4gMUM6N9JboQDq5siTnpplhowAUX5HCv6Raat44rC31FskryqQD2bKbOyfkMoyJXev06";
private String cookie = "xxx";
private RestTemplate restTemplate = new RestTemplate();
public void testPost() {
String url = String.format(urlFormat, "2608");
// 请求头
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set(HttpHeaders.COOKIE, cookie);
// 请求体
JSONObject body = new JSONObject();
HttpEntity<String> request = new HttpEntity(body.toString(), headers);
Result result = restTemplate.postForObject(urlFormat, request, Result.class);
System.out.println(((Map) result.getData()).get("lottery_name"));
}
Расширенные знания RestTemplate
- Метод getForObject() не может передать значение для заголовка заголовка запроса, вы можете использовать базовые общие методы exchange() или execute(); (
获取掘金剩余矿石数,大家可以用这两种方法:支持Get请求+header传参
) - Блог о начале работы с RestTemplate: #Резюме использования Spring RestTemplate #Springboot — отправлять HTTP-запросы более элегантным способом (детали RestTemplate)
- Блог принципа RestTemplate: #RestTemplate добавляет обработку тайм-аута, выбор ClientHttpRequestFactory #Анализ исходного кода restTemplate (каталог) # Некоторые мысли о пуле соединений HttpClient
Шаблон разработки RestTemplate
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate(clientHttpRequestFactory());
}
@Bean
public HttpClientConnectionManager poolingConnectionManager() {
PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager();
// 整个线程池中最大连接数
poolingConnectionManager.setMaxTotal(200);
// 路由到某台主机最大并发数
poolingConnectionManager.setDefaultMaxPerRoute(100);
return poolingConnectionManager;
}
@Bean
public ClientHttpRequestFactory clientHttpRequestFactory() {
HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
httpClientBuilder.setConnectionManager(poolingConnectionManager());
clientHttpRequestFactory.setHttpClient(httpClientBuilder.build());
// 客户端和服务器建立连接的超时时间
clientHttpRequestFactory.setConnectTimeout(1000);
// 客户端从服务器读取数据的超时时间
clientHttpRequestFactory.setReadTimeout(3000);
return clientHttpRequestFactory;
}
}