- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
一个 HTTP 请求可以包含一个 Accept
header ,指示客户端可接受的响应媒体类型。服务器应通过提供具有与请求的媒体类型(之一)相匹配的 Content-Type
的响应来尊重请求。媒体类型可能包括参数。 HTTP 是否要求此内容协商过程遵守参数?
也就是说,如果客户端请求
Accept: application/vnd.example; version=2
(这里的version
参数的值为2
),服务器可以服务媒体类型application/vnd.example; version=1
,但不是application/vnd.example; version=2
,服务器是否可以提供响应
Content-Type: application/vnd.example; version=1
服务器是否可以提供标记的响应
Content-Type: application/vnd.example; version=2
但响应的主体实际上被编码为媒体类型application/vnd.example;版本=1
?也就是说,响应的媒体类型参数是对响应主体的不准确描述?
似乎Spring MVC 4.1.0在进行内容协商时不尊重媒体类型参数,并给出响应的媒体类型参数是响应主体的不准确描述的响应。这似乎是因为 org.springframework.util.MimeType.isCompatibleWith(MimeType)
方法没有检查 MimeType
对象的参数。
最佳答案
相关标准,RFC 7231 section 3.1.1.1 ,关于媒体类型的说明如下:
The type/subtype MAY be followed by parameters in the form ofname=value pairs.
因此,Accept
和Content-Type
header 可能包含媒体类型参数。它补充说:
The presence or absence of aparameter might be significant to the processing of a media-type,depending on its definition within the media type registry.
这表明使用参数类型的服务器代码应该注意它们,而不是简单地丢弃它们,因为对于某些媒体类型,它们将很重要。它必须在是否考虑媒体类型参数是否重要方面实现一些智能。
因此,Spring MVC 4.1.0 在进行内容协商时完全忽略参数似乎是错误的:类 org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor
不正确使用 org.springframework.util.MimeType.isCompatibleWith(MimeType)
,或者 MimeType.isCompatibleWith(MimeType)
方法不正确。如果您为 Spring 提供几个 HTTP 消息转换器,这些转换器仅在其支持的媒体类型的参数上有所不同,Spring 将不会可靠地选择媒体类型与请求的媒体类型完全匹配的 HTTP 消息转换器。
在section 3.1.1.5 ,它描述了 Content-Type
header ,它说:
The indicated media type defines both the dataformat and how that data is intended to be processed by a recipient
由于媒体类型的参数通常会改变数据格式,因此 Spring MVC 4.1.0 的行为是错误的,因为它提供的参数是对响应主体的不准确描述:方法 AbstractMessageConverterMethodProcessor .getMostSpecificMediaType(MediaType, MediaType)
错误地返回 acceptType
而不是 produceTypeToUse
当两种类型同样具体时。
然而,section 3.4.1 ,其中讨论了内容协商(主动协商),注释:
A user agent cannot rely on proactive negotiation preferences beingconsistently honored, since the origin server might not implementproactive negotiation for the requested resource or might decide thatsending a response that doesn't conform to the user agent'spreferences is better than sending a 406 (Not Acceptable) response.
因此,服务器是允许给出一个与请求的媒体类型参数不完全匹配的响应,作为它不能提供精确匹配时的后备匹配。也就是说,它可能会选择用 application/vnd.example 进行响应; version=1
响应主体,带有 Content-Type: application/vnd.example; version=1
header ,尽管请求说 Accept: application/vnd.example; version=2
,当且仅当生成有效的application/vnd.example; version=2
响应是不可能的。
Spring 的这种明显不正确的行为已经有一个 Spring 错误报告,SPR-10903 . Spring 开发人员将其关闭为“按设计工作”,并指出
I don't know any rule for comparing media types with their parameters effectively. It really depends on the media type...If you're actually trying to achieve REST versioning through media types, it seems that the most common solution is to use different media types, since their format obviously changed between versions:
- "
application/vnd.spring.foo.v1+json
"- "
application/vnd.spring.foo.v2+json
"
关于http - HTTP 内容协商是否尊重媒体类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32071006/
问题 调用 InitializeSecurityContext 时,我应将什么值传递给TargetName参数? 修改后的背景 我正在调用 InitializeSecurityContext 函数:
尝试让信号器启动并运行。我不断从服务器返回 2 个错误: GET negotiate url 返回 500 内部服务器错误 XMLHttpRequest 无法加载 http://localhost:1
我使用的是 Windows XP Pro SP3。我想在我的代码中使用 SSPI 函数。我编译了我的代码,没有错误。 我将安全包设置为用于协商,这是推荐的。 当我启动我的程序时,Negotiate 无
我正在尝试使用 C++ 和 QT 作为 GUI 来实现 Telnet 客户端。我不知道如何处理 telnet 协商。每个 telnet 命令都以 IAC 开头,例如 IAC WILL SUPPRESS
我正在使用 SignalR 2.0。在我的 VS 2012 上本地运行时一切正常。但是当我在 IIS 上发布站点时,它会中断。该站点已加载,但其中一个脚本返回 404 Not Found。脚本有点像。
我在 MS Azure 上配置了一个实例,并为域实现了 SSL 证书。当我测试性能(在 3G 上)时,我注意到 SSL 协商同时发生在两个请求上,这(不必要地)延长了过程并导致 0.6 秒的时间完成。
我有以下问题。 操作系统:CentOS 6.6 PHP:5.5 Curl: 7.43 编译 当我执行“curl -V”时,我得到以下信息: curl 7.43.0 (x86_64-unknown-li
有一个私有(private)网络服务器(支持 https),我需要经常在上面读取/设置一些信息。我做了一些java代码来自动完成。当我使用 Chrome 访问它时,第一次连接很慢(可能 5 秒),但持
我使用的是 IIS7,我们所有的文件都是通过 HTTPS 提供的。在查看瀑布 View (WebPageTest) 时,我注意到对每个文件进行 SSL 协商需要一些时间。有没有一种方法可以配置服务器或
我有一个简单的 SMTP 客户端,我正在尝试向其添加 TLS 支持。我不确定客户端发出“STARTTLS”命令后会发生什么。大多数来源(包括 RFC 本身)将其描述为 TLS session 的协商,
我一直在尝试在 IIS 托管的网站中使用 service worker 来缓存站点的一些静态内容。该站点是使用 Windows 身份验证的内部应用程序。我已经能够在没有太多麻烦的情况下注册和运行 se
我开始修补 Azure SignalR,并遇到了协商触发器问题。我关注了this微软官方指南: 这是我的代码: 本地.settings.json { "IsEncrypted": false,
Index.cshtml @{ ViewBag.Title = "Index"; } $(function () { var connection = $.connection('
Index.cshtml @{ ViewBag.Title = "Index"; } $(function () { var connection = $.connection('
我正在使用 openssl 正常连接到 SMTP 服务器(未加密),发送 STARTTLS 命令,协商 SSL 加密,然后与加密 session 交互。 这是我正在使用的命令(通过 telnet):
我正在为 iOS 进行 unix 服务器 ssh 模拟。在谈判过程中,我遇到了很多障碍,并且仍在与这些障碍作斗争。最新的一个是关于 SSH2_MSG_KEX_DH_GEX_REPLY 数据包数据,我在
我们有两个连接(作为 .NET/Windows 客户端)到 IBM MQ 端点(假设是非 Windows)。 我们使用 SSL,它由一对证书(客户端和服务器)支持并在 Windows 证书存储中正确标
我读到 ejabberd 建议使用 STARTTLS 协商来实现通信实体之间的安全连接。当我安装 ejabberd 时,默认情况下它带有 TLS 证书。 那为什么要买证书安装呢?既然我们有默认证书,从
您好,我正在尝试使用 JAVA 和 spring 设置 SSO。为此,我正在使用此文档:http://docs.spring.io/spring-security-kerberos/docs/1.0.
从阅读 Microsoft docs在使用 SignalR 进行身份验证时,使用不记名 token 进行身份验证的唯一方法似乎是将其发送到 WebSocket 连接上的查询字符串中。 在检查 Sign
我是一名优秀的程序员,十分优秀!