带有URL查询参数的HTTP POST
我正在设计一个API来通过HTTP,我想知道如果使用HTTP POST命令,但仅使用URL查询参数,并且没有请求主体,则是一个好方法。
注意事项:
Content-Length: 0
头部必须明确添加。 通过URL查询而不是请求主体在POST请求上发送参数还有什么缺陷或优点?
编辑:这正在考虑之中的原因是,这些操作不是幂等性的,并且具有除检索以外的副作用。 请参阅HTTP规范:
特别是,该惯例已经确立,GET和HEAD方法不应该具有除了检索之外采取行动的意义。 这些方法应该被认为是“安全的”。 这允许用户代理以一种特殊的方式表示其他方法,例如POST,PUT和DELETE,以便使用户意识到正在请求可能不安全的操作的事实。
...
方法也可以具有“幂等性”的性质,除了错误或过期问题外,N> 0个相同请求的副作用与单个请求相同。 方法GET,HEAD,PUT和DELETE共享这个属性。 另外,OPTIONS和TRACE方法不应该有副作用,所以本质上也是幂等的。
如果你的行为不是幂等的,那么你必须使用POST
。 如果你不这样做,你只是要求排除故障。 GET
, PUT
和DELETE
方法需要是幂等的。 想象一下,如果客户端预先获取服务的每个可能的GET
请求,您的应用程序会发生什么情况 - 如果这会导致客户端看到副作用,那么就会出现问题。
我同意发送带有查询字符串但没有正文的POST
似乎很奇怪,但我认为在某些情况下它可能适用。
将URL的查询部分视为对资源的命令,以限制当前请求的范围。 通常,查询字符串用于对GET
请求进行排序或过滤(例如?page=1&sort=title
),但我认为它对POST
有意义也可以限制范围(可能类似于?action=delete&id=5
)。
每个人都是正确的:坚持POST非幂等请求。
使用URI查询字符串和请求内容怎么样? 那么它是有效的HTTP(见注1),所以为什么不呢!
这也完全合乎逻辑:URLs,包括它们的查询字符串部分,用于查找资源。 而HTTP方法动词(POST - 及其可选请求内容)用于指定操作或使用资源。 这些应该是正交的担忧。 (但是,对于ContentType = application / x-www-form-urlencoded的特殊情况,它们并不是完美的正交关系,请参阅下面的注2。)
注1:HTTP规范(1.1)没有规定查询参数和内容对于接受POST或PUT请求的HTTP服务器是互斥的。 所以任何服务器都可以自由地接受这两个。 也就是说,如果你编写服务器,没有什么可以阻止你选择接受两者(除了可能是一个僵化的框架)。 通常,服务器可以根据需要的任何规则来解释查询字符串。 它甚至可以用条件逻辑来解释它们,这些条件逻辑引用了Content-Type等其他头文件,这导致了注2:
注2:如果Web浏览器是人们访问您的Web应用程序的主要方式,而application / x-www-form-urlencoded是他们发布的Content-Type,那么您应该遵循该Content-Type的规则。 而application / x-www-form-urlencoded的规则更加具体(坦率地说,不寻常):在这种情况下,您必须将URI解释为一组参数,而不是资源位置。 [这与督王提出的有用性是一致的; 使用Web表单将内容发布到服务器可能很困难。 刚才解释有点不同。]
注3:最初的查询字符串是什么? RFC 3986将HTTP查询字符串定义为URI部分,作为定位资源的非分层方式工作。
如果读者提出这个问题想要问什么是好的RESTful体系结构:RESTful体系结构模式不需要URI方案以特定方式工作。 RESTful架构关注系统的其他属性,如资源的缓存能力,资源本身的设计(他们的行为,功能和表示)以及是否满足幂等性。 换句话说,实现与HTTP协议及其HTTP方法动词集高度兼容的设计。 :-)(换句话说,RESTful体系结构对资源的定位并不是很有前途。)
最后一点:有时候查询参数会被用于其他的事情,既不是定位资源也不是编码内容。 曾经见过像'PUT = true'或'POST = true'这样的查询参数? 这些是不允许您使用PUT和POST方法的浏览器的解决方法。 虽然这些参数被视为URL查询字符串的一部分(在网络上),但我认为它们并非精神上的URL查询的一部分。
你想要理由? 这里有一个:
Web表单不能用于向使用GET和POST混合的页面发送请求。 如果将表单的方法设置为GET,则所有参数都位于查询字符串中。 如果您将表单的方法设置为POST,则所有参数都位于请求正文中。
来源:HTML 4.01标准,第17.13节表单提交
链接地址: http://www.djcxy.com/p/1077.html上一篇: HTTP POST with URL query parameters
下一篇: What's the difference between a POST and a PUT HTTP REQUEST?