使用HTTP POST时在URL中传递params

时间:2008-11-04 18:51:39

标签: http iis url soap post

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

基本上,我正在尝试将Apache Axis2 / C库集成到我的webapp中,方法是让webapp处理HTTP请求,然后将传入的SOAP XML传递给Axis2,以便在它是SOAP请求时进行处理。直觉上,我看不出有什么理由不起作用,因为您发布的URL只是一个任意的URL,就所有各种组件而言......它是赋予特殊含义的服务器问号后的部分。

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

5 个答案:

答案 0 :(得分:6)

让我们从简单的东西开始吧。 HTTP GET请求变量来自URI。 URI是一个请求的资源,因此任何webserver 应该(和apache确实)将整个URI存储在某个变量中,这些变量可用于在webserver中运行的模块或appserver组件。

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

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:2)

允许?当然,这是可行的,但我倾向于规范建议双重方法不一定应该发生,或得到支持。 RFC2616定义HTTP / 1.1,我认为每个请求只建议一种方法。如果您考虑来自客户端的典型HTTP事务,您也可以看到限制:

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

正如您所看到的,您只能使用一种方法(POST / GET等等),但由于各种语言的运行方式,它们可能会获取查询字符串,并将其分配给GET变量。最终,这是一个POST请求,而不是GET。

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