[解決済み] SOAPとRESTの比較(相違点)
質問
Webサービスの通信プロトコルとして、SOAPとRESTの違いについての記事を読みましたが、SOAPに対するRESTの最大のメリットは何だと思いますか。
-
RESTはよりダイナミックで、UDDI(Universal Description, Discovery, and Integration)の作成と更新は必要ありません。
-
RESTはXML形式のみに限定されるものではありません。RESTfulなウェブサービスは、プレーンテキスト/JSON/XMLを送信することができます。
しかし、SOAPの方がより標準化されています(例:セキュリティ)。
ということで、これらの点は正しいのでしょうか?
解決方法は?
残念ながら、RESTの周辺には、誤った情報や誤解が多く存在します。ご質問の内容だけでなく cmdの回答 Stack Overflowにあるこのテーマに関する質問と回答のほとんどが、それを反映しています。
SOAPとRESTは直接比較することはできません。前者はプロトコルであり(少なくともそうであろうとしている)、後者はアーキテクチャのスタイルだからです。SOAPでないHTTP APIをRESTと呼ぶ傾向があるので、これが混乱の原因の1つでしょう。
SOAPとRESTの主な違いは、クライアントとサーバーの実装がどの程度結合しているかです。SOAPクライアントは、カスタムデスクトップアプリケーションのように動作し、サーバーと緊密に結合しています。クライアントとサーバーの間には厳格な契約があり、どちらかが何かを変更すると、すべてが壊れることが予想されます。変更後は常に更新が必要ですが、契約が守られているかどうかを確認するのは簡単です。
RESTクライアントは、どちらかというとブラウザに近いものです。プロトコルと標準化されたメソッドの使い方を知っている汎用的なクライアントで、アプリケーションはその中に収まるようにしなければなりません。余分なメソッドを作成してプロトコル標準に違反するのではなく、標準的なメソッドを活用して、メディアタイプに応じたアクションを作成するのです。正しく行われれば、カップリングは少なくなり、変更にもより優雅に対応できるようになります。クライアントは、エントリーポイントとメディアタイプを除いて、APIについて全く知らない状態でRESTサービスに入ることが想定されている。SOAPでは、クライアントは使用するものすべてについて事前の知識が必要で、さもなければ対話を開始することさえできない。さらに、RESTクライアントは、サーバー自体から提供されるコードオンデマンドによって拡張することができます。典型的な例は、クライアント側で別のサービスとの対話を推進するために使用されるJavaScriptコードです。
以上が、RESTがどういうものか、SOAPとどう違うのかを理解するための重要なポイントだと思います。
-
RESTはプロトコルに依存しない。HTTPと連動しているわけではありません。ウェブサイト上のftpリンクをたどれるのと同じように、RESTアプリケーションは標準化されたURIスキームがあれば、どんなプロトコルでも使うことができるのです。
-
RESTは、CRUDをHTTPメソッドにマッピングしたものではありません。読む これ の回答で詳しく説明しています。
-
RESTは使っているパーツと同じように標準化されています。HTTPのセキュリティと認証は標準化されているので、HTTPでRESTを行う場合はそれを使うことになります。
-
がなければRESTはRESTではありません。 ハイパーメディア と HATEOAS . つまり、クライアントはエントリーポイントのURIしか知らず、リソースはクライアントがたどるべきリンクを返すことになっているのです。REST APIでできることすべてにURIパターンを与えるような空想的なドキュメントジェネレータは、完全にポイントを外している。彼らは標準に従うはずのものを文書化しているだけでなく、そうすると、クライアントをAPIの進化のある特定の瞬間に結びつけていることになり、API上のどんな変更も文書化し適用しなければならず、さもなければ壊れてしまうのである。
-
RESTは、Webのアーキテクチャスタイルそのものです。Stack Overflowに入ると、ユーザー、質問、回答が何であるか、メディアの種類がわかり、ウェブサイトはそれらへのリンクを提供します。REST APIは同じことをしなければならない。もし私たちがRESTを行うべきだと考える方法でウェブをデザインした場合、QuestionとAnswerへのリンクを持つホームページを持つ代わりに、質問を見るためにURIを取る必要があることを説明する静的なドキュメントを持っているでしょう
stackoverflow.com/questions/<id>
のように、idをQuestion.idに置き換えて、ブラウザに貼り付けてください。ナンセンスですが、多くの人がRESTをそう思っているのです。
この最後のポイントは、いくら強調してもしきれません。クライアントがドキュメントのテンプレートからURIを構築し、リソース表現にリンクを得られないのであれば、それはRESTではありません。RESTの作者であるRoy Fieldingは、このブログ記事でそれを明言しています。 REST APIはハイパーテキスト駆動型でなければならない .
以上のことから、RESTはXMLに限定されないかもしれませんが、他のフォーマットで正しく行うには、リンクのための何らかのフォーマットを設計し、標準化する必要があることに気づかれるでしょう。ハイパーリンクはXMLでは標準的ですが、JSONではそうではありません。JSONには、次のような標準の草案があります。 HAL .
最後に、RESTは万人向けではありません。その証拠に、ほとんどの人がRESTと間違えて呼んだHTTP APIで非常にうまく問題を解決し、それ以上の冒険をすることはないでしょう。RESTは時々、特に最初のうちは難しいですが、サーバー側の進化が容易になり、クライアントの変化への耐性が高まることで、時間をかけて報われるのです。もし、何かを素早く簡単に行う必要があるのなら、RESTを正しく理解することに頭を悩ませる必要はないでしょう。おそらく、あなたが求めているものはそれではないでしょう。何年も、あるいは何十年もオンラインでなければならないものが必要な場合は、RESTが適しています。
関連
-
[解決済み] ActionScript 3 で SOAP ウェブサービスに "Null" (本当の苗字!) を渡す方法
-
[解決済み] 検証失敗または重複が無効な場合のREST HTTPステータスコード
-
[解決済み] RESTを理解する。動詞、エラーコード、認証
-
[解決済み] URLクエリパラメータを含むHTTP POST -- 良いアイデアかどうか?
-
[解決済み] 検索のためのRESTfulなURL設計
-
[解決済み] WCFサービスのREST / SOAPエンドポイント
-
[解決済み】REST APIでのPUTメソッドとPATCHメソッドの使い分け 実生活でのシナリオ
-
[解決済み] オブジェクト内のアイテムの合計数を返すための最良のRESTfulメソッドは何ですか?
-
[解決済み] RESTfulな方法でリソースのサーバーサイドメソッドを呼び出す
-
[解決済み] NetflixやTwitterのようなWebサービスにはRESTとSOAPのどちらを使うべきか?[クローズド]
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] RESTとRPCのWebサービスの違い
-
[解決済み] HTTP GET(リクエストボディ付き
-
[解決済み] API のバージョン管理に関するベストプラクティス?[クローズド]
-
[解決済み] RESTアプリケーションはステートレスであることが前提である場合、セッションはどのように管理するのですか?
-
[解決済み】JavaでSOAPとRESTfulなWebサービスの主な違い【重複あり
-
[解決済み] REST API 認証
-
[解決済み] リソースとエンドポイントの違いは何ですか?
-
[解決済み] RESTのPUT/POST/DELETEコールは、規約によって何を返すべきですか?
-
[解決済み] RESTを使った複数レコードの削除
-
[解決済み] HATEOAS(REST-architecture)の実例集 [終了しました]。