返回

无法向 Spring WebClient 发送十六进制正文?两种解决方法

java

使用 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 '/'" 错误。根据你的特定需求,选择最适合你的方法。

常见问题解答

  1. 为什么需要使用自定义 BodyInserter 或流传输?
    因为 "hex" 内容类型不被 WebClient 原生支持。

  2. 我应该使用哪种方法?
    如果你的十六进制值已经存储在一个 byte[] 中,那么自定义 BodyInserter 是一种简单的方法。而流传输更灵活,因为它允许你从不同的来源获取十六进制值。

  3. 是否有其他解决方法?
    没有其他已知的解决方法。

  4. 此问题仅限于 Spring WebClient 吗?
    其他 HTTP 客户端库也可能遇到类似的问题。

  5. 十六进制正文有什么用途?
    十六进制正文通常用于发送二进制数据,例如图像或文件。