@CookieValue
添加一个或多个 cookie 。参数可以是包含多个 cookie 的 Map<String, ?> 或 MultiValueMap<String, ?>、值集合<?> 或单个值 。
支持的返回值
说明
void, Mono<Void>执行给定的请求,并发布响应内容(如果有) 。
HttpHeaders, Mono<HttpHeaders>执行给定的请求,释放响应内容(如果有),并返回响应标头 。
<T>, Mono<T>执行给定的请求,并根据声明的返回类型对响应内容进行解码 。
<T>, Flux<T>执行给定的请求,并将响应内容解码为已声明元素类型的数据流 。
ResponseEntity<Void>, Mono<ResponseEntity<Void>>执行给定的请求,释放响应内容(如果有) , 并返回一个包含状态和标头的 ResponseEntity 。
ResponseEntity<T>,Mono<ResponseEntity<T>>执行给定的请求,按照声明的返回类型解码响应内容,并返回一个包含状态、标头和解码后正文的 ResponseEntity 。
Mono<ResponseEntity<Flux<T>>
执行给定的请求 , 将响应内容解码为已声明元素类型的数据流,并返回一个包含状态、标头和解码后的响应正文数据流的 ResponseEntity 。
异常处理默认情况下,WebClient为4xx和5xx HTTP状态代码引发WebClientResponseException 。要自定义此项,可以注册响应状态处理程序,该处理程序应用于通过客户端执行的所有响应:
WebClient client = WebClient.builder()// 状态码为4xx或5xx.defaultStatusHandler(HttpStatusCode::isError, resp -> Mono.just(new RuntimeException(resp.statusCode().toString() + "请求错误"))).baseUrl("http://localhost:8088/").build() ;HttpServiceProxyFactory factory = HttpServiceProxyFactory.builder(WebClientAdapter.forClient(client)).build() ;RestClient该接口是在Spring6.1.1版本中才有的,是一个同步 HTTP 客户端,提供现代、流畅的 API 。创建RestClientRestClient 是通过静态创建方法之一创建的 。你还可以使用 builder 获取带有更多选项的生成器,例如指定要使用的 HTTP 库和要使用的消息转换器,设置默认 URI、默认路径变量、默认请求头,或注册拦截器和初始化器 。
创建(或构建)后,RestClient 可由多个线程安全使用 。
// 默认通过静态方法创建RestClient restClient = RestClient.create();// 自定义方式RestClient restClient = RestClient.builder().requestFactory(new HttpComponentsClientHttpRequestFactory())// 自定义消息转换器// .messageConverters(converters -> converters.add(new PackCustomMessageConverter())).baseUrl("http://localhost:8088").defaultUriVariables(Map.of("id", "888")).defaultHeader("x-api-token", "aabbcc").requestInterceptor(new ClientHttpRequestInterceptor() {@Overridepublic ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)throws IOException {System.out.println("我是拦截器") ;return execution.execute(request, body) ;}}).requestInitializer(new ClientHttpRequestInitializer() {@Overridepublic void initialize(ClientHttpRequest request) {System.out.println("我是初始化器") ;request.getHeaders().add("x-version", "1.0.0") ;}}).build() ;调用及处理返回值Users users = customClient.get().uri("/demos/users/{id}").retrieve().body(Users.class) ;post+body请求方式Users user = new Users();ResponseEntity<Void> response = restClient.post().uri("/demos/users").contentType(APPLICATION_JSON).body(user).retrieve().toBodilessEntity() ;错误处理默认情况下,当返回状态代码为 4xx 或 5xx 的响应时,RestClient 会抛出 RestClientException 的子类 。可以使用 onStatus.RestClientException 命令重写该行为 。Users users = customClient.get().uri("/demos/users/{id}").retrieve()// 处理返回状态码为:4xx和5xx.onStatus(HttpStatusCode::isError, (request, response) -> {throw new RuntimeException(response.getStatusCode().toString() + "请求错误") ;}).body(Users.class) ;总结:实现远程接口调用方面的强大功能 。无论是使用WebClient、RestTemplate、HTTP Interface还是直接使用RestClient,Spring都提供了丰富的工具和接口来简化开发者的操作 。这些工具和接口不仅具有高性能、低内存占用的优点 , 而且提供了良好的可扩展性和灵活性,使得开发者可以根据实际需求进行定制化开发 。
推荐阅读
- 再有人问你数据库连接池 Druid 的原理,这篇文章甩给他!
- 聊聊分布式数据库TDSQL的技术架构
- 2024年影响安全领域的五大技术趋势
- 互联网大厂是如何设计和使用缓存的?方案已开源!
- NAT协议的实现方式
- 一个GPT的幽灵在Gemini上空徘徊
- 搜索引擎如何判定网站的价值
- 为什么有的网站不更新文章也有很好的排名?
- TikTok独特的短视频美学探究
- 外国人喜欢什么?看看他们的网红就知道了!
