我正在为我们的应用程序开发一个新的RESTful Web服务。
当对某些实体执行GET时,客户端可以请求实体的内容。如果他们想添加一些参数(例如排序列表),可以在查询字符串中添加这些参数。
或者,我希望人们能够在请求主体中指定这些参数。HTTP/1.1似乎并没有明确禁止这一点。这将允许他们指定更多信息,可能会更容易指定复杂的XML请求。
我的问题:
这完全是个好主意吗?HTTP客户端在GET请求中使用请求体时会遇到问题吗?
https://www.rfc-editor.org/rfc/rfc2616
restclient和REST控制台都不支持这一点,但curl支持。
HTTP规范在第4.3节中说明
如果请求方法规范(第5.1.1节)不允许在请求中发送实体体,则请求中不得包含消息体。
第5.1.1节将我们重定向到第9.x节以了解各种方法。它们都没有明确禁止包含消息体。然而
第5.2节规定
通过检查请求URI和主机头字段来确定由Internet请求标识的确切资源。
第9.3节规定
GET方法意味着检索请求URI标识的任何信息(以实体的形式)。
这一起表明,在处理GET请求时,服务器不需要检查除请求URI和主机头字段之外的任何内容。
总之,HTTP规范不会阻止您使用GET发送消息体,但存在足够的歧义,如果不是所有服务器都支持它,我不会感到惊讶。
根据XMLHttpRequest,它无效。根据标准:
4.5.6 send()方法客户send([正文=空])启动请求。可选参数提供请求身体如果请求方法是GET或HEAD,则忽略该参数。如果任一状态都不是,则引发InvalidStateError异常打开或设置send()标志。send(body)方法必须运行以下步骤:如果状态未打开,则引发InvalidStateError异常。如果设置了send()标志,则引发InvalidStateError异常。如果请求方法是GET或HEAD,请将body设置为null。如果body为空,则转到下一步。
虽然,我认为这不应该,因为GET请求可能需要大量的正文内容。
因此,如果您依赖浏览器的XMLHttpRequest,它很可能无法工作。
你可以用身体发送GET,也可以发送POST,然后放弃RESTish宗教信仰(这并不是很糟糕,5年前只有一个信仰的成员——他在上面的评论)。
这两个都不是很好的决定,但发送GET主体可能会防止某些客户端和某些服务器出现问题。
进行POST可能会遇到一些RESTish框架的障碍。
Julian Reschke在上文中建议使用非标准HTTP头,如“SEARCH”,这可能是一个很好的解决方案,只是它不太可能被支持。
列出能够和不能做到上述每一项的客户可能是最有成效的。
无法发送带有正文的GET的客户端(我知道):
XmlHTTPRequest Fiddler
可以发送带有正文的GET的客户端:
大多数浏览器
可以从GET检索正文的服务器和库:
阿帕奇PHP文件
从GET中剥离主体的服务器(和代理):
?