【问题标题】:ContentType header with json schema URL parameter in Spring WebClientSpring WebClient 中带有 json 模式 URL 参数的 ContentType 标头
【发布时间】:2021-11-07 14:10:33
【问题描述】:

我正在使用 Spring 集成到第三方 API。此 API 验证 Content-Type 标头并要求它完全 application/json;profile=https://se.digitalreceipts.net/schemas/json/retail/v1.0

下面的代码是我对 API 进行的 POST 调用的相关部分。

    webClient.post()
        .uri("/dr/v1/receipts")
        .attributes(clientRegistrationId(clientRegistrationId))
        .header("Content-Type", "application/json;profile=https://se.digitalreceipts.net/schemas/json/retail/v1.0")

执行此请求时抛出异常:

org.springframework.http.InvalidMediaTypeException: Invalid mime type "application/json;profile=https://se.digitalreceipts.net/schemas/json/retail/v1.0": Invalid token character ':' in token "https://se.digitalreceipts.net/schemas/json/retail/v1.0"
    at org.springframework.http.MediaType.parseMediaType(MediaType.java:620) ~[spring-web-5.3.10.jar:5.3.10]

似乎 spring 不允许在 Content-Type 标头中使用冒号。 这是一个问题,因为我正在集成的 API 绝对要求内容类型标头与之前指定的完全相同。 例如,我不能用引号写值 application/json;profile="https://se.digitalreceipts.net/schemas/json/retail/v1.0"

我正在寻找一种解决方案,我可以使用 Spring WebClient 输入所需的 Content-Type 标头。

【问题讨论】:

    标签: java spring http-headers spring-webclient


    【解决方案1】:

    Content-Type 标头必须遵循RFC 2045 section 5.1 中描述的格式。声明特殊字符必须在带引号的字符串中,才能在参数值中使用。

    Spring 在执行 REST API 调用之前解析 Content-Type 标头并解析 validates mimeType。 如果我们引用 profile 属性的值,那么 mimeType 是有效的。 例如:

    webClient.post()
        .uri("/dr/v1/receipts")
        .attributes(clientRegistrationId(clientRegistrationId))
        .header("Content-Type", "application/json;profile=\"https://se.digitalreceipts.net/schemas/json/retail/v1.0\"")
    

    【讨论】:

      猜你喜欢
      • 2021-10-07
      • 1970-01-01
      • 2021-06-10
      • 2015-05-11
      • 2017-05-04
      • 2018-05-26
      • 1970-01-01
      • 2020-05-02
      • 2011-12-14
      相关资源
      最近更新 更多