6

RESTでアプリを作成する方法を理解しようとしていますPHP

PHPスクリプトからput/を送信する方法を理解するのに問題があります。delete

インターネットでは、送信されたphpメソッドを判別する方法しか見つかりません。

if($_SERVER['REQUEST_METHOD'] == 'DELETE')

DELETEしかし、このメソッドを送信するにはどうすればよいですか?

通常、レコードを削除したい場合は、メソッドが/にDB設定された通常のhtmlフォームが あり、db idを記録してから、送信ボタンを押して/フォームを送信します。postgetpostget

delete送信/putメソッドにこの送信を作成するにはどうすればよいですか?

4

4 に答える 4

7

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を参照)。

于 2012-09-04T18:11:54.040 に答える
4

HTMLフォームはGETとPOSTのみをサポートしているため、通常のWebアプリケーションでは、ほとんどのフレームワークがサポートしているリクエストメソッドを指定するために非表示フィールドを使用する必要があります。

<form method="post" action="...">
  ...
  <input type="hidden" name="REQUEST_METHOD" value="PUT" />
<form>
于 2012-08-23T06:16:15.930 に答える
3

Chromeを使用している場合は、Postmanを使用してRESTサービスをテストできます。DELETE、PUTだけでなく、OPTIONS、PATCHなどの任意のタイプのコマンドを送信できます。

Firefoxでは、とりわけRESTClientを使用できます。

于 2012-08-23T06:12:57.377 に答える
3

これを行う通常の方法は、cURL

$ch = curl_init('YOUR_URL');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE'); // curl_setopt($ch, CURLOPT_PUT, true); - for PUT
curl_setopt($ch, CURLOPT_POSTFIELDS, 'some_data');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);  // DO NOT RETURN HTTP HEADERS
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  // RETURN THE CONTENTS OF THE CALL
$result = curl_exec($ch);
于 2012-08-23T06:16:20.430 に答える