“application/*+json”是 HTTP 中有效的 Accept 标头吗

Jos*_*phH 6 http mime-types

java spring框架的http客户端似乎默认发送此Accept标头:

Accept: text/plain, application/json, application/*+json, */*
Run Code Online (Sandbox Code Playgroud)

我对“application/*+json”部分很好奇。我相信这样做的目的是匹配任何开始application/和结束的哑剧类型+json- 例如。application/vnd.api+json

然而,看看RFC 7231 第 5.3.2 节,它说:

media-range    = ( "*/*"
                      / ( type "/" "*" )
                      / ( type "/" subtype )
                      ) *( OWS ";" OWS parameter )
Run Code Online (Sandbox Code Playgroud)

这似乎专门允许使用 * 而不是子类型,而不是作为子类型的一部分 - 表明“application/*+json”应该只匹配实际上作为名称中的 * 的 mime 类型。

一般而言,mime 类型的“+”语法在https://www.rfc-editor.org/rfc/rfc6839中定义- 但是其中似乎没有任何内容允许将其应用于 HTTP RFC 定义的通配符。

是否有其他一些 RFC 扩大了定义,或者 spring 发送了错误的 Accept: 标头?

Jul*_*hke 6

我相信答案是“不”。HTTP 允许的值在https://www.greenbytes.de/tech/webdav/rfc7231.html#rfc.section.5.3.2中定义,并且“*+json”不是有效的子类型(即使它是的,它只会匹配子类型“*+json”,而不是所有以“+json”结尾的子类型)。

  • 我倾向于同意:子类型是由它们的语法[标记](https://tools.ietf.org/html/rfc7231#section-3.1.1.1)决定的,无法表达层次结构。话虽这么说,“*+json”在语法上是正确的,但未注册为子类型。无论如何,“application/*+json”将匹配该文字字符串,并且不会像OP可能预期的那样引起任何通配符。 (3认同)