URLを取得するときにWebブラウザにPOSTを使用させるにはどうすればよいですか?
質問
URLを取得するときにWebブラウザにPOSTを使用させるにはどうすればよいですか?
解決
メソッドとして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応答コード(メソッドは許可されていません)がブラウザに戻って終了します。正確に実装する方法は、プログラミング言語/フレームワークなどに依存します。
他のヒント
<form method="post">
URLを取得する場合、POSTではなく取得します。ブラウザーにロケーションバーを介してPOSTリクエストを発行させることはできません。
ブラウザのアドレスバーで投稿リクエストを送信したいというあなたの質問の感想があります。
アドレスバーに次のように入力するだけで、「アクション」の値を目的の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">
投稿する機密情報は次の場所に表示されることに注意してください:
- あなたの歴史
- アドレスバー
- ブラウザのオートコンプリート。
- おそらく同じタブからアクセスする他のサイト
- おそらく他にもたくさんのもの
投稿リクエストを送信するのは非常に悪い方法であり、他のすべての回答ははるかに優れていますが、それができるのはまだクールです。
何かをテストする場合は、フィドラーを使用してhttpリクエストを作成することをお勧めします。これにより、アクションの動詞(GET、POST、PUT、DELETEなど)および要求内容を指定できます。リンクからの非常に具体的なリクエストをテストする代わりにPOSTを使用する場合、ブラウザが行っているリクエストを監視し、変更されたPOSTアクションでのみリクエストを再発行できます。
上記の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でテスト済み。
ツールを使用してテストできます。私はいつもあなたと同じ質問をしています。オンラインで入手できるツールはかなりあります。私が使用するツールは次のとおりです。 http://www.hurl.it/
この質問は古いことは知っていますが、誰かが役に立つと思うかもしれません。 cURL( http://curl.haxx.se/ )などのコマンドラインツールを使用して投稿できます。 URL。
例:
curl -v --basic --user username:password --request POST "http://www.theurltopostto.com"
これはゲームの少し遅いですが、私はこれに出くわし、HTML 5がいくつかの変更を行ったことを発見しました。 inputタグを使用してformmethodを追加できます(したがって、postを選択します)。これでうまくいきました。
実行中に問題が発生した場合:
request.open('POST',url,true);
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
request.send("data="+JSON.stringify(data));
そして開発ツールではまだGETを実行しているので、それはあなたのURLが次の形式であることを意味します:
意味は次のとおりです:
これは非常に奇妙なエラーで、おそらくあなたの質問とは関係ありませんが、私はそれを数回経験しました。これは、Ubuntu 14.04でapache 2サーバーを使用していて、設定があまりないときに起こりました。
ユーティリティ&quot; フィドラー&quot; by Telerik(フリーウェア)を使用すると、「作曲」できます。 HTTPリクエストを送信し、選択した任意の方法(Get、Post、Put、Delなど)を使用して送信します。また、テストとデバッグ中に非常に役立つリクエストとレスポンスに関する非常に詳細な情報も提供します