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));
}
posted @ 2021-03-10 13:18  WheelCode  阅读(219)  评论(0)    收藏  举报