RestTemplate简单使用
RestTemplate
简单使用
初始化
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder){
return builder
.setConnectTimeout(Duration.ofMillis(100))
.setReadTimeout(Duration.ofMillis(500))
.requestFactory(this::requestFactory).build();
}
构造Url并使用
URI uri = UriComponentsBuilder
.fromUriString("http://localhost:8080/coffee/{id}")
.build(1);// 1 as uriVariables
// Entity 表示将完整的请求结果转换
ResponseEntity<Coffee> c = restTemplate.getForEntity(uri, Coffee.class);
log.info("Response Status: {}, Response Headers: {}", c.getStatusCode(), c.getHeaders().toString());
log.info("Coffee: {}", c.getBody());
String coffeeUri = "http://localhost:8080/coffee/";
Coffee request = Coffee.builder()
.name("Americano")
.price(BigDecimal.valueOf(25.00))
.build();
// for object 表示按照对应对象转换,无其他HTTP数据 ->post
Coffee response = restTemplate.postForObject(coffeeUri, request, Coffee.class);
log.info("New Coffee: {}", response);
// get
String s = restTemplate.getForObject(coffeeUri, String.class);
log.info("String: {}", s);
// another use
String urlTemplate = "http://121.37.181.51:8070/user";
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.set("Cookie", "");
// URI build = UriComponentsBuilder.fromUriString(urlTemplate).;
String postVar = "username=apollo";
// 注意此次的ReuestEntiy可以设置在URL含参时,使用exchange(URL,RequestEntity,Class)方法执行,entity中可以设置body与header
// RequestEntity<Void> body = RequestEntity.get
// .headers(httpHeaders).build();
// 在使用静态URL时,使用HttpEnity的构造函数设置body与header
HttpEntity<Object> entity = new HttpEntity<>(httpHeaders);
// 使用ParameterizedTypeReference 可以自动将body结果解析为推断的泛型
ParameterizedTypeReference<String> ptr = new ParameterizedTypeReference<String>() {};
ResponseEntity<String> exchange = restTemplate.exchange(urlTemplate, HttpMethod.GET, entity, ptr);
System.out.println(exchange.getHeaders());
HttpClient连接管理
public class CustomConnectionKeepAliveStrategy implements ConnectionKeepAliveStrategy {
private final long DEFAULT_SECONDS = 30;
@Override
public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
return Arrays.asList(response.getHeaders(HTTP.CONN_KEEP_ALIVE))
.stream()
.filter(h -> StringUtils.equalsIgnoreCase(h.getName(), "timeout")
&& StringUtils.isNumeric(h.getValue())).findFirst()
.map(h -> NumberUtils.toLong(h.getValue(), DEFAULT_SECONDS))
.orElse(DEFAULT_SECONDS) * 1000;
}
}
@Bean
public HttpComponentsClientHttpRequestFactory requestFactory() {
PoolingHttpClientConnectionManager connectionManager =
new PoolingHttpClientConnectionManager(30, TimeUnit.SECONDS);
connectionManager.setMaxTotal(200);
connectionManager.setDefaultMaxPerRoute(20);
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(connectionManager)
.evictIdleConnections(30, TimeUnit.SECONDS)
.disableAutomaticRetries()
// 有 Keep-Alive 认里面的值,没有的话永久有效
//.setKeepAliveStrategy(DefaultConnectionKeepAliveStrategy.INSTANCE)
// 换成自定义的
.setKeepAliveStrategy(new CustomConnectionKeepAliveStrategy())
.build();
HttpComponentsClientHttpRequestFactory requestFactory =
new HttpComponentsClientHttpRequestFactory(httpClient);
return requestFactory;
}
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
// return new RestTemplate();
return builder
.setConnectTimeout(Duration.ofMillis(100))
.setReadTimeout(Duration.ofMillis(500))
.requestFactory(this::requestFactory).build();
}
WebClient
以Reactive方式处理Http请求
使用前先参考 Reactor响应式编程
webClient.get()
.uri("/coffee/{id}", 1)
.accept(MediaType.APPLICATION_JSON_UTF8)
.retrieve()
.bodyToMono(Coffee.class)
.doOnError(t -> log.error("Error: ", t))
.doFinally(s -> cdl.countDown())
.subscribeOn(Schedulers.single())
.subscribe(c -> log.info("Coffee 1: {}", c));
Mono<Coffee> americano = Mono.just(
Coffee.builder()
.name("americano")
.price(Money.of(CurrencyUnit.of("CNY"), 25.00))
.build()
);
webClient.post()
.uri("/coffee/")
.body(americano, Coffee.class)
.retrieve()
.bodyToMono(Coffee.class)
.doFinally(s -> cdl.countDown())
.subscribeOn(Schedulers.single())
.subscribe(c -> log.info("Coffee Created: {}", c));
cdl.await();
webClient.get()
.uri("/coffee/")
.retrieve()
.bodyToFlux(Coffee.class)
.toStream()
.forEach(c -> log.info("Coffee in List: {}", c));
}

浙公网安备 33010602011771号