简答
您应该指定最能描述 HTTP 消息实体主体的任何内容类型。
长答案
例如,PHP 自动将内容解析为 $_POST,这似乎表明 x-www-form-urlencoded 是服务器期望的。
服务器没有“期待” x-www-form-urlencoded
。PHP - 为了使开发人员的生活更简单 -$_POST
当且仅当Content-Type: x-www-form-urlencoded
实体主体实际上是一个 urlencoded 键值字符串时,才会将表单编码的实体主体解析为超全局。对于到达的消息,遵循类似的过程Content-Type: multipart/form-data
来生成$_FILES
数组。虽然很有帮助,但不幸的是,这些超全局变量被命名了,它们混淆了实际 HTTP 事务中真正发生的事情。
我应该在 RESTful API 中的 POST 和 PUT 请求中使用哪种 MIME 类型,以确保符合 HTTP 的所有服务器实现?
您应该指定最能描述 HTTP 消息实体主体的任何内容类型。始终遵守官方的 HTTP 规范——如果你这样做,你就不会出错。来自RFC 2616 Sec 7.2.1(强调添加):
任何包含实体主体的 HTTP/1.1 消息都应该包含定义该主体的媒体类型的 Content-Type 头字段。当且仅当媒体类型不是由 Content-Type 字段给出时,接收者可以尝试通过检查其内容和/或用于识别资源的 URI 的名称扩展来猜测媒体类型。如果媒体类型仍然未知,接收者应该将其视为类型“application/octet-stream”。
任何主流服务器技术都会遵守这些规则。深思熟虑的 Web 应用程序不会信任您的Content-Type
标头,因为它可能正确也可能不正确。消息的发起者可以随意发送完全虚假的值。通常Content-Type
检查头部作为初步验证措施,但通过解析实际数据进一步验证内容。例如,如果您将 JSON 数据放入 REST 服务,则端点可能首先检查以确保您已发送Content-Type: application/json
,然后实际解析消息的实体主体以确保它确实是有效的 JSON。