非表单提交的HTTP请求的MIME类型

非表单提交的HTTP请求的MIME类型,http,post,http-headers,put,http-request,Http,Post,Http Headers,Put,Http Request,对于不是通过HTML表单发送的请求,HTTP是否将请求的内容类型限制为application/x-www-form-urlencoded以用于非文件上载,或者该MIME类型“right”/standard/在语义上是否有任何其他意义 例如,PHP会自动将内容解析为$_POST,这似乎表明服务器需要x-www-form-urlencoded。另一方面,我可以使用Ajax在HTTP请求内容中发送JSON对象,并将内容类型设置为application/JSON。至少有些服务器技术(例如WSGI)不会尝

对于不是通过HTML表单发送的请求,HTTP是否将请求的内容类型限制为application/x-www-form-urlencoded以用于非文件上载,或者该MIME类型“right”/standard/在语义上是否有任何其他意义

例如,PHP会自动将内容解析为$_POST,这似乎表明服务器需要x-www-form-urlencoded。另一方面,我可以使用Ajax在HTTP请求内容中发送JSON对象,并将内容类型设置为application/JSON。至少有些服务器技术(例如WSGI)不会尝试解析它,而是以原始形式提供给脚本

我应该在POST中使用什么MIME类型,并将请求放入RESTful API中,以确保符合HTTP的所有服务器实现?我忽略了SOAP和JSON-RPC等技术,因为它们通过HTTP传输协议,而不是按照预期使用HTTP。

Short-Answer 您应该指定最能描述HTTP消息实体体的内容类型

长话短说 例如,PHP会自动将内容解析为$_POST,这似乎表明服务器需要x-www-form-urlencoded

服务器未“预期”
x-www-form-urlencoded
。为了简化开发人员的生活,PHP将把表单编码的实体体解析为
$\u POST
超全局当且仅当
内容类型:x-www-form-urlencoded
并且实体体实际上是一个urlencoded键值字符串。对于带有
内容类型:multipart/form data
的消息,将遵循类似的过程来生成
$\u文件
数组。虽然有帮助,但不幸的是,这些超全局变量被命名了,它们混淆了实际HTTP事务中真正发生的事情

我应该在POST中使用什么MIME类型,并将请求放入RESTful API中 确保符合HTTP的所有服务器实现

您应该指定最能描述HTTP消息实体体的内容类型。始终遵守官方HTTP规范——如果这样做,就不会出错。起自(加强调):

任何包含实体正文的HTTP/1.1消息都应该包含 内容类型标题字段定义该正文的媒体类型如果和 仅当“内容类型”字段未给出媒体类型时 接收者可以通过检查媒体类型来猜测媒体类型 用于标识用户的URI的内容和/或名称扩展名 资源。如果媒体类型仍然未知,则收件人应 将其视为类型“应用程序/八位字节流”

任何主流服务器技术都将遵守这些规则。深思熟虑的web应用程序不会信任您的
内容类型
标题,因为它可能正确,也可能不正确。消息的发起者可以自由发送完全虚假的值。通常检查
内容类型
标题作为初步验证措施,但通过解析实际数据进一步验证内容。例如,如果要将JSON数据放入REST服务,端点可能首先检查以确保您已发送
内容类型:application/JSON
,然后实际解析消息的实体体以确保它确实是有效的JSON