返回
无法向 Spring WebClient 发送十六进制正文?两种解决方法
java
2024-03-06 21:51:46
使用 Spring WebClient 发送十六进制正文的 PUT 请求
问题陈述
当你使用 Spring WebClient 发送 PUT 请求时,如果你将 Content-Type 设置为 "hex",则可能会遇到 "Invalid mime type "hex": does not contain '/'" 错误。这是因为 WebClient 无法识别不符合媒体类型规范的 "hex" 内容类型。
解决方法
方法 1:使用自定义 BodyInserter
你可以使用自定义 BodyInserter 来向请求中添加十六进制正文,如下所示:
WebClient.builder().build()
.put()
.uri(this.URL)
.header(HttpHeaders.CONTENT_TYPE, "hex")
.body(BodyInserters.fromValue(bodyValue)) // 其中 bodyValue 是以字节数组形式的十六进制值
.retrieve()
.bodyToMono(String.class);
方法 2:使用流传输
另一种方法是使用流传输,如下所示:
WebClient.builder().build()
.put()
.uri(this.URL)
.header(HttpHeaders.CONTENT_TYPE, "hex")
.body(BodyInserters.fromInputStream(() -> {
// 返回一个提供十六进制值的 InputStream
}))
.retrieve()
.bodyToMono(String.class);
结论
使用上述方法,你可以将十六进制值作为正文发送,解决 "Invalid mime type "hex": does not contain '/'" 错误。根据你的特定需求,选择最适合你的方法。
常见问题解答
-
为什么需要使用自定义 BodyInserter 或流传输?
因为 "hex" 内容类型不被 WebClient 原生支持。 -
我应该使用哪种方法?
如果你的十六进制值已经存储在一个 byte[] 中,那么自定义 BodyInserter 是一种简单的方法。而流传输更灵活,因为它允许你从不同的来源获取十六进制值。 -
是否有其他解决方法?
没有其他已知的解决方法。 -
此问题仅限于 Spring WebClient 吗?
其他 HTTP 客户端库也可能遇到类似的问题。 -
十六进制正文有什么用途?
十六进制正文通常用于发送二进制数据,例如图像或文件。