发送“415 Unsupported Media Type”时,如何指定支持的媒体类型

13

如果客户端向HTTP服务器发送不支持的媒体类型数据,服务器会以状态码"415不支持的媒体类型"进行响应。但是如何告诉客户端支持哪些媒体类型呢?是否存在标准或至少推荐的方法来实现?或者只需将其作为文本写入响应主体中即可?


1
你可能期望得到一个“Accept”响应头,但是“Accept”只能用于请求。 - Ronald Wildenberg
4个回答

9

在这种情况下,没有任何具体的规范要求该怎么做,因此预计实现方式将千差万别。(如果服务器响应包含类似于Accept:头信息,那么这是很明智的,因为它基本上具有正确的语义,尽管目前方向不对。)


我正在寻找服务器发送到客户端的“Accept”头信息。我期待HTTP 1.2的到来;-) - deamon

0

我相信你可以使用 OPTIONS Http 动词来完成这个任务。

此外,如果您的情况符合某个特定用例,则可以使用状态码为 300 的 Multiple Choices。如果他们发送了一个带有 Accept 头部为 application/xml 的请求,而您只支持 text/plain 并且该表示在不同的 URL 上,则可以响应 300 并在 Location 头部中提供该表示的 URL。我知道这可能并不完全符合您的问题,但这是另一种可能的选择。

并且根据 HTTP 规范:

10.4.7 406 Not Acceptable

请求标识的资源仅能生成响应实体,其内容特征不符合请求中发送的 accept 头部所指定的要求。

除非是 HEAD 请求,否则响应应包含一个实体,其中包含可用实体特征和位置的列表,用户或用户代理可以选择最合适的实体。实体格式由 Content-Type 头字段中给出的媒体类型指定。根据用户代理的格式和功能,可以自动执行选择最合适的选择。但是,本规范不定义任何此类自动选择的标准。

      Note: HTTP/1.1 servers are allowed to return responses which are
      not acceptable according to the accept headers sent in the
      request. In some cases, this may even be preferable to sending a
      406 response. User agents are encouraged to inspect the headers of
      an incoming response to determine if it is acceptable.

那样做是可行的,但是响应内容没有规范。它可能会告诉你,但你怎么知道呢? - Donal Fellows
但是应该使用哪个标题来说明支持哪些媒体类型?然后可以直接在 415 响应中使用此标题。通常仅使用 OPTIONS 来查找支持的方法。 - deamon
1
“406”与response的类型不匹配无关。当服务器无法处理request body中数据的类型时,会返回“415”。(我最近在开发RESTful webservice时遇到了这个问题,所以我确定这是正确的解释。)问题在于服务器无法处理消息,而客户端已经发送了它;错误是唯一的可能性(并且没有办法以适当的机器可读方式表达什么是正确的)。 - Donal Fellows

0

简而言之,我编辑了生成的代理类,使其继承自Microsoft.Web.Services3.WebServicesClientProtocol

当我遇到这个问题时,我正在解决这个错误,所以我想帮助下一个可能会经过这里的人,虽然不确定它是否回答了所述的问题。我遇到这个错误是因为我不得不接管一个现有的解决方案,该解决方案利用了WSE和MTOM编码。这是一个调用Web服务的Windows客户端。

关键是,客户端在调用Web服务时会抛出该错误。对于帮助我解决这个错误的一些因素是检查Web服务代理类,显然默认生成的代理类继承自System.Web.Services.Protocols.SoapHttpClientProtocol。本质上意味着它实际上并没有使用WSE3。

无论如何,我手动编辑了代理并将其更改为继承自Microsoft.Web.Services3.WebServicesClientProtocol

顺便说一句,在VS中查看生成的代理类,请单击Web引用,然后单击“显示所有文件”工具栏按钮。reference.cs是快乐的地方!

希望能帮到你。


-3
在他的书《HTTP开发者手册》第81页中,Chris Shiflett解释了415的含义,然后他说:“HTTP响应内容中使用的媒体类型应该在Content-Type实体头中指定。”
1)那么Content-Type是可能的答案吗?它可能是一个逗号分隔的接受内容类型列表。这种可能性的明显问题是Content-Type是实体头而不是响应头。
2)还是这本书中有错别字?他真的是想说“HTTP请求”吗?

1
不,不是这样的。“Content-Type”始终标识消息有效载荷的类型,无论是请求还是响应(除了HEAD响应...)。 - Julian Reschke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接