获取 url 时如何强制网络浏览器使用 POST?

Posted

技术标签:

【中文标题】获取 url 时如何强制网络浏览器使用 POST?【英文标题】:How do you force a web browser to use POST when getting a url? 【发布时间】:2010-12-11 16:38:33 【问题描述】:

如何强制网络浏览器在获取 url 时使用 POST?

【问题讨论】:

你的意思是从表单还是从href? 你真正想用这个来完成什么? “post”通常用于将一些数据从客户端发送到服务器。 “get”是检索数据。但浏览器本身会为这些数据发送一些数据,例如 cookie、浏览器信息等。 我有同样的问题,我使用 xmlhttprequest 发布到一个 url 并且它做了一个 get 【参考方案1】:

使用指定 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) 发送回浏览器并退出。具体实现方式取决于您的编程语言/框架等。

【讨论】:

我知道这是一个旧答案,但我可以知道您为什么说“不建议”强制链接提交表单吗? @RosdiKasim 我知道这是一条旧评论,但不建议这样做,因为它破坏了万维网的语义。链接应该是idempotent GET 请求。让它们成为 POST 违反了这种期望。破坏网络的一种方式是搜索引擎爬虫,它们尽量不提交表单,这样它们就不会导致数据库更新等。【参考方案2】:
<form method="post">

如果你正在获取一个 URL,你正在获取它,而不是发布它。您当然不能让浏览器通过其地址栏发出 POST 请求。

【讨论】:

没有办法在 URL 地址栏中 POST 吗? @Daniel:我更新了我的答案以提供一种从链接提交帖子表单的黑客方式。 Ryan White 的回答有效地从地址栏发送了一个 POST。【参考方案3】:

如果您尝试测试某些内容,我建议您使用Fiddler 来制作您的 http 请求。它将允许您指定动作动词(GET、POST、PUT、DELETE 等)以及请求内容。如果您尝试使用 POST 来测试来自链接的非常具体的请求,那么您可以监控浏览器发出的请求并仅使用修改后的 POST 操作重新发出它。

【讨论】:

【参考方案4】:

您不能强制任何网络浏览器发送带有 POST 标头的 url。但要测试 POST 请求 url,我可以建议 chrome 和 mozilla 的“POSTER”扩展

【讨论】:

【参考方案5】:

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

例子:

curl -v  --basic --user username:password --request POST "http://www.theurltopostto.com"

【讨论】:

【参考方案6】:

上面的 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】:

这有点晚了,但我遇到了这个问题,发现 HTML 5 做了一些改变。您可以使用输入标签添加表单方法(从而选择帖子)。这对我有用。

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

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

我从你的问题中感觉到你只是希望在浏览器的地址栏中发送一个发布请求。

只需在地址栏中输入以下内容,将“action”的值替换为您喜欢的 url。

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

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

如果您想发布值,请附加任意数量的输入,将每个输入中的名称和值交换为您喜欢的任何内容。

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

请务必注意,您发布的敏感信息将在以下位置可见:

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

这是一种发送帖子请求的非常糟糕的方式,所有其他答案都好得多,但你能做到这一点仍然很酷。

【讨论】:

【参考方案10】:

如果你有问题:

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

在开发工具中,您仍然可以看到它正在执行 GET,这意味着您的 url 采用以下格式:

http://example.com/folder

意思应该是:

http://example.com/folder/

这是一个非常奇怪的错误,可能与您的问题无关,但我已经遇到过几次了,它应该在那里,因为它看起来非常危险。这发生在我在 Ubuntu 14.04 上使用 apache 2 服务器时,没有太多配置。

【讨论】:

【参考方案11】:

Telerik(免费软件)的实用程序“Fiddler”允许您“编写”一个 http 请求并使用您选择的任何方法(Get、Post、Put、Del 等)发送它,它还会为您提供一些关于请求和响应的非常详细的信息,在测试和调试过程中非常有用

【讨论】:

以上是关于获取 url 时如何强制网络浏览器使用 POST?的主要内容,如果未能解决你的问题,请参考以下文章

如何从此 URL 从文件中获取内容?

360浏览器F12如何让网络保持获取POST

如何在 Laravel-8 和 InertiaJs 中向服务器发出 POST 请求时在浏览器中保留当前的 ​​GET url

php表单提交时获取不到post数据的解决方法

php表单提交时获取不到post数据的解决方法

数据发布到 URL 时如何获取响应