SOAP - "シンプルオブジェクトアクセスプロトコル"
SOAPは、インターネットを介してメッセージまたは少量の情報を転送する方法です。 SOAPメッセージはXMLでフォーマットされており、通常はHTTP(ハイパーテキスト転送プロトコル)を使用して送信されます。
休息 - 代表状態転送
Restは、クライアントとサーバー間でデータを送受信するための簡単な方法であり、あまり多くの標準が定義されていません。データをJSON、XML、またはプレーンテキストとして送受信できます。 SOAPと比べて軽量です。
両方の方法は、大規模なプレーヤーの多くで使用されています。それは好みの問題です。私の好みはRESTです。使用と理解が簡単だからです。
Simple Object Access Protocol(SOAP):
Representational State Transfer(REST):
GoogleのREST vs SOAPでの無限の議論 があります。
私のお気に入りはこれです 。更新2013年11月27日:Paul Prescodのサイトはオフラインになったようで、この記事は利用できなくなりましたが、コピーは Wayback Machine またはPDFで入手できます- CiteSeerX 。
REST
RESTの主なアイデアは非常にシンプルだと理解しています。私たちは何年もウェブブラウザを使ってきましたが、ウェブサイトがどれほど簡単で、柔軟性があり、パフォーマンスが良いかを見てきました。 HTMLサイトは、ユーザーとの対話の主要な手段としてハイパーリンクとフォームを使用します。彼らの主な目標は、クライアントが、現在の状態で使用できるリンクのみを知ることです。 RESTは単に、「アプリケーションを介して人間のクライアントではなく、同じ原理を使用してコンピューターを駆動しないのはなぜですか」と言います。これをWWWインフラストラクチャのパワーと組み合わせると、優れた分散アプリケーションを構築するためのキラーツールが得られます。
別の考えられる説明は、数学的に考える人々に対するものです。各アプリケーションは基本的に、状態遷移であるビジネスロジックアクションを持つ状態マシンです。 RESTの考え方は、各遷移をリソースへのリクエストにマッピングし、現在の状態で利用可能な遷移を表すリンクをクライアントに提供することです。したがって、表現とリンクを介してステートマシンをモデル化します。これが、REpresentational State Transferと呼ばれる理由です。
すべての回答がメッセージ形式またはHTTP動詞の使用に焦点を当てているように見えることは非常に驚くべきことです。実際、メッセージの形式はまったく関係ありません。RESTは、サービス開発者が文書化する限り、どの形式でも使用できます。 HTTP動詞は、サービスをCRUDサービスにするだけで、まだRESTfulではありません。サービスを実際にRESTサービスに変えるのは、データとともにサーバー応答に埋め込まれたハイパーリンク(別名ハイパーメディアコントロール)であり、その量はクライアントがそれらのリンクから次のアクションを選択するのに十分でなければなりません。
残念ながら、 Roy Fieldingの論文 を除いて、Web上のRESTで正しい情報を見つけるのはかなり困難です。 (彼はRESTを派生させた人です)。 SOAPからRESTへの発展方法に関する包括的なステップバイステップのチュートリアルを提供するため、 'REST in Practice'本 をお勧めします。
SOAP
これは、RPC(リモートプロシージャコール)アーキテクチャスタイルの可能な形式の1つです。本質的には、クライアントがローカルメソッドを呼び出しているかのように、サービス境界(ネットワーク、プロセスなど)を介してサーバーのメソッドを呼び出すことを可能にするテクノロジーです。もちろん、実際にはローカルメソッドの呼び出しとは速度や信頼性などが異なりますが、アイデアは簡単です。
Compared
トランスポートプロトコル、メッセージ形式、xsd、wsdlなどの詳細は、任意の形式のRPCをRESTと比較するときに重要ではありません。主な違いは、RPCサービスは、RPC APIで独自のアプリケーションプロトコルを設計し、それだけが知っているセマンティクスで自転車を再発明することです。したがって、すべてのクライアントはサービスを使用する前にこのプロトコルを理解する必要があり、すべてのリクエストの独自のセマンティクスにより、キャッシュなどの汎用インフラストラクチャを構築することはできません。さらに、RPC APIは、現在の状態で許可されるアクションを提案していません。これは、追加のドキュメントから導出する必要があります。一方、RESTは、統一されたインターフェイスを使用して、さまざまなクライアントがAPIセマンティクスを理解し、ハイパーメディアコントロール(リンク)が各状態で使用可能なオプションを強調表示することを意味します。したがって、応答をキャッシュしてサービスを拡張し、追加のドキュメントなしで正しいAPI使用を簡単に発見できるようにします。
ある意味では、SOAP(他のRPCと同様)は、接続メディアをメッセージのみを送信できるブラックボックスとして扱うサービス境界をトンネリングする試みです。 RESTは、Webが巨大な分散情報システムであることを認め、世界をそのまま受け入れ、それと戦うのではなくマスターすることを学ぶという決定です。
SOAPは、サーバーとクライアントの両方を制御し、相互作用があまり複雑ではない場合、内部ネットワークAPIに最適のようです。開発者が使用する方が自然です。ただし、多くの独立したパーティで使用されているパブリックAPIの場合、複雑で大きく、RESTはより適切です。しかし、この最後の比較は非常にあいまいです。
Update
私の経験では、RESTの開発はSOAPよりも難しいことが予想外に示されました。少なくとも.NETの場合。 ASP.NET Web APIのような優れたフレームワークがありますが、クライアント側プロキシを自動的に生成するツールはありません。 「Webサービス参照の追加」や「WCFサービス参照の追加」のようなものはありません。すべてのシリアル化およびサービスクエリコードを手動で記述する必要があります。そして、男、それは定型的なコードの多くです。 RESTの開発には、各開発プラットフォームのWSDLおよびツールの実装に類似したものが必要だと思います。実際、 WADL または WSDL 2.0 という良い根拠があるようですが、どちらの標準も十分にサポートされていないようです。
更新(2016年1月)
現在、REST API定義用の 幅広い種類のツール があります。私の個人的な好みは現在 RAML です。
Webサービスの仕組み
それは、特定のWebサービスで使用されるアーキテクチャとテクノロジーに依存するため、これはあまりにも広範な質問です。しかし、一般に、Webサービスは、クライアントからの要求を受け入れて応答を返すことができるWebの単なるアプリケーションです。 Webに公開されているため、webサービスであり、通常は年中無休で利用できるため、serviceです。もちろん、クライアントのいくつかの問題(そうでなければ、誰かがWebサービスを使用する理由)を解決します。
これが最も簡単な説明です。
この記事は夫に妻の物語を連れて行きます、そこで夫は純粋な素人の言葉でRESTについて彼の妻に説明します。必読!
私の妻への安らぎの説明 (元のリンク)
私の妻への安らぎの仕方 (2013-07-19ワーキングリンク)
SOAP-シンプルオブジェクトアクセスプロトコルはプロトコルです!
REST-REpresentational State Transferはアーキテクチャスタイルです!
SOAP
は、通常HTTP経由でメッセージを転送するために使用されるXMLプロトコルです
REST
とSOAP
は、ほぼ間違いなくnot相互に排他的です。 RESTfulアーキテクチャは、HTTP
またはSOAP
またはその他の通信プロトコルを使用する場合があります。 REST
はWeb用に最適化されているため、HTTP
が最適です。 HTTP
は、Roy Fieldingの論文で説明されているonlyプロトコルでもあります。
RESTとSOAPは明らかに大きく異なりますが、この質問は、REST
とHTTP
がタンデムでよく使用されるという事実を明らかにしています。これは主に、HTTPの単純さと、RESTful原則への非常に自然なマッピングによるものです。
クライアントサーバー通信
クライアント/サーバーアーキテクチャでは、懸念事項が非常に明確に分離されています。 RESTfulスタイルで構築されたすべてのアプリケーションは、原則としてクライアントサーバーでもある必要があります。
ステートレス
サーバーへの各クライアント要求では、その状態が完全に表現されている必要があります。サーバーは、サーバーコンテキストまたはサーバーセッション状態を使用せずに、クライアント要求を完全に理解できる必要があります。したがって、すべての状態をクライアントで保持する必要があります。ステートレス表現については、後で詳しく説明します。
キャッシュ可能
キャッシュ制約を使用すると、応答データをキャッシュ可能またはキャッシュ不可としてマークできます。キャッシュ可能としてマークされたデータは、同じ後続リクエストへの応答として再利用できます。
niform Interface
すべてのコンポーネントは、単一の統一されたインターフェイスを介して対話する必要があります。すべてのコンポーネントの対話はこのインターフェイスを介して行われるため、異なるサービスとの対話は非常に簡単です。インターフェイスは同じです!これは、実装の変更を単独で行えることも意味します。均一なインターフェースは常に変更されないため、このような変更は基本的なコンポーネントの相互作用には影響しません。欠点の1つは、インターフェイスにこだわることです。インターフェイスを変更することで特定のサービスに最適化を提供できる場合、RESTがこれを禁止しているため、運が悪いです。ただし、明るい面では、RESTはWeb用に最適化されているため、HTTPを介したRESTの人気が非常に高くなっています。
上記の概念は、RESTの特性の定義を表し、RESTアーキテクチャをWebサービスなどの他のアーキテクチャと区別します。 RESTサービスはWebサービスですが、Webサービスは必ずしもRESTサービスであるとは限らないことに注意してください。
RESTおよび上記の箇条書きの詳細については、このブログを参照してください post on REST Design Principals.
Brian R. Bondyの回答が好きです。私はちょうどWikipediaが _ rest _ の明確な説明を提供することを付け加えたいと思いました。記事はそれをSOAPと区別します。
RESTは、可能な限り簡単に行われる状態情報の交換です。
SOAPはXMLを使用するメッセージプロトコルです。
多くの人がSOAPからRESTに移動した主な理由の1つは、SOAPベースのWebサービスに関連付けられているWS- *(WS splatと呼ばれる)標準です。非常に複雑です。仕様の一覧については wikipedia を参照してください。これらの各仕様は非常に複雑です。
編集:何らかの理由でリンクが正しく表示されません。 REST = http://en.wikipedia.org/wiki/REST
WS- * = http://en.wikipedia.org/wiki/WS- *
SOAP webservicesとREST webservicesの両方とも、HTTPプロトコルとその他のプロトコルを使用することができます(SOAPはRESTの基礎となるプロトコルになります)。 HTTPプロトコル関連のSOAPとRESTについてのみ説明します。これが最も頻繁に使用されるためです。
SOAP ( "単純な"オブジェクトアクセスプロトコル)はプロトコルです(そして W3C標準 )。 SOAPメッセージを作成、送信、および処理する方法を定義します。
SOAPメッセージは、特定の構造を持つXML文書です。ヘッダーと本体セクションを含むエンベロープが含まれています。本文には実際に送信したいデータがXML形式で含まれています。 2つのエンコーディングスタイル がありますが、 通常はリテラルを選択します 、つまりアプリケーションまたはそのSOAPドライバがXMLのシリアル化とデータのシリアル化解除を行います。
SOAPメッセージは、SOAP + XML MIMEサブタイプを持つHTTPメッセージとして送信されます。これらのHTTPメッセージはマルチパートになる可能性があるので、オプションでSOAPメッセージにファイルを添付することができます。
明らかに我々はクライアント - サーバアーキテクチャを使用しているので、SOAPクライアントはSOAP websericesにリクエストを送り、サービスはレスポンスをクライアントに送り返します。ほとんどのWebサービスはWSDLファイルを使用してサービスを記述します。 WSDLファイルには、送信したいデータのXMLスキーマ(以降XSD)と、WebサービスをHTTPプロトコルにバインドする方法を定義するWSDLバインディングが含まれています。 2つのバインディングスタイル :RPCとdocumentがあります。 RPCスタイルのバインディングにより、SOAP本体には、パラメータ(HTTP要求)または戻り値(HTTP応答)を含むオペレーション呼び出しの表現が含まれています。パラメータと戻り値はXSDに対して検証されます。ドキュメントスタイルのバインディングにより、SOAP本体にはXSDに対して検証されたXMLドキュメントが含まれます。ドキュメントのバインディングスタイルはイベントベースのシステムに適していると思いますが、そのバインディングスタイルは使用しませんでした。 RPCバインディングスタイルはより普及しているため、ほとんどの人は分散アプリケーションによるXML/RPC目的でSOAPを使用します。 Webサービスは通常 UDDI サーバーに問い合わせることでお互いを見つけます。 UDDIサーバーは、Webサービスの場所を格納するレジストリです。
だから - 私の意見では - 最も普及しているSOAP webサービスはRPCバインディングスタイルとリテラルエンコーディングスタイルを使用していて、それは以下の特性を持っています:
REST(Representational State Transfer)はRoy Fieldingの 論文 で説明されているアーキテクチャースタイルです。 SOAPのようなプロトコルについては関係ありません。それは制約のないnullアーキテクチャスタイルで始まり、RESTアーキテクチャの制約を一つずつ定義します。すべてのREST制約を満たすWebサービスにはRESTfulという用語を使用しますが、Roy Fieldingによれば、 REST levels などはありません。 WebサービスがすべてのREST制約と一致しない場合は、REST Webサービスではありません
均一なインターフェース
https://example.com/api/v1/users?offset=50&count=25
のようなURLを使用したページ付けによって頻繁に利用されます。 URLにはいくつかの specification があります。たとえば、パスが同じでクエリの種類が異なる場合や、パス部分にURLの階層データを含み、クエリ部分に非階層データを含む場合などです。これらはRESTによってURLを作成する方法の基本です。ところで。 URL構造はサービス開発者だけに関係します、本当のRESTクライアントはそれに関係がありません。もう1つのよくある質問はAPIのバージョン管理です。これは簡単なものです。意味が変わった場合は、新しいバージョン番号を追加できます。古典的な 3 number versioning を使用して、メジャー番号だけをURLに追加することができます(https://example.com/api/v1/
)。そのため、下位互換性のある変更では何も起こりません。下位互換性のない変更では、新しいAPIルートhttps://example.com/api/v2/
を持つ下位互換性のないセマンティクスが得られます。古いクライアントはhttps://example.com/api/v1/
を古い意味で使うことができるので、古いクライアントは壊れません。PATCH https://example.com/api/v1/users/1 {name: "Mrs Smith"}
が目的のリソース状態のJSON表現である{name: "Mrs Smith"}
要求を送信できます。つまり、新しい名前です。これは逆にも起こり、サービスはクライアントの状態を変更するためにリソースの表現をクライアントに送信します。たとえば、新しい名前を読みたい場合は、GET https://example.com/api/v1/users/1?fields="name"
検索要求を送信すると、200 ok, {name: "Mrs Smith"}
応答が返されます。したがって、この表現を使用してクライアントの状態を変更できます。たとえば、「Welcome to our page Mrs Smith!」というメッセージを表示できます。メッセージ。リソース識別子(URL)またはリクエストと共に送信したaccept
ヘッダーに応じて、リソースは多くの表現を持つことができます。例えばimage/jpeg
が要求されれば私達は夫人スミス(おそらく裸ではない)の画像を送ることができます。アプリケーション状態のエンジンとしてのハイパーメディア(以下HATEOAS) - ハイパーメディアはハイパーリンクを含むことができるメディアタイプです。 Webでは、URLをアドレスバーに入力するのではなく、目標を達成するためにハイパーメディア形式(通常はHTML)で記述されたリンクをたどります。 RESTは同じ概念に従い、サービスによって送信される表現にはハイパーリンクを含めることができます。これらのハイパーリンクを使用してサービスにリクエストを送信します。その応答によって、新しいクライアント状態を構築するために使用できるデータ(そしておそらくより多くのリンク)を取得します。それで、ハイパーメディアがアプリケーション状態(クライアント状態)のエンジンとなるのはそのためです。クライアントはどのようにしてハイパーリンクを認識し、それに従うのでしょうか。人間によってそれは非常に簡単です、私達はリンクのタイトルを読み、多分入力フィールドを埋め、そしてその後ただワンクリックするだけです。マシンによっては、RDF( JSON-LD with Hydra )またはハイパーメディア特有の解決策(例えば IANA))を使用してリンクに意味を追加する必要があります。リンク関係 および ベンダー固有のMIMEタイプ by HAL + JSON )。機械読み取り可能な XML と JSONハイパーメディアフォーマット がいくつかありますが、それらのほんの一部にすぎません。
時にはそれを選択するのは難しいです...
そのため、REST WebサービスはSOAP Webサービスとは大きく異なります(RPCバインディングスタイルとリテラルエンコーディングスタイル)。
等々...
SOAP RPC Webサービスは、すべてのREST制約を満たしません。
それでは、2番目の質問から始めましょう:Webサービスとは何ですか?、明らかな理由で。
WebServicesは本質的に特定の機能やデータを公開するロジック(あなたは漠然とメソッドと呼ぶかもしれません)の部分です。実装するクライアント(技術的に言うと、消費はWordです)は、methodが受け付けるパラメータと、そのデータのタイプを知っている必要があります(もしそうであれば)戻る。
次のLinkは、 _ rest _ & _ soap _ について非常に明快な意味でそれをすべて言っています。
また、何を選択するか(RESTまたはSOAP)を知りたい場合は、それを通過するすべての理由があります。
SOAPとRESTはどちらも、異なるシステムが互いに通信する方法を表します。
RESTは、ブラウザがWebサーバーとやり取りする通信に似た技術を使用してこれを行います。GETを使用してWebページを要求したり、フォームフィールドにPOSTを送信したりするなどです。
SOAPは似たようなものを提供しますが、XMLのブロックをやり取りすることですべてを行います。 SOAPのもう1つの重要な構成要素は、どの関数とデータ要素がサポートされているかを記述するXMLドキュメントであるWSDLです。 WSDLを使用して、プログラム的にどの機能がサポートされているかを発見したり、プログラミングコードスタブを生成したりできます。
RESTは、ネットワークアプリケーションを設計するためのアーキテクチャスタイルです。考え方は、CORBA、RPC、SOAPなどの複雑なメカニズムを使用してマシン間を接続するのではなく、単純なHTTPを使用してマシン間で呼び出しを行うことです。
これは私が説明できるのと同じくらい簡単だと思います。どうぞ、誰でも私を直すか、これに加えて大歓迎です。
SOAPは、情報/データを交換するために(インターネットを介して)切断されたシステムによって使用されるメッセージフォーマットである。 XMLメッセージがやり取りされるのと同じです。
WebサービスはSOAPメッセージを送受信します。彼らは彼らがどの言語で書かれているかによって動作が異なります。
SOAPの問題は、HTTPスタックの背後にある理想と矛盾することです。どんなミドルウェアでもリクエストやレスポンスの内容を理解しなくてもHTTPリクエストを扱うことができるはずですが、例えば通常のHTTPキャッシュサーバはSOAPのどの部分だけを知らずにSOAPリクエストを扱うことはできません。 ]キャッシングのための内容の問題。 SOAPはプロキシのようにHTTPをそれ自身の通信プロトコルのラッパーとして使うだけです。
SOAP - "シンプルオブジェクトアクセスプロトコル"
SOAP インターネット上でのメッセージの転送、または少量の情報のわずかなものです。 SOAP メッセージのフォーマットは XML そして一般的に制御されて送信されます HTTP。
REST - "代表的な状態転送"
REST これは、ファンとサーバー間の不測の事態や情報の受信に関する初歩的な手続きであり、明確に定義された多くの標準がありません。として情報を送信して受け入れることができます JSON、 XML あるいはプレーンテキストさえ。に比べて軽量です SOAP。