1. ホーム
  2. php

[解決済み] REST API - なぜ PUT DELETE POST GET を使用するのですか?

2022-04-26 08:31:11

質問

そこで、REST APIの作成に関するいくつかの記事に目を通していました。 そして、それらのいくつかは、次のようなすべてのタイプのHTTPリクエストを使用することを示唆している。 PUT DELETE POST GET . 例えば、次のように作成します。 index.php というように、APIを記述します。

$method = $_SERVER['REQUEST_METHOD'];
$request = split("/", substr(@$_SERVER['PATH_INFO'], 1));

switch ($method) {
  case 'PUT':
    ....some put action.... 
    break;
  case 'POST':
    ....some post action.... 
    break;
  case 'GET':
    ....some get action.... 
    break;
  case 'DELETE':
    ....some delete action.... 
    break;
}

もちろん、私はウェブサービスについてあまり知りません。 しかし、単に JSON オブジェクトを通常の POST または GET (メソッド名とすべてのパラメータを含む)、そして同様にJSONで応答します。シリアライズ/デシリアライズを簡単に行うには、PHP の json_encode()json_decode() というように、異なる HTTP リクエストメソッドを扱うことなく、そのデータでやりたいことを何でもできるようになります。

何か見逃していることがあるのでしょうか?

UPDATE 1:

OK - さまざまなAPIを調べて、多くのことを学びました。 XML-RPC , JSON-RPC , SOAP , REST このようなAPIは健全であるという結論に達しました。実際、stack exchangeは彼らのサイトでこのアプローチをほとんど使っていて、この人たちは自分たちが何をしているかを知っているのだと思う。 スタック・エクスチェンジ API .

解決方法は?

の考え方は RE プレゼンティブ S テート T 転送は、最もシンプルな方法でデータにアクセスすることではありません。

JSONにアクセスするためにポストリクエストを使用することを提案されましたが、これはデータにアクセス/操作するための完全に有効な方法です。

RESTは、以下のための方法論です。 意味のある にアクセスすることができます。RESTのリクエストを見ると、そのデータで何が起こっているのかがすぐにわかるはずです。

例えば

GET: /cars/make/chevrolet

は、シボレー車のリストを返すようです。 優れたREST APIでは、クエリ文字列の中に、次のような出力オプションを組み込むこともできます。 ?output=json または ?output=html を使用すると、アクセッサが情報をどのような形式でエンコードすべきかを決定できるようになります。

REST APIにデータの型付けを合理的に組み込む方法について少し考えた結果、データの型を明示的に指定するには、すでにあるファイル拡張子を利用する、例えば .js , .json , .html または .xml . ファイル拡張子がない場合は、デフォルトの形式 (JSONなど) を使用します。 501 Not Implemented ステータスコード .

別の例

POST: /cars/
{ make:chevrolet, model:malibu, colors:[red, green, blue, grey] }

は、関連する色を持つ新しい Chevy Malibu を db 内に作成することになりそうです。つまり 可能性が高い REST apiはデータベースの構造に直接関係する必要がないためです。真のデータを保護するためのマスキングインターフェイスに過ぎません(データベース構造のアクセッサとミューテータのようなものだと考えてください)。

では、次に べき乗 . 通常、RESTは CRUD をHTTP上で実行します。HTTPでは GET , PUT , POSTDELETE をリクエストに使用します。

RESTの非常に単純化された実装 かもしれない は、次のようなCRUDマッピングを使用します。

Create -> Post
Read   -> Get
Update -> Put
Delete -> Delete

この実装には問題があります。Postは非べき等なメソッドとして定義されています。つまり、同じ Post メソッドを続けて呼び出すと、結果的に 異なる サーバーの状態です。Get、Put、Deleteはべき乗です。つまり、これらを複数回呼び出すと、サーバーの状態は同じになるはずです。

つまり、次のようなリクエストは

Delete: /cars/oldest

は、実際には次のように実装することができる。

Post: /cars/oldest?action=delete

ここで

Delete: /cars/id/123456

は、1回呼び出した場合も、1000回呼び出した場合も、同じサーバー状態になります。

を削除した場合のより良い処理方法です。 oldest の項目を要求することであろう。

Get: /cars/oldest

を使用し ID を結果データから作成し delete をリクエストしてください。

Delete: /cars/id/[oldest id]

この方法の問題点は、別の /cars という項目が追加されました。 /oldest が要求されたときと delete が発行されました。