GETまたはPOST以外のhttpメソッドを使用して、HTMLページからリクエストを送信する一般的な方法は2つあります。
#1 :htmlフォームを使用してPOSTリクエストを送信しますが、別のメソッドを使用しているかのようにリクエストを処理するようにサーバーに指示する非表示のフォームフィールドを含めます。これは、@xdazzによって概説されたアプローチです。
<form method="post" action="my_resource.php">
...
<input type="hidden" name="REQUEST_METHOD" value="PUT" />
<form>
PHPスクリプトでは、実際のリクエストメソッドと送信されたフォームフィールドの両方"my_resource.php"
を調べて、呼び出すロジックを決定する必要があります。
/* my_resource.php */
$method = strtolower($_SERVER['REQUEST_METHOD']);
if( $method === 'post' && isset($_REQUEST['REQUEST_METHOD'])) {
$tmp = strtolower((string)$_REQUEST['REQUEST_METHOD']);
if( in_array( $tmp, array( 'put', 'delete', 'head', 'options' ))) {
$method = $tmp;
}
unset($tmp);
}
// now, just run the logic that's appropriate for the requested method
switch( $method ) {
case "get":
// logic for GET here
break;
case "put":
// logic for PUT here
break;
case "post":
// logic for POST here
break;
case "delete":
// logic for DELETE here
break;
case "head":
// logic for DELETE here
break;
case "options":
// logic for DELETE here
break;
default:
header('HTTP/1.0 501 Not Implemented');
die();
}
注:上記のロジックを各ページに配置できます(または各ページから呼び出すことができます)。別の方法は、プロキシスクリプトを作成することです(例"rest-form-proxy.php"
)。次に、request_methodとターゲットURLを含む、サイト内のすべてのフォームがプロキシに送信されます。プロキシは提供された情報を抽出し、適切な要求されたhttpメソッドを使用して要求を目的のURLに転送します。
プロキシアプローチは、各スクリプトにロジックを埋め込むための優れた代替手段です。ただし、プロキシを構築する場合は、必ず要求されたURLを確認し、自分のサイトを指さないURLを許可しないようにしてください。このチェックを行わないと、他の人があなたのプロキシを使用して他のWebサイトに悪意のある攻撃を仕掛けることができます。また、Webサイトのセキュリティやプライバシーを危険にさらす可能性もあります。
-
#2:HTMLページでJavascriptを使用して、XMLHttpRequestを開始します。これはより複雑なアプローチであり、少しのjavascriptが必要ですが、場合によってはより柔軟になる可能性があります。これにより、ページを再ロードせずにサーバーにリクエストを送信できます。また、さまざまな形式でデータを送信することもできます(htmlフォームからのデータのみを送信することに限定されません)。例えば:
<button onclick="doSave()">Save</button>
<script>
var myObject = {
// ... some object properties that
// that you'll eventually want to save ...
};
function doSave() {
var xhr = createxmlhttprequest();
// initialize the request by specifying the method
// (ie: "get", "put", "post", "delete", etc.), and the
// url (in this case, "my_resource.php"). The last param
// should always be `true`.
xhr.open("put", "my_resource.php", true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onreadystatechange = function() {
if (xhr.readystate != 4) { return; }
var serverresponse = xhr.responsetext;
// ... this code runs when the response comes back
// from the server. you'll have to check for success
// and handle the response document (if any).
};
// this initiates the request, sending the contents
// of `myObject` as a JSON string.
xhr.send(JSON.stringify(myObject));
// The request runs in the background
// The `onreadystatechange` function above
// detects and handles the completed response.
}
</script>
XMLHttpRequestには、上記の基本的な例で示した以上のことがたくさんあります。このルートを選択する場合は、徹底的に調査してください。特に、さまざまなエラー状態を適切に処理するようにしてください。クロスブラウザの互換性には多くの問題もあり、その多くはjQueryの$ .ajax()関数などの仲介機能を使用して対処できます。
最後に、上記の2つの方法は相互に排他的ではないことに注意してください。いずれかの種類のリクエストを処理できるようにサーバーを構築する限り、一部のリクエストにフォームを使用し、他のリクエストにXMLHttpRequestを使用することは非常に可能です(上記の#1を参照)。