JSONパラメーターを受け入れ、メソッド用の特定のURLを持つWebサービスがあります:
http://IP:PORT/API/getAllData?p={JSON}
ステートレスではないため、これは間違いなくRESTではありません。Cookieを考慮に入れ、独自のセッションを持ちます。
RPCですか? RPCとRESTの違いは何ですか?
あなたが投稿したものを見ただけでは、RESTまたはRPCを明確に区別することはできません。
RESTの制約の1つは、ステートレスでなければならないことです。セッションがある場合は、サービスをRESTfulに呼び出せない状態があるためです。
URLにアクション(つまり、getAllData
)があるという事実は、RPCに対する指標です。 REST表現を交換し、実行する操作はHTTP動詞によって決定されます。また、RESTでは、 コンテンツネゴシエーション は?p={JSON}
パラメータ。
サービスがRPCかどうかはわかりませんが、RESTfulではありません。オンラインで違いについて学ぶことができます。始めるための記事があります: RPCとRESTの神話を暴く 。サービスの中身をよく知っているので、その機能をRPCと比較し、独自の結論を導き出します。
レストランでの注文をモデル化するHTTP APIの次の例を考えてみましょう。
注文する:
注文の取得:
注文の更新:
sites.google.com/site/wagingguerillasoftware/rest-series/what-is-restful-rest-vs-rpcからの例
他の人が言ったように、重要な違いはRESTは名詞中心であり、RPCは動詞中心です。これを含めたかっただけです 例の明確な表 :
--------------------------- + ----------------- -------------------- + -------------------------- 操作 | RPC(操作) | REST(リソース) --------------------------- + ----------------- -------------------- + -------------------------- サインアップ| POST/signup | POST/persons -------------------- ------- + ------------------------------------- + ---- ---------------------- 辞任| POST/resign | DELETE/persons/1234 --------------------------- + -------------------- ----------------- + -------------------------- 読むperson | GET/readPerson?personid = 1234 | GET/persons/1234 --------------------------- +- ----------------------------------- + -------------- ------------ 人のアイテムリストを読む| GET/readUsersItemsList?userid = 1234 | GET/persons/1234/items -------- ------------------- + ------------------------------ ------- + -------------------------- アイテムを人のリストに追加する| POST/addItemToUsersItemsList | POST /persons/1234/items --------------------- ------ + ------------------------------------- + ----- ------------------ --- アイテムの更新| POST/modifyItem | PUT/items/456 --------------------------- + ------------------------------------- + ----------- --------------- アイテムの削除| POST/removeItem?itemId = 456 | DELETE/items/456 --------------------------- + ---------------------- --------------- + --------------------------
ノート
GET /persons/1234
)、RPCは関数入力にクエリパラメータを使用する傾向があるGET /readPerson?personid=1234
)。GET /persons?height=tall
)。POST /signup
または POST /persons
、新しい人を説明するデータを含めます)。httpを使用したRPCです。 RESTの正しい実装はRPCとは異なる必要があります。メソッド/関数など、データを処理するロジックを持つことはRPCです。 getAllData()はインテリジェントなメソッドです。 RESTはインテリジェンスを持つことができません。それは外部インテリジェンスでクエリできるダンプデータである必要があります。
最近の実装のほとんどはRPCですが、多くはXML/SoapではなくHTTP + jsonを使用していることがわかっているため、誤ってRESTと呼んでいます。 RESTはHTTPで救い主であり、SOAPはXMLで悪役です。あなたの混乱は正当化され、あなたは正しい、それはRESTではありません。
HTTPプロトコルはRESTの実装を行いません。 REST(GET、POST、PUT、PATCH、DELETE)とRPC(GET + POST)の両方をHTTP経由で開発できます(例:Visual StudioのWeb APIプロジェクトを使用)。
RPCは古く、すべての学童はRPCが何であるかを知っており、開発されたRESTのほとんどは、当然のことながらRPC(HTTP + Json)になります。しかし、RESTとは何ですか?リチャードソンの成熟度モデルを以下に示します(要約)。レベル3のみがRESTfulです。
例えばレベル3:
人間が使用できるWebサイトを構築しました。しかし、マシンで使用できるWebサイトを構築することもできますか?そこに未来があり、RESTful Webサービスはその方法を示します。
RESTは、RPCがアクションに関するものであるため、リソースを操作するために最もよく記述されています。
[〜#〜] rest [〜#〜]は、Representational State Transferを表します。独立したシステム間の相互作用を整理する簡単な方法です。 RESTfulアプリケーションは通常、HTTPリクエストを使用して、データの投稿(作成および/または更新)、データの読み取り(クエリの作成など)、およびデータの削除を行います。したがって、RESTは、4つのCRUD(作成/読み取り/更新/削除)操作すべてにHTTPを使用できます。
[〜#〜] rpc [〜#〜]は、基本的に異なるモジュール間で通信してユーザー要求を処理するために使用されます。例えば仮想マシンの起動時にnova、glance、neutronがどのように連携するかのようなオープンスタック。
私はこう主張します:
私のエンティティはデータを保持/所有していますか? RPC:ここに私のデータのコピーがあります。私があなたに送ったデータのコピーを操作して、結果のコピーを私に返します。
呼び出されたエンティティはデータを保持/所有していますか?次に、REST:(1)データの一部のコピーを表示するか、(2)データの一部を操作します。
最終的には、アクションのどちらの「サイド」がデータを所有/保持するかです。そして、はい、REST verbiageを使用してRPCベースのシステムと通信できますが、その場合でもRPCアクティビティを実行できます。
例1:DAOを介してリレーショナルデータベースストア(または他の種類のデータストア)と通信しているオブジェクトがあります。私のオブジェクトとAPIとして存在できるデータアクセスオブジェクト間のやりとりにRESTスタイルを使用するのは理にかなっています。エンティティはデータ、リレーショナルデータベース(またはリレーショナルデータストア).
例2:私は多くの複雑な数学を行う必要があります。オブジェクトにたくさんの数学メソッドをロードしたくありません。あらゆる種類の数学を実行できる他の何かに値を渡し、結果を取得したいだけです。 RPCスタイルは理にかなっています。なぜなら、数学オブジェクト/エンティティがオブジェクト全体に多くの操作を公開するからです。これらのメソッドはすべて個別のAPIとして公開される場合があり、GETを使用してこれらのメソッドを呼び出す場合があることに注意してください。 HTTP GETを介して呼び出しているため、これがRESTfulであると主張することもできますが、実際にはRPCです。私のエンティティはデータを所有/保持しています。リモートエンティティは、送信したデータのコピーに対して操作を実行しています。
HTTPを介して、両方ともHttpRequest
オブジェクトになり、両方ともHttpResponse
オブジェクトが返されることを期待します。その記述でコーディングを続け、他のことを心配することができると思います。
これは、さまざまなユースケースでそれらを理解して使用する方法です。
例:レストラン管理
RESTのユースケース:注文管理
- create order (POST), update order (PATCH), cancel order (DELETE), retrieve order (GET)
- endpoint: /order?orderId=123
リソース管理の場合、REST is clean。定義済みのアクションを持つ1つのエンドポイント。DB(SqlまたはNoSql)またはクラスインスタンスを世界に公開する方法を見ることができます。
実装例:
class order:
on_get(self, req, resp): doThis.
on_patch(self, req, resp): doThat.
フレームワークの例:Python用のFalcon。
RPCのユースケース:運用管理
- prepare ingredients: /operation/clean/kitchen
- cook the order: /operation/cook/123
- serve the order /operation/serve/123
分析、運用、非応答、非代表、アクションベースのジョブの場合、RPCはより適切に機能し、機能的と考えるのは非常に自然です。
実装例:
@route('/operation/cook/<orderId>')
def cook(orderId): doThis.
@route('/operation/serve/<orderId>')
def serve(orderId): doThat.
フレームワークの例:Flask