REST vs JSON-RPC?[閉まっている]


251

WebアプリケーションのAPIを開発するために、RESTとJSON-RPCのどちらかを選択しようとしています。彼らはどのように比較しますか?

2015年更新:クライアントとサーバーの両方が理解する既存の成熟したHTTPプロトコルをAPIで利用できるため、RESTを開発してWeb / HTTPで提供されるAPIを使用する方が簡単であることがわかりました。たとえば、応答コード、ヘッダー、クエリ、投稿本文、キャッシング、およびその他の多くの機能を、追加の作業や設定なしでAPIで使用できます。


29
RESTは現在、間違いなく人気のある答えです。しかし、それが常に正しい答えであるとは確信していません。リソース中心のREST APIと、本質的にタスクまたはワークフローに基づく問題ドメインとの間にインピーダンスのミスマッチがある可能性があります。同じリソースに対して異なるタイプのPATCHを実行する必要がある場合、または特定のタスクが特定のリソースにマッピングされない場合は、RESTパラダイムを曲げる必要があります。アクション/コマンドをリソースとして使用しますか?Content-Typeヘッダーのコマンドタイプをパラメーターとして区別しますか?万能な答えがあるかわかりません。
Landon Poch 2014年

27
JSON-RPCはシンプルで一貫性があり、使うのが楽しいです。
ドナウ2014年

1
2015年8月、RESTを使用してクライアントとサーバーの両方を実装しました。最初の2日間は学習していたので、なぜそれが人気なのか理解しました。小さなアプリが作成されると本当に嬉しかったです。クライアントはさまざまなURLパスを覚える必要がありません。node.js上のサーバーとJavaScriptのクライアントは同じ構造(URLパス)を共有して通信します。うわー!それは非常に迅速で、製品はゼロから書いてもわずか15日で届きました。RESTが最適です。また、人気のあるApache CouchDBは、優れたデータベースであるRESTを使用していることにも注意してください。簡単に言うと、RESTは正しい(正しい)インターフェイスでクリーンです。
Manohar Reddy Poreddy 2015

6
それはあなたが持っている制約やあなたの主な目標に依存します。たとえば、パフォーマンスが主要な側面である場合、進むべき道はJSON-RPC(たとえば、ハイパフォーマンスコンピューティング)です。主な目的が不可知論であり、他の人が解釈する一般的なインターフェースを提供することである場合は、RESTを使用します。両方の目標が必要な場合は、両方のプロトコルを含める必要があります。ニーズはソリューションを定義します。
Stathis Andronikos、2015

@StathisAndronikosそうですね、私の主な目標は、使いやすさとWebアプリ(HPCではない)の優れたパフォーマンスでした。
Ali Shakiba、2015

回答:


221

RPCの基本的な問題は結合です。RPCクライアントは、いくつかの方法でサービス実装に密接に結合され、クライアントを壊さずにサービス実装を変更することは非常に困難になります。

  • クライアントはプロシージャ名を知っている必要があります。
  • プロシージャパラメータの順序、タイプ、カウントの問題。クライアントの実装を壊さずにサーバー側でプロシージャシグネチャ(引数の数、引数の順序、引数の型など)を変更するのは簡単ではありません。
  • RPCスタイルでは、プロシージャエンドポイント+プロシージャ引数以外は公開されません。クライアントが次に何ができるかを判断することは不可能です。

一方、RESTスタイルでは、表現(HTTPヘッダー+表現)に制御情報を含めることで、クライアントを簡単にガイドできます。例えば:

  • これらのURIの意味を伝えるリンク関係タイプで注釈が付けられたリンクを埋め込むことが可能です(実際には必須です)。
  • クライアントの実装は、特定のプロシージャ名と引数に依存する必要はありません。代わりに、クライアントはメッセージ形式に依存します。これにより、特定のメディア形式(Atom、HTML、Collection + JSON、HALなど...)にすでに実装されているライブラリを使用する可能性が生まれます。
  • 登録された(またはドメイン固有の)リンク関係にのみ依存している限り、クライアントを壊すことなくURIを簡単に変更できます。
  • 表現にフォームのような構造を埋め込むことが可能であり、エンドユーザーが人間である場合、クライアントはこれらの記述をUI機能として公開することができます。
  • キャッシングのサポートは追加の利点です。
  • 標準化されたステータスコード。

REST側には、さらに多くの違いと利点があります。


20
「意味を伝えるリンク関係タイプで注釈されたリンクを埋め込むことは必須です」とはどういう意味ですか?
pjz 2013

129
「クライアントはプロシージャ名を知っている必要があります」-RESTではこの名前がパラメーターとして渡される代わりにURIにハードコードされるため、これは引数ではありません。そうしないと、サーバーはどのメソッドを実行すべきかがわかりません。
センチュリオン2014年

44
「プロシージャシグネチャを変更するのは簡単ではありません...クライアント側の実装を壊すことなくサーバー側で」、これも議論の余地があります。RESTとJSON-RPCはどちらもSOAPではなく、既存のWebサービスとそのタイプを記述するWSDLがないため、クライアント側で動的な変更に使用できます。したがって、どちらの方法でも、Webサービスを変更する場合は、クライアントを変更する必要があります。それ以外の場合は、SOAPを使用する必要があります。
センチュリオン2014年

64
大量のアプリをコーディングしましたが、まだ柔軟なWebサービスはありませんでした。バックエンドとWebサービスを変更する場合、クライアントは常に新しい要件に合わせてリファクタリング/更新する必要があります。SOAPについても触れましたが、WSDLのように柔軟性があるため、結果セット、データ型、使用可能なWebサービスに関する情報を取得できるので、SOAPを自動化でき、柔軟性が高まります。RESTや他の人にはそれがまったくありません。したがって、RESTもJSON-RPCも他のWebサービスタイプも、手動でクライアントを更新する必要をなくす魔法を提供します。
センチュリオン2014年

15
私、現在のチーム、以前のチームにとって、RESTful WebサービスはCRUDタイプのアプリケーション用です。「サーバーで何かが変更されるたびにブラウザーを書き換えますか?」について -いいえ、ブラウザは単なるHTTPエグゼキュータであるため、ビジネスロジックとは何の関係もありません。クライアントプログラムが実装する必要があります(画面の表示、関連するものの実行)。炎戦が始まったようですが、一般的には、RESTfull Webサービスの実用的なフローと、あなたが言及している魔法のような柔軟性を備えた、もう1つの強固なソースがあればいいのですが。一方、多くのステートメントはあいまいすぎます。
センチュリオン2014年

163

私は問題を詳細に調査し、純粋なRESTは制限が多すぎ、RPCが最善であると判断しました。ただし、私のアプリのほとんどはCRUDアプリです。RESTに固執する場合、最終的に頭を悩ませることになり、特別な目的のために、必要な別のメソッドをAPIに簡単に追加する方法を疑問に思います。多くの場合、RESTでこれを行う唯一の方法は、そのための別のコントローラーを作成することです。これにより、プログラムが過度に複雑になる場合があります。

RPCを決定する場合の唯一の違いは、URIの一部として動詞を明示的に指定していることです。これは明確で、一貫性があり、バグが少なく、本当に問題ありません。特に、単純なCRUDをはるかに超えるアプリを作成する場合、RPCが唯一の方法です。RESTful主義者には別の問題があります。HTTPでHTTP POST、GET、PUT、DELETEは明確な意味を持っていますが、RESTによって他の意味に変換されています。

プログラミングにおいて、私はずっと前に、1つのことを使用して2つのことをしようとすると、いつか思い付き、あなたに噛み付くことに気づきました。メソッドの必要に応じてデータを自由に送受信できるので、POSTをほぼすべてのアクションで使用できるようにしたいと思います。全世界をCRUDに適合させることはできません。


30
この回答は、RESTが実際に何であるかについての、あまりにも頻繁に起こる誤解を示しています。RESTは、CRUDからHTTPメソッドへの単なるマッピングではありません。「別のメソッドを追加する」ことが問題であるという考えは、RESTがRPC over HTTPとして誤解されていることを明確に示していますが、まったくそうではありません。ロイフィールディングスのブログまたは彼の論文を読んでみてください。Googleがそれを見つけるのに役立ちます。答えの中でRESTをまったく説明していません。
nepdev 2015年

68
私はとても実用的な人です。私が明確に読んだRESTのすべての説明は、CRUDからHTTPメソッドへのマッピングから始まります。理論的にはさらに追加することが許可されていますが、実際には追加されていません。例として、最近AndroidデバイスにPATCHを実装することを望んでいましたが、AndroidではPATCHが許可されていないため、URIでその効果に対して明示的に定義されたアクションでPOSTを使用しました。基本的に、純粋なRESTは必要なジョブを実行しないので、機能するものを使用します。
Bruce Patin、2015年

4
したがって、@ BrucePatinのバージョン "REST"には、GET | PUT | POST | DELETEで1対1にマップする4つのパブリックメソッドを持つコントローラーがありますか?一部のフレームワークはそれを行いますが、それはRESTではありません。HTTP動詞は、特定の要求のセマンティクスについて漠然とした抽象的なアサーションを作成します。エンドポイントをこれらのクラスに適切にマッピングする必要があります。GETは多くの異なるエンドポイントにマッピングできるため、他のエンドポイントもマッピングできます。実際、REST-ful JSON-RPC over HTTPを実装できない理由はありません。
spinkus 2015年

5
非常に正当な理由があります。私は数十のアクションが必要かもしれませんが、PATCHをサポートしていない一般的な用途(Android)にすでに遭遇しています。それは寒さを殺します。規則のいくつかの例外に対処する必要があるよりも、私はむしろ一貫しているほうがいいです。通常は、GET、POST、DELETEのみを使用します。PUTは、更新操作で必要なフィードバックを許可しません。私はほとんどすべてにPOSTを使用しています。キャッシュに関しては、古いデータを返すことで多くの問題を引き起こしています。POSTへのパラメーターの配置に関しては、ASP.NETは既に自動JSONオブジェクトから自動的に処理します。
Bruce Patin 2015年

22
RESTが本当に何であるかについての論争はあなたのコメントを強調するだけであり、RESTの主要な欠点を強調していると思います。概念的には、RESTfulが何であるかについて完全に同意する2人を見つけることは困難です。とにかく、文書化されていないRPCやRESTを使用するサービスはないため、問題はありません。ドキュメントに記載されている場合、それを使用する開発者は問題ありません。
アジャイルジェダイ

29

まず、HTTP-RESTは「表現状態転送」アーキテクチャです。これは多くの興味深いことを意味します:

  • APIはステートレスであるため、設計がはるかに簡単になり(複雑なオートマトンでの遷移を忘れるのは本当に簡単です)、独立したソフトウェアパーツと統合することができます。
  • 安全な方法として読み取り方法を設計することにつながり、キャッシュと統合が簡単になります。
  • タイムアウトをより適切に処理するべきメソッドとして、書き込みメソッドを設計することにつながります。

2番目に、HTTP-RESTはHTTPに完全に準拠しているため(前の部分の「安全」と「べき等」を参照)、HTTPライブラリ(既存のすべての言語に存在)とHTTPリバースプロキシを再利用できるため、ゼロ行のコードで高度な機能(キャッシュ、認証、圧縮、リダイレクト、リライト、ロギングなど)を実装する機能。

最後に重要なことですが、HTTPをRPCプロトコルとして使用することは、HTTP 1.1の設計者(およびRESTの発明者)によると大きなエラーです:http : //www.ics.uci.edu/~fielding/pubs/dissertation/evaluation。 htm#sec_6_5_2


1
信頼できる、知っているはずの人の知っている参照の+1 ....その後のRPC over HTTPについて、それをハック/回避

9
あなたは2000年から何かを参照しました。それはRPC対RPCのより哲学的な議論です。意味論上、RPCパターンを適用すると、URIを「手順」と見なし、エンコードされたパラメーターを...よく...パラメーターと見なすことができます。どちらのパターンもHTTPで正常に機能します。SOAP、RAILS、またはHTTPにオーバーレイされたその他のパタ​​ーン/プロトコルと同じです。コントラクトを壊さない一貫したAPIを提供する限り、問題はありません。
アジャイルジェダイ

オーレリアン、正当化できますか?RESTが独立したソフトウェアパーツと簡単に統合できるのはなぜですか?私にとって、RESTful APIまたはRPCのどちらを使用しているかに関係なく、クライアントソフトウェアは、APIが処理する形式を知る必要があります。
Alexey、

1
@Alexeyこの議論は無国籍に関連していた。そのAPIであるコーヒーマシンを統合することが容易であるCREATE CUP含まれているであろうと、他のよりも、INSERT COINSELECT COFFEESELECT SUGAR、とSTART。2番目のAPIでは、マシンの状態に依存するため、プロシージャコールのシーケンスに注意する必要があります。
オーレリアン

1
RPCプロトコルとしてのHTTP RESTです。ですから、あなたの誤った解釈は驚くほど逆です。
Tiberiu-Ionuț Stan 2016

24

すばらしい答え-いくつかのコメントを明確にしたかっただけです。JSON-RPCはすばやく簡単に使用できますが、前述のようにリソースとパラメーターは密結合されており、GET / POSTを使用して動詞(api / deleteUser、api / addUser)に依存する傾向があります。RESTは疎結合リソース(api /ユーザー)HTTP REST APIでは、いくつかのHTTPメソッド(GET、POST、PUT、PATCH、DELETE)に依存しています。RESTは、経験の浅い開発者にとっては実装が少し難しいですが、スタイルは今やかなり一般的な場所になり、長期的にははるかに柔軟になっています(APIの寿命を延ばしています)。

リソースが密結合されていないことに加えて、RESTを使用すると、単一のコンテンツタイプへのコミットを回避できます。つまり、クライアントがXML、JSON、またはYAMLでデータを受信する必要がある場合-システムに組み込まれている場合、 content-type / acceptヘッダーを使用してそれらのいずれかを返します。

これにより、新しいコンテンツタイプやクライアント要件をサポートするのに十分なAPIを維持できます。

しかし、RESTをJSON-RPCから本当に分離しているのは、慎重に検討された一連の制約に従っているため、アーキテクチャの柔軟性が確保されていることです。これらの制約には、クライアントとサーバーが互いに独立して進化できること(クライアントのアプリケーションをめちゃくちゃにすることなく変更を加えることができること)の保証、呼び出しがステートレス(状態はハイパーメディアによって表される)、インタラクション用の統一されたインターフェースが提供されることなどが含まれます。 APIは階層化システムで開発され、応答はクライアントによってキャッシュ可能です。コードをオンデマンドで提供するためのオプションの制約もあります。

ただし、これらすべてについて、ハイパーメディア(APIのナビゲートに役立つ応答に埋め込まれたハイパーテキストリンク)が組み込まれていないため、MOST APIは(Fieldingによると)RESTfulではありません。そこにあるほとんどのAPIはRESTに似ていますが、RESTのほとんどの概念に従っていますが、この制約を無視します。しかし、ますます多くのAPIがこれを実装しており、ますます主流のプラクティスになっています。

これにより、ハイパーメディアドリブンAPI(Stormpathなど)がクライアントをURIに転送する(何らかの変更があった場合、特定のケースではマイナスの影響なしにURIを変更できる)ため、RPC URIと同様に、静的。RPCでは、これらのさまざまなURIを広範囲に文書化し、それらが相互に関連してどのように機能するかを説明する必要もあります。

一般的に、長持ちする拡張可能で柔軟なAPIを構築する場合は、RESTが適しています。そのため、99%の確率で進むべき道だと思います。

がんばって、マイク


3
少し難しくはありませんが、むしろ非常に難しいです。私はそれを4か月ほど理解しようとしていましたが、jsonを使用してhttp経由でステートレスRPCに展開しないサービスを作成する方法をうまく理解できていませんが、まだ確信がありません「REST」と私が言ったばかりの間に実際の違いがあります
Austin_Anderson '

19

IMO、重要なポイントは、アクションとリソース指向です。RESTはリソース指向であり、CRUD操作によく適合し、その既知のセマンティクスにより最初のユーザーにある程度の予測可能性が提供されますが、メソッドまたはプロシージャから実装すると、リソース中心の世界への人工的な翻訳を提供する必要があります。一方、RPCは、CRUD対応のリソースセットではなく、サービスを公開するアクション指向のAPIに最適です。

間違いなくRESTの方が人気があります。APIをサードパーティに公開したい場合、これは間違いなくいくつかのポイントを追加します。

そうでない場合(たとえば、SPAでAJAXフロントエンドを作成する場合)、RPCを選択します。特に、JSON-RPCは、記述言語としてJSONスキーマと組み合わされ、ユースケースに応じてHTTPまたはWebソケットを介して転送されます。

JSON-RPCは、同期または非同期のRPCで使用される要求と応答のJSONペイロードを定義するシンプルでエレガントな仕様です。

JSONスキーマは、JSONデータの記述を目的としたJSONベースのフォーマットを定義するドラフト仕様です。JSONスキーマを使用してサービスの入力メッセージと出力メッセージを記述することにより、使いやすさを損なうことなくメッセージ構造に任意の複雑さを持たせることができ、サービス統合を自動化できます。

トランスポートプロトコル(HTTPとWebソケット)の選択はさまざまな要因によって異なり、HTTP機能(キャッシュ、再検証、安全性、べき等、コンテンツタイプ、マルチパートなど)が必要か、アプリケーションを交換する必要があるかが最も重要です。高頻度でのメッセージ。

これまでは、この問題に対する私の個人的な意見が非常に多かったのですが、今、これらの行を読んでいるJava開発者にとって本当に役立つもの、昨年疑問に思っている同じ質問から生まれた、昨年中に取り組んできたフレームワーク:

http://rpc.brutusin.org

ここにライブデモがあり、機能テスト用の組み込みリポジトリブラウザー(JSONスキーマに感謝)と一連のサンプルサービスが表示されています。

http://demo.rpc.brutusin.org

それが仲間に役立つことを願っています!

ナチョ


親族の精神を見つけるのは素晴らしいことです!私はここで似たようなものに取り組んでいます:github.com/dnault/therapi-json-rpc
dnault

:)私はそれを調べます
idelvall '18年

1
これに同意します。明白なPOST / GET / PUT / DELETE [PoGPuD?;)]マッピング。ただし、API これらの動詞にうまく適合しない場合は、動詞が問題を混乱させるだけなので、JSON-RPCが適切なオプションになることがあります。ええ、誰がそれを使っているのか、なぜそれが大きな要因なのか。
Algy Taylor 2016

1
まさに-RESTは名詞の王国であり、JSON-RPCは動詞です。
ロブ・グラント

16

モデルとGET / POST / PUT / DELETEパターンのみでサービスが正常に機能する場合は、純粋なRESTを使用してください。

HTTPはもともとステートレスアプリケーション用に設計されていることに同意します。

しかし、WebSocket(多くの場合、ステートフル性を意味する)を使用する必要がある、現代的でより複雑な(!)リアルタイム(Web)アプリケーションの場合、両方を使用しないのはなぜですか?JSON-RPC over Websocketsは非常に軽量なので、次の利点があります。

  • すべてのクライアントでの即時更新(モデルを更新するための独自のサーバーからクライアントへのRPC呼び出しを定義します)
  • 複雑さを追加するのは簡単(RESTのみでEtherpadクローンを作成してみてください)
  • それを正しく行うと(リアルタイムの追加としてのみRPCを追加)、ほとんどがまだRESTのみで使用できます(主な機能がチャットまたは何かである場合を除く)

サーバー側のAPIのみを設計しているため、RESTモデルの定義から始め、後で必要に応じてJSON-RPCサポートを追加し、RPC呼び出しの数を最小限に抑えます。

(そして括弧の乱用については申し訳ありません)


15

私は過去にRESTの大ファンであり、紙上でのRPCよりも多くの利点があります。クライアントにさまざまなコンテンツタイプ、キャッシュ、HTTPステータスコードの再利用を提示したり、APIを介してクライアントをガイドしたり、ほとんど説明がない場合はドキュメントをAPIに埋め込んだりできます。

しかし、私の経験では、実際にはこれは長続きせず、代わりにすべてを正しくするために多くの不必要な作業を行っています。また、HTTPステータスコードはドメインロジックに正確にマッピングされないことが多く、コンテキストでの使用は少し強制されているように感じられます。しかし、私の意見では、RESTについて最悪のことは、リソースとリソースが許可する相互作用を設計するために多くの時間を費やすということです。そして、APIにいくつかの主要な追加を行うときはいつでも、新しい機能を追加するための優れたソリューションを見つけて、まだ隅々まで設計していないことを願っています。

ほとんどの場合、APIをリモートプロシージャコールのセットとしてモデル化する方法については、完全に明確で明確なアイデアを持っているため、これは時間の浪費のように感じることがよくあります。そして、RESTの制約内で問題をモデル化するためにこのすべての努力を終えた場合、次の問題はクライアントからそれを呼び出す方法ですか?私たちのプログラムはプロシージャの呼び出しに基づいているため、優れたRPCクライアントライブラリの構築は簡単で、優れたRESTクライアントライブラリの構築はそれほど多くはありません。ほとんどの場合、サーバー上のREST APIからクライアントの一連のプロシージャにマップします。図書館。

このため、今日のRPCは、よりシンプルで自然に感じられます。私が実際に見逃しているのは、自己記述的で相互運用可能なRPCサービスを簡単に作成できる一貫したフレームワークです。したがって、私は自分のプロジェクトを作成して、RPCを自分で使いやすくする新しい方法を試してみました。おそらく他の誰かもそれを便利だと思っています:https : //github.com/aheck/reflectrpc


OpenRPCをチェックしてください。「自己記述的で相互運用可能なRPCサービスを簡単に作成する」というニーズが解決されるはず
です。– Belfordz

11

Richardsonの成熟度モデルによると、問題はRESTとRPCではなく、どれくらいのRESTが必要かということです。

このビューでは、REST標準への準拠は4つのレベルに分類できます。

  • レベル0:アクションとパラメーターの観点から考えます。記事で説明しているように、これは基本的にJSON-RPCと同等です(記事ではXML-RPCについて説明していますが、同じ引数が両方に当てはまります)。
  • レベル1:リソースの観点から考える。リソースに関連するすべてのものは同じURLに属します
  • レベル2:HTTP動詞を使用する
  • レベル3:HATEOAS

REST標準の作成者によると、レベル3のサービスのみをRESTfulと呼ぶことができます。ただし、これはコンプライアンスの指標であり、品質ではありません。計算を行うリモート関数を呼び出すだけの場合は、応答に関連するハイパーメディアリンクを含めることはおそらく意味がなく、使用されるHTTP動詞に基づく動作の区別も意味がありません。したがって、そのような呼び出しは本質的にRPCに似たものになる傾向があります。ただし、コンプライアンスレベルが低くても、必ずしもステートフルであること、またはカップリングが高いことを意味するわけではありません。おそらく、REST対RPCではなく、できるだけ多くのRESTを使用する必要がありますが、それ以上は使用しないでください。RESTfulコンプライアンス標準に合わせるためだけにアプリケーションをねじらないでください。


1
レベル0、1、および2の+1。ただし、HATEOSの実装が成功したことは一度もありませんが、2つの惨めな失敗が見られました。
mjhm 2018年

8

JSON RPCが選ばれる理由:

REST APIの場合、必要になる可能性のある機能/メソッドごとにコントローラーを定義する必要があります。その結果、クライアントにアクセス可能にしたいメソッドが10個ある場合、クライアントのリクエストを特定のメソッドにインターフェースするために10個のコントローラーを作成する必要があります。

別の要因は、メソッド/機能ごとに異なるコントローラーがある場合でも、クライアントはPOSTまたはGETを使用するかどうかを覚えておく必要があることです。これは事態をさらに複雑にします。さらに、POSTを使用する場合は、データを送信するために、リクエストのコンテンツタイプを設定する必要があります。

JSON RPCの場合、ほとんどのJSONRPCサーバーはPOST HTTPメソッドで動作し、コンテンツタイプは常にapplication / jsonであるため、処理は大幅に簡略化されます。これにより、クライアント側で適切なHTTPメソッドとコンテンツ設定を使用することを覚えておく必要がなくなります。

サーバーがクライアントに公開したいさまざまなメソッド/機能に個別のコントローラーを作成する必要はありません。

RESTを選ぶ理由:

サーバーがクライアント側に公開したいさまざまな機能に個別のURLがあります。その結果、これらのURLを埋め込むことができます。

これらの点のほとんどは議論の余地があり、人の必要性に完全に依存しています。


3

いつものように、それは依存する...

RESTには広範なパブリックサポートの大きな利点があり、これは多くのツールと本を意味します。さまざまな組織の多数のコンシューマーが使用するAPIを作成する必要がある場合、それが唯一の理由である方法です。それが人気があるからです。プロトコルとして、コマンドをURL / verb / responseにマップする完全に異なる方法が多すぎるため、これは完全な失敗です。

したがって、バックエンドと通信する必要がある単一ページのWebアプリを作成する場合、RESTは複雑すぎると思います。この状況では、アプリとAPIを一緒に進化させることができるため、長期的な互換性について心配する必要はありません。

単一ページのWebアプリのRESTを始めたことがありますが、Webアプリとサーバーの間の細かいコマンドがすぐに気が狂いました。パスパラメータとしてエンコードする必要がありますか?体に?クエリパラメータ?ヘッダー?URL /動詞/応答の設計後、この混乱をJavascriptでコーディングし、デコーダーをJavaでコーディングしてから、実際のメソッドを呼び出す必要がありました。このためのツールはたくさんありますが、ドメインコードでHTTPセマンティクスを取得しないようにするのは非常にトリッキーです。(凝集)

中程度の複雑なサイト用のSwagger / OpenAPIファイルを作成して、そのファイル内のリモートプロシージャを記述する単一のJavaインターフェースと比較してください。複雑さの増加は驚異的です。

そのため、単一ページのwebappをRESTからJSON-RPCに切り替えました。aサーバー上のJavaインターフェースをエンコードする小さなライブラリーを開発し、それをブラウザーに出荷しました。これにより、ブラウザーで、各関数のpromiseを返すアプリケーションコードのプロキシが作成されました。

繰り返しになりますが、RESTは有名であり、そのため十分にサポートされているという理由だけでその位置を占めています。根底にある無国籍資源の哲学と階層モデルを認識することも重要です。ただし、これらの原則はRPCモデルでも同様に簡単に使用できます。JSON RPCはHTTP経由で機能するため、この領域ではRESTと同じ利点があります。違いは、これらの原則にうまく対応しないこれらの関数に必然的に出くわしたとき、多くの不必要な作業を強いられないことです。


1
この回答により、GraphQLとJSON-RPCの類似点、およびGraphQLがSPAの人気の選択肢になっている理由を理解しました。
デニス

OpenRPCはOpenAPI / Swaggerと同等ですが、JSON-RPCの場合
Belfordz

1

RESTはHTTPと緊密に結合されているため、HTTP経由でAPIを公開するだけの場合、RESTはほとんどの(すべてではない)状況に適しています。ただし、メッセージングやWebソケットなどの他のトランスポートを介してAPIを公開する必要がある場合、RESTは適用されません。


2
RESTはアーキテクチャスタイルであり、プロトコルに依存しません。
Mark Cidade

4
RESTはアーキテクチャの原則です。ただし、その理論的基盤はHTTPプロトコルの影響を強く受けており、普遍的な適用性の主張にもかかわらず、Webドメイン以外の実用的なアプリケーションは見つかりませんでした。したがって、誰かがRESTに言及するときは、アーキテクチャの原則ではなく、Webサービスを指すと言っても安全です。
dtoux

1

RESTとJSON-RPCの間でJSON-RPCを選択して、理解しやすいWebアプリケーション用のAPIを開発することをお勧めします。メソッド呼び出しと通信へのマッピングが簡単に理解できるため、JSON-RPCが推奨されます。

最も適切なアプローチの選択は、制約または主な目的に依存します。たとえば、パフォーマンスが主要な特性である限り、JSON-RPC(たとえば、ハイパフォーマンスコンピューティング)を使用することをお勧めします。ただし、主な目的が、他の人に推論される汎用インターフェースを提供するために不可知論であることである場合は、RESTに進むことをお勧めします。両方の目標を達成する必要がある場合は、両方のプロトコルを含めることをお勧めします。

RESTをJSON-RPCから実際に分割するという事実は、慎重に検討された一連の制約を追跡し、アーキテクチャの柔軟性を確認することです。制約は、クライアントとサーバーが互いに独立して成長できること(クライアントのアプリケーションに影響を与えずに変更を加えることができること)、呼び出しがステートレス(状態がハイパーメディアと見なされる)、均一であることを保証することを必要としますインタラクションのためのインターフェースが提供され、APIは階層化システムで拡張されます(Hall、2010)。JSON-RPCは迅速かつ簡単に使用できますが、前述のように、リソースとパラメーターは密結合されており、GET / POSTを使用して動詞(api / addUser、api / deleteUser)に依存する可能性が高く、RESTは疎結合リソース(api / users)HTTPで。REST APIは、GET、PUT、POST、DELETE、PATCHなどのいくつかのHTTPメソッドに依存しています。

JSON(JavaScript Object Notationと表記)は軽量のデータ交換フォーマットであり、人間は読み書きが簡単です。マシンが解析して生成するのは手間がかかりません。JSONは完全に言語に依存しないテキスト形式ですが、C#、C、C ++、Java、Perl、JavaScript、Python、その他多数の言語で構成される言語ファミリのプログラマーが知っている慣習を実践しています。このようなプロパティにより、JSONは完全なデータ交換言語になり、選択するのに適しています。


「マシンが解析するのは手間がかからない」-多くの壊れたJSON(ペイロードのエスケープされていない引用符など)を見てきました
alancalvitti

1

間違った質問:存在しないマニシャンを課します!

JSON-RPCを「動詞なし」(メソッドなし)で使用し、sendo ID、パラメーター、エラーコード、警告メッセージに必要な最小限の標準化を維持できます。JSON-RPC標準は、「RESTになることはできません」とは言わず、基本的な情報をパックする方法のみを述べています。

「REST JSON-RPC」が存在します!最小限の情報パッキングのための「ベストプラクティス」を備えたRESTであり、シンプルで強固なコントラクトを備えています。


この回答と教訓的な文脈から)

RESTを扱う場合、通常はリソースの観点から考えることから始めるのが役立ちます。この場合、リソースは単に「銀行口座」ではなく、その銀行口座のトランザクションです...しかし、JSON-RPCは「メソッド」パラメーターを義務付けず、すべてエンドポイントの「パス」によってエンコードされます。

  • REST 預金POST /Bank/Account/John/TransactionJSON要求に{"jsonrpc": "2.0", "id": 12, "params": {"currency":"USD","amount":10}}
    JSON応答は次のようになります{"jsonrpc": "2.0", "result": "sucess", "id": 12}

  • REST Withdraw with POST /Bank/Account/John/Transaction...も同様です。

  • ... GET /Bank/Account/John/Transaction/12345@13...これは、その正確なトランザクションのJSONレコードを返す可能性があります(たとえば、ユーザーは通常、口座の借方と貸方のレコードを必要とします)。のようなもの{"jsonrpc": "2.0", "result": {"debits":[...],"credits":[...]}, "id": 13}。(REST)GETリクエストに関する規則には、「@ id」によるIDのエンコードを含めることができるため、JSONを送信する必要はありませんが、応答パックでJSON-RPCを使用します。



0

リソースをリクエストする場合、RESTful APIは設計上優れています。単純なCRUD以外の多くのパラメーターと複雑なメソッドを使用して複雑なデータを要求する場合、RPCが適切な方法です。


これは、トピックの非常に大きな単純化です。具体的には、なぜ「Better by Design」なのですか?JSON-RPCは、必要に応じて単純でも複雑でもかまいません。そのため、「多くのパラメーターと複雑なメソッド」に対して「優れている」という主張も誤りです。この点では、良くも悪くもありません
Belfordz

RPCがJSONを使用しているか、protobufを使用しているか、XMLを使用しているかは関係ありません。私が言ったようにキーポイントはAPIです。すべてのケースで一方が他方より優れているという意味ではありません。ただし、2つの実装のどちらかを選択する場合は、パラメーターとメソッドが重要だと思います。それらが単純であれば、RESTful APIはほとんどのプログラマーによく理解されており、httpリクエストを簡単に作成できます。それらが複雑である場合、RPCはそのようなAPIを表現する能力が高く、IDEとコンパイラーがそれを支援します。
Adrian Liu

-1

RPCプロトコルにvdataを使用します:http ://vdata.dekuan.org/

1、PHPとJavaScriptはどちらも問題ありません。2、クロスオリジンリソースシェアリング(CORS)コールはまだ大丈夫です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.