代码之家  ›  专栏  ›  技术社区  ›  Daniel Kivatinos

在获取URL时,如何强制Web浏览器使用Post?

  •  34
  • Daniel Kivatinos  · 技术社区  · 16 年前

    在获取URL时,如何强制Web浏览器使用Post?

    11 回复  |  直到 8 年前
        1
  •  30
  •   Asaph    16 年前

    使用指定post为方法的HTML表单:

    <form method="post" action="/my/url/">
        ...
        <input type="submit" name="submit" value="Submit using POST" />
    </form>
    

    如果你 为了使它作为链接发生(不推荐),您可以让onclick处理程序动态地构建一个表单并提交它。

    <script type="text/javascript">
    function submitAsPost(url) {
        var postForm = document.createElement('form');
        postForm.action = url;
        postForm.method = 'post';
        var bodyTag = document.getElementsByTagName('body')[0];
        bodyTag.appendChild(postForm);
        postForm.submit();
    }
    </script>
    <a href="/my/url" onclick="submitAsPost(this.href); return false;">this is my post link</a>
    

    如果需要在服务器端执行此操作,应检查HTTP方法,如果它不等于post,则发送一个 HTTP 405 response code (method not allowed) 返回浏览器并退出。具体的实现方法取决于您的编程语言/框架等。

        2
  •  21
  •   Jonathan Feinberg    16 年前
    <form method="post">
    

    如果你得到一个网址,你就得到它,而不是发布它。您当然不能让浏览器通过其位置栏发出发布请求。

        3
  •  10
  •   Ryan White Paperpotato    10 年前

    我对你的问题有一种感觉,你只是希望在浏览器的地址栏中发送一个帖子请求。

    只需在地址栏中键入以下内容,将“action”的值交换到您喜欢的URL。

    data:text/html,<body onload="document.body.firstChild.submit()"><form method="post" action="http://stackoverflow.com">
    

    它是无效的HTML,但是浏览器(至少是目前为止我测试过的所有浏览器)知道你的意思,我希望尽可能短。

    如果要发布值,可以根据需要附加任意数量的输入,将每个输入中的名称和值替换为所需的内容。

    <input value="hugh.mahn@person.com" name="email">
    <input value="passwordsavedinhistory" name="password">
    

    重要的是要注意,您发布的敏感信息将显示在:

    • 你的历史
    • 你的地址栏
    • 浏览器的自动完成功能。
    • 可能是从同一个选项卡访问的其他网站
    • 可能还有很多其他的东西

    这是一个非常糟糕的方式来发送一个帖子请求,和所有其他的答案都要好得多,但它仍然很酷,你可以做到。

        4
  •  4
  •   user199845    16 年前

    如果你想测试什么,我建议你用 Fiddler 创建HTTP请求。它允许您指定动作动词(get、post、put、delete等)以及请求内容。如果您试图测试一个来自链接的非常具体的请求,但是使用了post,那么您可以监视浏览器正在发出的请求,并且只使用修改后的post操作重新发出请求。

        5
  •  4
  •   yeakbaba    13 年前

    您不能强制任何Web浏览器发送带有日志头的URL。但是为了测试一个帖子请求URL,我可以建议“海报”扩展 chrome mozilla

        6
  •  3
  •   Gregory    12 年前

    上面的submitaspost()函数是一个好的、优雅的解决方案,但是它有一个问题——如果URL太长,一些浏览器(包括firefox和ie)将返回一个错误。由于我们中的许多人使用post来绕过这一限制,我建议采用以下解决方案:

    // submit a URL using post
    function submitAsPost(url) {
        var bodyTag = document.getElementsByTagName('body')[0];
        var postForm = document.createElement('form');
        bodyTag.appendChild(postForm);
        postForm.method = 'POST';
    
        var serverAndParams = url.split("?");
        postForm.action = serverAndParams[0];
        var params = null;
        try
        {
          var paramsAndHash = serverAndParams[1].split("#");
          params = paramsAndHash[0]; 
          var attrList = params.split("&");
          for (var i = 0; i < attrList.length; i++)
          {
            try
            {
              var keyValue = attrList[i].split("=");
              var el = document.createElement('input');
              el.type="hidden";
              el.name=keyValue[0];
              var value = keyValue[1];
              value = value.replace(/\+/g, ' ');
              el.value=decodeURIComponent(value);
              postForm.appendChild(el);
            }
            catch(error){}
          } 
        }
        catch(error){}
    
        postForm.submit();
        bodyTag.removeChild(postForm);
    }
    

    通过Firefox、Chrome和IE测试。

        7
  •  2
  •   MarkZ    11 年前

    您可以使用工具进行测试。我总是问和你一样的问题。网上有很多工具。以下是我使用的工具: http://www.hurl.it/

        8
  •  1
  •   Adam    12 年前

    我知道这个问题由来已久,但有人可能会觉得这很有用。可以使用命令行工具,如curl( http://curl.haxx.se/ )发布到URL。

    例子:

    curl -v  --basic --user username:password --request POST "http://www.theurltopostto.com"
    
        9
  •  1
  •   Rodney    12 年前

    这在游戏中有点晚了,但我偶然发现HTML5做了一些更改。您可以使用输入标记添加FormMethod(从而选择Post)。这对我有用。

    见: http://www.w3schools.com/tags/att_input_formmethod.asp

        10
  •  0
  •   zardilior    9 年前

    如果你有问题:

    request.open('POST',url,true);
    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    request.send("data="+JSON.stringify(data));
    

    在dev工具中,您仍然认为它正在执行get,这意味着您的URL采用以下格式:

    http://example.com/folder

    意思是应该是:

    http://example.com/folder/

    这是一个很奇怪的错误,也许与你的问题无关,但我已经犯过几次了,应该在外面,因为它看起来很危险。在Ubuntu14.04上使用Apache2服务器时发生了这种情况,配置不多。

        11
  •  0
  •   Cos Callis    8 年前

    实用工具“ Fiddler “by telerik(免费软件)允许您“编写”一个HTTP请求并使用您选择的任何方法(get、post、put、del等)发送它,它还将为您提供一些关于请求和响应的非常详细的信息,这些信息在测试和调试期间非常有用。”

    推荐文章