web-dev-qa-db-ja.com

RESTとCRUDの違い

私はRESTを学びました、そしてそれは(私がCRUDについて読んだことから)CRUDのように感じます。

私はそれらが異なることを知っています、そしてそれらが類似していると思うことは私がそれらを理解していないのではないかと思います。

RESTはCRUDの「スーパーセット」ですか?CRUDが行うすべてのことを実行しますか?

178
Jesse Black

驚いたことに、私は他の回答では、RESTとCRUDの真の違いと考えるものは何を管理するのかわかりません。

CRUDは、データリポジトリで実行される基本的な操作を意味します。レコードまたはデータオブジェクトを直接処理します。これらの操作とは別に、レコードは受動的なエンティティです。通常、それは単なるデータベースのテーブルとレコードです。

一方、RESTはリソース表現で動作し、それぞれがURLで識別されます。これらは通常、データオブジェクトではなく、複雑なオブジェクトの抽象化です。

たとえば、リソースはユーザーのコメントにすることができます。これは、「コメント」テーブル内のレコードだけでなく、「ユーザー」リソースとの関係、コメントが添付されている投稿、おそらくそれが応答する別のコメントも意味します。

コメントを操作することは、基本的なデータベース操作ではなく、元のポスターにアラートを発したり、ゲームのような「ポイント」を再計算したり、「フォロワーストリーム」を更新したりするなど、重大な副作用を引き起こす可能性があります。

また、リソース表現にはハイパーテキストが含まれ( [〜#〜] hateoas [〜#〜] 原則を確認)、デザイナーがリソース間の関係を表現したり、REST操作のワークフローのクライアント。

つまり、CRUDはセットプリミティブ操作(主にデータベースと静的データストレージ用)ですが、RESTは非常に高レベルのAPIスタイルです(主にWebサービスやその他の「ライブ」システム用))。 。

1つは基本データを操作し、もう1つは複雑なシステムとやり取りします。

212
Javier

まず第一に、両方とも単に一般的なイニシャルです。彼らは恐れることは何もありません。

CRUDは、多くのアプリケーションで共通の機能であるため省略された単純な用語で、[〜#〜] crud [〜#〜]と言う方が簡単です。データ(またはリソース)に対して実行できる4つの基本操作について説明します。作成、読み取り、更新、削除。

ただし、RESTは(AJAXと同様に)名前付きの手法であり、それ自体はテクノロジーではありません。これは、長い間HTTPプロトコルに内在していた機能の使用を奨励しますが、ほとんど使用されていません。

URL(Uniform Resource Locator)があり、アドレスラインでブラウザにそのURLを指定すると、HTTPリクエストが送信されます。各HTTP要求には、サーバーがどのHTTP応答を知るために使用できる情報が含まれており、要求を発行したクライアントに送り返します。

各リクエストにはURLが含まれているため、サーバーはアクセスしたいresourceを認識していますが、methodを含めることもできます。メソッドは、そのリソースで何をするかを記述します。

しかし、この「方法」の概念はあまり使用されませんでした。

通常、人々はGETメソッドを介してページにリンクし、POSTメソッドを介してanyタイプの更新(削除、挿入、更新)を発行します。

そのため、1つのresource(URL)をそれ自体を真のリソースとして扱うことはできませんでした。同じリソースを削除、挿入、または更新するには、別々のURLが必要でした。例えば:

http://...com/posts/create- POST request  -> Goes to posts.create() method in the server
http://...com/posts/1/show- GET request  -> Goes to posts.show(1) method in the server
http://...com/posts/1/delete - POST request  -> Goes to posts.delete(1) method in the server
http://...com/posts/1/edit- POST request  -> Goes to posts.edit(1) method in the server

RESTでは、smarterであるフォームを作成します。これは、フォームがPOST以外のHTTPメソッドを使用するためです。また、メソッドを区別できるようにサーバーをプログラムします、URLだけではありません。だから例えば:

http://...com/posts - POST request  -> Goes to posts.create() method in the server
http://...com/posts/1 - GET request  -> Goes to posts.show(1) method in the server
http://...com/posts/1 - DELETE request  -> Goes to posts.delete(1) method in the server
http://...com/posts/1 - PUT request  -> Goes to posts.edit(1) method in the server

1つのURLが1つのリソースを表すことを忘れないでください。 1つの投稿は1つのリソースです。 RESTを使用すると、リソースを本来の方法で処理できます。処理したいリソースとその処理方法をサーバーに伝えます。

「RESTfulアーキテクチャ」には他にも多くの機能があります。興味があれば、Wikipediaや他の記事や本で読むことができます。一方、CRUD自体にはそれほど多くのものはありません。

102
Yam Marcovic

RESTは「表現状態転送」を意味します。つまり、システム内のリソースの状態の通信と変更がすべてです。

RESTの背後にある理論は、リモートシステム上の情報を管理するためにメディア、ハイパーメディア、および基礎となるプロトコルを利用するため、RESTはかなり複雑になります。

一方、CRUDは、データベース内のデータに必要な一般的な操作(作成、取得、更新、削除)のニーモニックです。しかし、それは本当にそれ以上深くはなりません。

それがあなたの質問への答えですが、RESTとCRUDが一緒に議論されるときに見られる一般的な間違いについて述べます。 CRUDはCREATE RETRIEVE UPDATE DELETEを提供する一方で、HTTP上のRESTはGET PUT RESTおよびDELETEを提供するため、多くの開発者はPOSTを直接CRUDにマップしたいと考えています。 。 REST動詞を直接CRUD操作にマップするのは当然のことです。

ただし、HTTPは「作成または更新」スタイルを使用し、CRUDは作成と更新を分離します。そのため、2つの間の明確な一般的なマッピング(!)は不可能(!)

GETとDELETEは簡単です... GET === RETRIEVE、そしてDELETE === DELETE。

しかし、HTTP仕様によれば、PUTは実際には作成と更新です。

  • 識別子を含め、PUTを使用して、オブジェクトに関するすべてを知っている場合は、新しいオブジェクトを作成します。

  • PUTを使用してオブジェクトを更新する(通常はオブジェクトの完全な表現を使用)

POSTは「処理」動詞であり、「追加」動詞と見なされます。

  • POSTを使用して、新しいオブジェクトをコレクションに追加します。つまり、新しいオブジェクトを作成します

  • POSTは、HTTP仕様で「データ処理」動詞として定義されているため、他の動詞がまったく適合しない場合にも使用されます。

  • チームがPOSTでハングアップしている場合は、WWW全体がGETおよびPOSTに基づいて構築されていることを忘れないでください。

したがって、RESTとCRUDには類似点がありますが、ほとんどのチームが犯す間違いは、2つを同等にすることです。チームはREST AP​​Iを定義するときは、CRUDニーモニックにこだわりすぎないように注意する必要があります。練習としてのRESTには、実際には非常に多くの複雑さがあるためです。 t CRUDに明確にマッピングします。

22
Rob

[〜#〜] crud [〜#〜]

  • CRUDは、SQLコマンドの4つの基本的なタイプです:作成、読み取り、更新、および削除
  • ほとんどのアプリケーションには、ある種のCRUD機能があります。
  • CRUDアプリケーションは、フォームを使用してデータベースにデータを出し入れするアプリケーションです。

[〜#〜]レスト[〜#〜]

  • RESTは、Representational State Transferの略です(「ReST」と綴られることもあります)。

  • ステートレスでクライアント/サーバー間でキャッシュ可能な通信プロトコルに依存しており、ほとんどすべての場合、HTTPプロトコルが使用されます。

  • RESTは、ネットワークアプリケーションを設計するためのアーキテクチャスタイルです。

7
Vayodya Tamari

CRUDは、データの読み取りと書き込みのための基本的なストレージ動詞の最小セットを指定します:作成、読み取り、更新、削除。次に、これらを集約することにより、他の操作を構築できます。これらは通常データベース操作と見なされますが、データベースと見なされるものは任意です(たとえば、リレーショナルDBMSの場合もありますが、YAMLファイルの場合もあります)。

RESTは「アーキテクチャスタイル」であり、通常はCRUD操作とその他のより高いレベルの操作が含まれ、すべて「リソース」の概念で実行されます(任意ですが、これらはアプリケーションのエンティティです)。 RESTには constraints がたくさんあり、面白くしています(特にHTTPとペアになっています)。

RESTインターフェースは、特定のリソースに対するすべてのCRUD操作を公開できますが、そうする必要はありません。RESTインターフェースで利用できるものは任意であり、システムのアクセス許可、UIの考慮事項、およびインターフェイスが設計および作成された日にどれだけ暑かったために変更されます。

7
Dan Rosenstark

RESTはマシンが閲覧できるWebページのようなものですが、CRUDはSOAPのようなもので、クライアントと強く結びついています。これらが主な違いです。 Ofc。表面的には似ていますが、CRUDは基本的なエンティティ操作を記述しますが、RESTは任意のアプリケーションのインターフェースを記述できます。RESTは、 4つのHTTPメソッド。すべての違いを収集したい場合は、非常に長い回答になります。REST vs SOAPに関する質問を確認すると、ほとんどが見つかります。

REST CRUDと混同するのはよくある間違いだと思います。原因は、開発者がRESTについて詳しく読む時間がないためです。同様の開発者によって書かれた限定されたCRUDスタイルの例に基づいて、テクノロジーを理解せずに使用したい。例とチュートリアルの大部分は、深刻な知識の欠如を反映している。エンティティへのマッピングRESTリソースこれらのエンティティのCRUD操作にHTTPメソッドを使用し、ハイパーリンクなしでRESTを使用することは、その症状にすぎません。RESTによって、ハイパーリンク(POST/PUT/DELETE/PATCHメソッド)を操作に追加し、(通常はAPI固有の)リンク関係をチェックして、クライアント側の操作を識別します。RESTクライアントがリンク関係を知らない場合であり、HTTPメソッドとおそらくいくつかのURIテンプレートしか認識していない場合、これはRESTクライアントではなく、HTTPクライアント上のCRUDです。RESTクライアントは、ブラウザで実行される単一ページのJavaScriptアプリケーションです。もちろん、そのようなクライアントを実装することはできますが、RESTは主に自動クライアント(知らない開発者が作成したサーバー側アプリケーション)向けであり、手動クライアント(ユーザー制御のブラウザアプリケーション向け)向けではありませんでした。あなたが書いたものです。ブラウザクライアントが1つしかない場合、RESTで実際にプロジェクトを設計し直す必要はないという兆候かもしれません。これらの場合、CRUD APIは実行可能なソリューションであり、開発者は違いを知らないため、これらのCRUD APIをRESTとして呼び出しています。

2
inf3rno