2008-11-04 306 views
9

当使用POST方法时,是否允许通过URL(问号后)将参数传递到网页?我知道它的工作原理(大多数时候,反正),因为我公司的webapp经常这样做,但我不知道它是否真的在标准中被支持,或者我是否可以依赖这种行为。我正在考虑实现一个SOAP请求处理程序,它在问号后面使用一个参数来指示它是一个SOAP请求,而不是一个正常的HTTP请求。之所以这么说,webapp是一个IIS扩展,所以所有的东西都通过相同的URL访问(例如:example.com/myisapi.dll?command),所以为了处理SOAP请求,我需要指定“命令“参数。对于SOAP,将会有一个通用命令,而不是每个SOAP动作的特定命令 - 这些将在SOAP请求本身中指定。使用HTTP POST时在URL中传递参数

基本上,我试图通过让webapp处理HTTP请求,然后将传入的SOAP XML传递给Axis2来处理它是否是SOAP请求,从而将Apache Axis2/C库集成到我的web应用程序中。直觉上,我看不出任何理由为什么这不起作用,因为你发布的URL只是一个任意的URL,就所有各种组件而言......这是一个服务器,它赋予了特殊的含义问号后的部分。

感谢您提供任何帮助/见解。

回答

6

让我们从简单的东西开始。 HTTP GET请求变量来自URI。 URI是请求的资源,所以任何web服务器应该(和apache都)具有存储在在web服务器内运行的模块或应用服务器组件可用的一些变量中的整个URI。

与http GET不同的http POST是对web服务器的一个单独的逻辑调用,但它仍然定义了一个应该处理该帖子的URI。一个好的web服务器(apache是​​一个)将再次使URI可用于其中运行的任何模块或应用程序服务器,然后将另外提供POST标头中发送的变量。

在您的应用程序在POST过程中从apache获取控制权时,您应该可以访问GET和POST变量,并且可以执行任何您希望的控制逻辑,包括使用SOAP协议而不是HTML进行回复。

3

如果您询问是否可以通过GET和POST在单个HTTP请求中发送参数,则答案为“YES”。这是标准功能,可以可靠地使用AFAIK。

一个这样的例子是发送身份验证凭证分为两部分,一个通过GET,另一个通过POST发送,因此任何劫持会话的尝试都需要劫持GET和POST变量。

因此,对于您的情况,您可以使用POST来包含实际的SOAP请求,但是根据在GET中传递的参数(或换句话说通过URL)来测试它是否是SOAP请求。

+0

我知道这是一个非常旧的帖子,但有时在身份验证中,证书不能包含在请求uri [link](https://tools.ietf.org/html/rfc6749#section-2.3.1) 。仍然试图找出为什么... – martin 2016-10-26 08:08:15

2

我在英国部署了一个带有3(移动网络运营商)的Web应用程序。它最初使用POST参数,但3网关剥离了它们(还有X-header!)。所以要小心......

2

是否允许?当然,这是可行的,但我倾向于说明双重方法不一定应该发生或得到支持。 RFC2616定义了HTTP/1.1,我认为每个请求只能提供一种方法。如果你想从客户端典型的HTTP事务,你可以看到的限制,以及:

$ telnet localhost 80 
POST /page.html?id=5 HTTP/1.1 
host: localhost 

,你可以看到,你只能使用一个方法(POST/GET,等...),然而,由于各种语言操作的性质,他们可能会拿起查询字符串,并将其分配给GET变量。最终虽然,这是一个POST请求,而不是一个GET。

所以基本上,是的这个功能是否存在,是否有意?我会说没有

+0

您的示例正是我所说的... POST请求,其中URL包含问号后的一些参数。这将取决于服务器来确定它是否有效,对吗?如果是这样,我知道它适用于IIS,所以我可以依靠它,对吧? – rmeador 2008-11-04 19:11:58

3

我相信没有标准实际上定义了“HTTP参数”或“请求变量”的概念。 RFC 1738定义了一个URL可能有一个“搜索部分”,它是问号后面的子字符串。 HTML在表单提交协议中指定处理FORM元素的浏览器应如何提交它。无论哪种情况,服务器端如何处理搜索部分和HTTP主体都完全取决于服务器 - 丢弃这两者都符合这两个规范(但相当无用)。

为了确定您是否可以将搜索部分发布到特定服务,您需要研究此服务的协议规范。如果服务实际上是通过HTML表单定义的,那么您不能使用混合 - 如果FORM指定了GET,则甚至不能使用POST(反之亦然)。如果您发布到Web服务,您需要查看Web服务的WSDL - 通常会要求POST;所有数据都在SOAP消息中。等

特定的web框架可能有“请求变量”的概念 - 他们是否会从搜索部分和请求体中绘制这些变量,您需要在产品文档中找到。