2009-10-30 97 views
31

如何強制Web瀏覽器在獲取URL時使用POST?如何強制Web瀏覽器在獲取URL時使用POST?

+2

你是指從窗體或href? –

+0

你真的想用這個完成什麼? 「發佈」通常用於將某些數據從客戶端發送到服務器。 「獲取」是檢索數據..但瀏覽器本身發送一些數據爲那些,如餅乾,瀏覽器信息等 – NotMe

+0

我有同樣的問題,我發佈到URL使用xmlhttprequest和它得到 – zardilior

回答

29

使用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)回瀏覽器並退出。究竟如何實現,這將取決於你的編程語言/框架等

+0

我知道這是一個古老的答案,但我可以知道你爲什麼說'不推薦'來強制鏈接提交表單嗎? –

+2

@RosdiKasim我知道這是一箇舊的評論,但它不被推薦,因爲它打破了萬維網的語義。預計鏈接是[冪等](https://en.wikipedia.org/wiki/Idempotence)GET請求。使他們發佈違反了這種期望。這種打破網絡的方式之一就是對於試圖不提交表單的搜索引擎爬蟲來說,它們不會導致數據庫被更新等。 – Asaph

19
<form method="post"> 

如果你得到一個URL,你得到它,而不是張貼。您肯定不會導致瀏覽器通過其地址欄發出POST請求。

+1

有沒有辦法在URL位置欄中POST? –

+36

如果我說兩次,你會相信我嗎? –

+2

@丹尼爾:我更新了我的答案,提供了一種從鏈接提交帖子表單的方法。 – Asaph

4

如果你想測試的東西,我建議使用Fiddler手藝你的HTTP請求。它將允許您指定動作動詞(GET,POST,PUT,DELETE等)以及請求內容。如果您試圖從鏈接測試一個非常具體的請求,但使用POST來測試,那麼您可以監視瀏覽器正在發出的請求,並且只有使用修改後的POST操作才能重新發出請求。

4

你不能強迫任何Web瀏覽器與POST標頭中發送的URL。但要測試一個POST請求url,我可以建議「POSTER」擴展爲chromemozilla

1

我知道這個問題很老,但有人會覺得這很有用。您可以使用命令行工具(如cURL(http://curl.haxx.se/))發佈到URL。

例子:

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

上述submitAsPost()函數是一個很好的和優雅的解決方案,但它有一個問題 - 如果網址太長,一些瀏覽器(包括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。

2

您可以使用一個工具來測試。我一直在問你同樣的問題。網上有很多可用的工具。下面是我使用的工具:http://www.hurl.it/

9

我從你的問題感覺你只是希望發在瀏覽器的地址欄中post請求。

只需鍵入以下到地址欄對換「行動」到你喜歡的網址的價值。

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

這是無效的HTML,但是瀏覽器的(至少所有那些我在迄今爲止測試過),知道你的意思,我想保持儘可能短,我可以。

如果您想發佈數值,請根據需要添加儘可能多的輸入,然後在每個輸入中交換名稱和值,以滿足您的喜好。

  • 你的歷史
  • 您的地址欄
  • 瀏覽器的自動完成:

    <input value="[email protected]" name="email"> 
    <input value="passwordsavedinhistory" name="password"> 
    

    重要的是要注意,您發佈的內容會在可見的敏感信息是非常重要的。

  • 您從同一選項卡瀏覽
  • 可能很多其他的東西太多

這是一個非常糟糕的方式發送POST請求,和所有其他的答案是更好,但它可能是其他網站仍然很酷,你可以做到這一點。

0

如果你有這樣的問題:

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

和開發工具,你仍然瑟它是做一個GET那麼這意味着你的網址是按以下格式:

含義應該是:

http://example.com/folder/

它的一個非常奇怪的錯誤也許與你的問題沒有關係,但我已經有幾次了,它應該在那裏,因爲它看起來嚴重危險。這發生在我使用Ubuntu 14.04上的apache 2服務器時,沒有太多配置。