代码之家  ›  专栏  ›  技术社区  ›  rmeador

使用HTTP POST时在URL中传递参数

  •  9
  • rmeador  · 技术社区  · 16 年前

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

    基本上,我试图将Apache Axis2/C库集成到我的Web应用程序中,让Web应用程序处理HTTP请求,然后将传入的SOAP XML传递给Axis2,以便处理SOAP请求。直观地说,我看不出这不起作用的任何原因,因为就所有不同的组件而言,你发布的URL只是一个任意的URL。..是服务器给问号后的部分赋予了特殊的意义。

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

    5 回复  |  直到 16 年前
        1
  •  7
  •   Zak    16 年前

    让我们从简单的事情开始。HTTP GET请求变量来自URI。URI是请求的资源,因此任何Web服务器 本应 (apache确实如此)将整个URI存储在web服务器内运行的模块或应用服务器组件可用的某个变量中。

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

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

        2
  •  3
  •   Noah Goodrich    16 年前

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

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

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

        3
  •  3
  •   Martin v. Löwis    16 年前

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

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

    特定的web框架可能有“请求变量”的概念——你需要在产品文档中了解它们是否会从搜索部分和请求正文中提取这些变量。

        4
  •  2
  •   Airsource Ltd    16 年前

    我在英国用3(移动网络运营商)部署了一个web应用程序。它最初使用POST参数,但3网关删除了它们(以及X标头!)。所以要小心。..

        5
  •  2
  •   Community CDub    4 年前

    允许吗?当然,这是可行的,但我倾向于规范,认为双重方法不一定会发生或得到支持。 RFC2616 定义了HTTP/1.1,我认为每个请求只建议一个方法。如果你从客户端思考你的典型HTTP事务,你也可以看到它的局限性:

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

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

    所以基本上, 是的 这个功能是存在的吗?我会说 .