问题标签 [spring-webclient]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
4174 浏览

java - Spring webclient在尝试转换bodyToMono时抛出不受支持的媒体类型异常, POST 请求

我正在尝试使用 spring-webclient 使用 api。下面是我的代码。代码在 kotlin

它在下面抛出错误

org.springframework.web.reactive.function.UnsupportedMediaTypeException:bodyType=java.util.UUID 不支持内容类型'text/plain;charset=UTF-8'

如果我试图转换为字符串,它工作正常。下面的代码

我期望从 API 得到的响应如下

}

0 投票
1 回答
5093 浏览

java - 使用带有 Spring WebClient 的 exchange() 时如何抛出 WebClientResponseException

当将 Spring WebClient 的 retrieve() 方法与 bodyToMono 结合使用时,将应用默认错误处理(如果响应的状态码为 4xx 或 5xx,则 Mono 将包含 WebClientException)。在错误情况下,生成的 WebClientException 非常有用,因为它包含请求和响应,这对于记录日志非常方便。此外,我可以很好地对错误做出反应。

但是,有时我需要知道响应的确切状态代码才能在进一步处理此响应时对其做出反应。获得状态码的唯一方法是调用 exchange() 方法而不是 retrieve() 方法。不幸的是,在这种情况下,不应用默认错误处理。原因似乎是在 ClientResponse 上调用 bodyToMono() 与在 ResponseSpec 上调用它具有不同的语义。

我不能调用 Spring 中已经实现的方法来“触发”错误处理,因为所有好的方法都被隐藏在 WebClient 中作为私有方法。

即使我尝试“手动”创建 WebClientResponseException 我也无法访问请求以提供给异常。

“模仿”与 retrieve() 方法相同的行为的最佳方法是什么?

0 投票
1 回答
1717 浏览

java - 出错时再次调用并在 webflux 中重试

我想使用WebClientfrom spring webflux 执行以下操作:

  • 称呼endpoint1
  • 如果它失败并出现预期错误,那么
    • 打电话endpoint2
    • 只重试endpoint1一次

我已经做到了这一点:

请求时我无法阻止,endpoint2因为我会收到以下错误:(block()/blockFirst()/blockLast() are blocking, which is not supported in thread我也不想阻止)。

也许我应该使用retryWhen,但我不确定如何使用它。

0 投票
1 回答
3448 浏览

spring-boot - Spring Webclient 连接未正确关闭

我正在尝试使用 Springboot-Reactive webclient 进行 HTTP 调用。我因远程服务器错误而关闭连接。

请找到以下使用 Webclient 进行休息调用的代码。

Webclient创建的代码:

第一次通话后,我收到以下日志:

当我在一段时间后(比如 10 分钟)拨打电话时,连接变为非活动状态。我收到以下日志:

我看到连接没有正确返回到池中。我在配置中有什么遗漏吗?我是否正确关闭了连接?我认为这应该由netty处理,对吗?

0 投票
1 回答
4966 浏览

spring-webflux - Spring webclient 是非阻塞客户端吗?

我不明白反应式网络客户端的工作原理。它说spring webclient是非阻塞客户端,但是这个webclient似乎在等待来自远程api的onComplete()信号,然后它可以处理从远程api发出的每个项目。当从目标 api 触发 onNext() 时,我期望 webclient 可以处理每个项目

我是春季 webflux 世界的新手。我读过它,它说它使用 netty 作为默认服务器。而这个网络使用事件循环。所以为了理解它是如何工作的,我尝试创建 2 个小应用程序,客户端和服务器。服务器应用程序仅返回简单的通量,每个项目延迟 1 秒。客户端应用程序使用 webclient 调用远程 api。

服务器:

客户:

从服务器登录:

来自客户端的日志:

我希望客户端不会等待 4 秒然后得到实际结果。如您所见,服务器在 22:44:21.126 开始发出 onNext() ,客户端在22:44:24.159获得结果。所以我不明白如果 webclient 有这种行为,为什么它被称为非阻塞客户端。

0 投票
1 回答
241 浏览

spring - 如何使用 Spring WebClient 处理标准状态?

我想以同样的方式处理标准的 http 错误。我怎么能用 Spring 做到这一点WebClient?而不是在下面的每个呼叫上挂起状态检查

0 投票
1 回答
8739 浏览

spring-boot - WebClient 的 bodyToMono 关于空体预期行为

当 WebClient bodyToMono 遇到空主体时,预期的行为是什么?在我的具体示例中,我们正在检查从 post 调用返回的状态,如果将其转换为我们的自定义错误格式是错误的。如果转换为自定义错误格式失败,我们会在自定义格式中创建一个新错误,说明这一点。但是,当响应是一个空主体的错误时,它根本没有发回任何错误,因为 bodyToMono 没有像我预期的那样失败。请参见下面的代码块:

为了解决这个问题,我们添加了 switchIfEmpty。

我的问题是:这是 bodyToMono 的预期行为吗?由于我明确要求将响应主体映射到我的 ErrorResponse 对象,我希望一个空主体出错,然后点击 doOnError 块,但它只是“成功”/返回一个空单声道......因此我们添加switchIfEmpty 块。如果我们映射到的对象具有可为空的字段,我可以看到它没有错误,但是由于所有字段都是必需的,为什么 bodyToMono 在尝试将“无”映射到我的对象时不会抛出错误?

0 投票
2 回答
9081 浏览

spring-boot - 如何记录 spring-webflux WebClient 请求 + 响应详细信息(正文、标头、elasped_time)?

基本上,我想在一个日志中记录请求/响应信息,其中包含带有 Spring 的正文/标题WebClient

使用 Spring RestTemplate,我们可以使用ClientHttpRequestInterceptor. 我ExchangeFilterFunction为 Spring找到了WebClient一些东西,但还没有设法以一种干净的方式做类似的事情。我们可以使用此过滤器并记录请求,然后记录响应,但我需要在同一个日志跟踪中。

此外,我还没有设法用ExchangeFilterFunction.ofResponseProcessor方法获得响应体。

我希望这样的日志(当前实现与 ClientHttpRequestInterceptor 一起使用)包含我需要的所有信息:

有没有人设法用 Spring WebClient 做这样的事情?或者如何继续使用 Spring WebClient 跟踪请求/响应问题?

0 投票
0 回答
54 浏览

java - 如何使用 Spring WebClient 将 HTTP 请求的执行与 HTTP 响应体的解析分开?

我想将 HTTP 请求的执行与使用 Spring 的 HTTP 响应正文的解析分开WebClient

我想编写分别测试这些问题的测试,以便我可以轻松确定问题存在于何处(在请求的执行中或在响应正文的解析中)。我不希望请求调用失败,因为响应是原始字符串,即使我期待 JSON。

WebClient似乎只能一步执行请求并解析响应的正文:

我想做这样的事情:

0 投票
4 回答
18073 浏览

java - Spring WebClient:如何将大字节 [] 流式传输到文件?

似乎SpringRestTemplate无法将响应直接流式传输到文件而不将其全部缓冲在内存中。使用较新的 Spring 5 实现这一目标的正确方法是什么WebClient

我看到人们已经找到了一些解决这个问题的方法/技巧RestTemplate,但我更感兴趣的是使用WebClient.

有许多RestTemplate用于下载二进制数据的示例,但几乎所有示例都将其加载byte[]到内存中。