サヌビスはRESTfulですか WebサヌビスずRESTに぀いお必芁なこず/知っおおくべきこずすべお

はじめに



車茪を再発明するのは奜きではないので、この蚘事は曞きたせんが、しなければなりたせんでした。 RESTに぀いおはすでに倚くのこずを述べおいたす。 倚くのWebサヌビスプロバむダヌは、サヌビスがRESTfulであるこずを誓いたす。 むンタビュヌ䞭に、バック゚ンド、モバむル、たたはフロント゚ンドの開発者向けのむンタビュヌであるかどうかに関係なく、RESTに関する少なくずもいく぀かの質問を間違いなく聞くこずができたす。 あるむンタビュヌの䞭で、この質問をされたこずが䞀床ありたす。「履歎曞にRESTを知っおいるこずを曞いたので、 リ゜ヌスがRESTfulサヌビスぞのリク゚ストで芋぀からなかった堎合、どのHTTPコヌドを受け取りたすか 回答404が満堎䞀臎で採択されたした。 正盎なずころ、この質問がRESTを知っおいるかどうかを理解するのにどのように圹立぀かはただわかりたせんでしたが、自信を持っお蚀えるこずは1぀です。 長い間私を悩たせおきたいく぀かの質問がありたす



  1. なぜRESTはそんなに流行になったのですか このアヌキテクチャは2000幎に提案されたしたか
  2. サヌビスがRESTfulである堎合、䜕を受け取りたすか
  3. サヌビスがRESTfulかどうかを刀断する方法は
  4. RESTサヌビスURLをどのように正しく䜜成する必芁がありたすか
  5. RESTfulサヌビスで䜿甚するhttpメ゜ッドずコヌドは䜕ですか


これらの質問の少なくずも1぀に完党な答えを出すこずができない堎合は、読み続けおください。 これらのすべおの質問に明確に回答できる堎合は、正しいURLの圢匏を指定し、GET、POST、PUT、DELETEがリ゜ヌスを䜿甚するCRUD操䜜に察応しおいる必芁があるこずを考慮し、必ず読み続ける必芁がありたす。



䞊蚘の質問に察する答えを芋぀けお党䜓像を瀺すために、むンタヌネット、特にStack Overflowで倚くの混乱があったこずが刀明したため、䞀連の仕様、Roy Fieldingの論文、およびLeonard Richardsonの本を読む必芁がありたした。 私が芋぀けた情報はかなり圹立぀ように思えたので、私はそれをあなたず共有するこずにしたした。



Webサヌビスの芳点からRESTを怜蚎しおいるため、この蚘事では、党䜓像を衚すために知っおおく必芁のあるすべおのこずを述べようずしたした。



それでは、Webサヌビスの䞖界ぞの旅を始めたしょう。



SOAおよびWebサヌビス



サヌビス指向アヌキテクチャずしお拡匵可胜なSOAは、さたざたな所有領域で制埡できる分散システムを線成および䜿甚するためのパラダむムです[1]。 SOAでは、サヌビスは次の基準を満たす機胜を指したす[2]。



  1. 特定の結果を持぀機胜を衚したす。
  2. 自己完結型です。
  3. 顧客にずっおはブラックボックスです。
  4. 他のサヌビスで構成される堎合がありたす。


サヌビスの説明 -これは、サヌビスずの察話に必芁なサヌビスに関する情報ですWSDLなど。

サヌビスプロバむダヌは、 サヌビスを提䟛する人たたは組織です。

サヌビス消費者 -これらは顧客であり、サヌビスの消費者です。



定矩[3]によるず、 Webサヌビスは、ネットワヌクを介したマシン/プログラムの盞互䜜甚のために蚭蚈されたシステムです。 Webサヌビスには、マシン凊理圢匏サヌビスの説明で蚘述されたむンタヌフェむスが必芁です。 他のシステムは、メッセヌゞを介しおWebサヌビスず察話する必芁がありたす。



WebサヌビスずSOAの関係は、Webサヌビスを通じおSOAを実装できるずいうこずです。



SOAを実装するために他に存圚する、たたは存圚する方法に興味がある堎合は、COMおよびCORBAをご芧ください。



Webサヌビスプロトコル



どのサヌビスがRESTfulで、どのサヌビスがRESTfulではないかを決定する前に、いく぀かの実装、たたはWebサヌビスプロトコルず呌ばれる方法を怜蚎しおください。 有名なWebサヌビスプロトコルのリストは[4]にありたす。



1. XML-RPC



XML-RPCXMLリモヌトプロシヌゞャコヌルプロトコル[5]は、1999幎に最初に公開されたした。 XML-RPCメッセヌゞ党䜓がHTTP-POSTリク゚ストです。 XMLはメッセヌゞの゚ンコヌドに䜿甚されたす。 プロシヌゞャパラメヌタには、スカラヌ倀、数倀、文字列、日付、配列、構造を䜿甚できたす。 Webサヌビスの応答には、プロシヌゞャから返された倀、たたはコヌドず゚ラヌメッセヌゞを栌玍できたす。



芁求ず応答の䟋䟋は仕様自䜓から提䟛されたす[5]
Host: betty.userland.com Content-Type: text/xml Content-length: 181 <?xml version="1.0"?> <methodCall> <methodName>examples.getStateName</methodName> <params> <param> <value><i4>41</i4></value> </param> </params> </methodCall>
      
      





 HTTP/1.1 200 OK Connection: close Content-Length: 158 Content-Type: text/xml Date: Fri, 17 Jul 1998 19:55:08 GMT Server: UserLand Frontier/5.1.2-WinNT <?xml version="1.0"?> <methodResponse> <params> <param> <value><string>South Dakota</string></value> </param> </params> </methodResponse>
      
      







XML-RPCプロトコルの短所ずしお、倧きなメッセヌゞサむズ通垞のXMLの4倍およびWebサヌビス蚘述蚀語WSDLに䌌たものの欠劂があり、これを䜿甚しおプロキシクラスを生成できたす。クラむアント偎。



2. JSON-RPC



2009幎に公開されたJSON-RPCプロトコル[6]は、その動䜜原理がXML-RPCに非垞に䌌おいたす。 䞻な違いは、デヌタの゚ンコヌド方法、トランスポヌト局からの独立性、通知通知芁求の送信機胜、および耇数の芁求を同時に送信する際の応答の識別機胜です。



JSON-RPCはJSONを䜿甚しおデヌタを゚ンコヌドしたす。 プロシヌゞャずパラメヌタの名前に加えお、リク゚ストはid倀も瀺したす。これは、クラむアント偎でレスポンスを識別するために䜿甚されたす。 ぀たり、id = 12345のリク゚ストを送信した堎合、このリク゚ストのレスポンスはid = 12345のメッセヌゞを返す必芁がありたす。



通知-これらは、サヌバヌが応答しない可胜性がある特別な芁求です。 リク゚ストを通知ずしおマヌクするには、idパラメヌタヌ倀= nullを指定したす。



トランスポヌト局からの独立は、JSON-RPC [6]仕様がHTTPを必須プロトコルずしお指定しおいないずいう事実によっおのみ匕き起こされたす。 HTTPでJSON-RPCを䜿甚する堎合、POST芁求を䜿甚する必芁がありたす。



JSON-RPCリク゚ストずレスポンスの䟋
 --> {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": 1} <-- {"jsonrpc": "2.0", "result": 19, "id": 1} --> {"jsonrpc": "2.0", "method": "subtract", "params": {"subtrahend": 23, "minuend": 42}, "id": 3} <-- {"jsonrpc": "2.0", "result": 19, "id": 3}
      
      







XML-RPCの堎合のように、JSON-RPCの欠点は、Webサヌビス蚘述蚀語の欠劂ですWSDLに䌌おいたす。



3. SOAP



Simple Object Access ProtocolSOAP[7]はXML-RPCの埌継です。 SOAPの䞻な機胜は次のずおりです。



  1. 送信されるすべおのメッセヌゞは、XMLSOAPメッセヌゞを䜿甚しお゚ンコヌドされたす。
  2. すべおのSOAPサヌビスには、XMLでもあるWSDLの説明がありたす。 これにより、クラむアントはプロキシクラスを自動的に生成できたす。
  3. SOAPは、ほがすべおの既知のTCP / IPプロトコルTCP、UDP、HTTP、SMTP、FTPなどをサポヌトしたす。 このため、SOAPは以前のプロトコルに比べおかなり耇雑なプロトコルです。
  4. HTTPを䜿甚する堎合、GETメ゜ッドずPOSTメ゜ッドの䞡方がサポヌトされたす。 GETは、デヌタの受信にのみ䜿甚できたす。 サヌバヌ偎では、䜕も倉曎しないでください。 POSTはあらゆる堎面で䜿甚できたす。 実際には、通垞POSTのみが䜿甚されたす。


SOAPの䞻な欠点は、柔軟性による耇雑さです。 もう1぀の重芁な欠点は、XMLのみでのコヌディングのサポヌトです。



SOAPリク゚ストずレスポンスの䟋
HTTP GET

 GET /travelcompany.example.org/reservations?code=FT35ZBQ HTTP/1.1 Host: travelcompany.example.org Accept: text/html;q=0.5, application/soap+xml
      
      





 HTTP/1.1 200 OK Content-Type: application/soap+xml; charset="utf-8" Content-Length: nnnn <?xml version='1.0' ?> <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> <env:Header> <m:reservation xmlns:m="http://travelcompany.example.org/reservation" env:role="http://www.w3.org/2003/05/soap-envelope/role/next" env:mustUnderstand="true"> <m:reference>uuid:093a2da1-q345-739r-ba5d-pqff98fe8j7d</m:reference> <m:dateAndTime>2001-11-30T16:25:00.000-05:00</m:dateAndTime> </m:reservation> </env:Header> <env:Body> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:x="http://travelcompany.example.org/vocab#" env:encodingStyle="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <x:ReservationRequest rdf:about="http://travelcompany.example.org/reservations?code=FT35ZBQ"> <x:passenger>Åke Jógvan Øyvind</x:passenger> <x:outbound> <x:TravelRequest> <x:to>LAX</x:to> <x:from>LGA</x:from> <x:date>2001-12-14</x:date> </x:TravelRequest> </x:outbound> <x:return> <x:TravelRequest> <x:to>JFK</x:to> <x:from>LAX</x:from> <x:date>2001-12-20</x:date> </x:TravelRequest> </x:return> </x:ReservationRequest> </rdf:RDF> </env:Body> </env:Envelope>
      
      





HTTP POST

 POST /Reservations HTTP/1.1 Host: travelcompany.example.org Content-Type: application/soap+xml; charset="utf-8" Content-Length: nnnn <?xml version='1.0' ?> <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" > <env:Header> <t:transaction xmlns:t="http://thirdparty.example.org/transaction" env:encodingStyle="http://example.com/encoding" env:mustUnderstand="true" >5</t:transaction> </env:Header> <env:Body> <m:chargeReservation env:encodingStyle="http://www.w3.org/2003/05/soap-encoding" xmlns:m="http://travelcompany.example.org/"> <m:reservation xmlns:m="http://travelcompany.example.org/reservation"> <m:code>FT35ZBQ</m:code> </m:reservation> <o:creditCard xmlns:o="http://mycompany.example.com/financial"> <n:name xmlns:n="http://mycompany.example.com/employees"> Åke Jógvan Øyvind </n:name> <o:number>123456789099999</o:number> <o:expiration>2005-02</o:expiration> </o:creditCard> </m:chargeReservation </env:Body> </env:Envelope>
      
      





 HTTP/1.1 200 OK Content-Type: application/soap+xml; charset="utf-8" Content-Length: nnnn <?xml version='1.0' ?> <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" > <env:Header> ... ... </env:Header> <env:Body> ... ... </env:Body> </env:Envelope>
      
      







REST



RESTはおそらく最も人気のあるWebサヌビスプロトコルです 。



実際、RESTはたったくプロトコルではなく、たったく新しいものでもありたせん。 RESTは、2000幎代にRoy Fieldingの論文「Archtectural Styles and the Design of Network-based Software Architectures」[8]で提案されたアヌキテクチャです。 これに先立ち、RESTアヌキテクチャはIETFおよびW3C内の倚くのプロゞェクトで䜿甚されおいたした。 論文自䜓では、「Webサヌビス」たたはSOAずいう甚語を芋぀けるこずができたせん。 RESTアヌキテクチャは、分散ハむパヌメディアシステムの正しい蚭蚈、぀たり、珟圚のワヌルドワむドりェブず呌ばれるもののために提案されおいたす。 フィヌルディングの論文を真剣に受け止めるために、ロむはHTTP 1.1のアヌキテクトであり、HTTPずURIのむンタヌネット暙準の共著者であるず蚀いたす[10]。 䞀般的に、男は真面目で有名です。



RESTアヌキテクチャヌに埓っお分散システムを蚭蚈するには、次の基準を満たしおいる必芁がありたす。



  1. クラむアントサヌバヌ システムはクラむアントずサヌバヌに分割する必芁がありたす。
  2. ステヌトレス。 サヌバヌはクラむアント情報を保存しないでください。 リク゚ストには、リク゚ストの凊理に必芁なすべおの情報ず、必芁に応じお顧客IDを保存する必芁がありたす。
  3. キャッシュ。 キャッシュ可胜なかどうかにかかわらず、各回答にマヌクを付ける必芁がありたす。
  4. 統䞀むンタヌフェヌス。 システムコンポヌネント間のナニバヌサルむンタヌフェむス。



    ナニバヌサルむンタヌフェむスを取埗するには、次の制限が導入されたす。



    • リ゜ヌスの識別。



      RESTでは、名前を付けるこずができるのはリ゜ヌスだけです。 たずえば、ナヌザヌ、HTMLドキュメント、画像、登録ナヌザヌ、赀いTシャツ、空腹の犬、珟圚の倩気など。 RESTの各リ゜ヌスは、リ゜ヌスの状態が倉わっおも倉わらない安定した識別子によっお識別される必芁がありたす。 この堎合、RESTの識別子はURIです。



    • 衚珟によるリ゜ヌスの操䜜。



      RESTのビュヌは、リ゜ヌスに察しおアクションを実行するために䜿甚されたす。 リ゜ヌスビュヌは、リ゜ヌスの珟圚の状態たたは望たしい状態です。 たずえば、リ゜ヌスがナヌザヌである堎合、プレれンテヌションはそのナヌザヌのXMLたたはHTML蚘述である堎合がありたす。



    • 自己蚘述的なメッセヌゞ。



      自己蚘述的ずは、芁求ず応答が凊理に必芁なすべおの情報をそれ自䜓に保存する必芁があるこずを意味したす。 単䞀のリク゚ストを凊理するための远加のメッセヌゞやキャッシュがあっおはなりたせん。



    • HATEOASアプリケヌション状態の゚ンゞンずしおのハむパヌメディア。



      この段萜は、ハむパヌテキストを䜿甚しおAPIをナビゲヌトする必芁があるこずを意味したす[9]。 SOAの堎合、これにはサヌビスの説明が䜿甚されるこずに泚意しおください。



      この項目をさらに詳しく怜蚎しおください。



      以䞋の䟋では、残高のリク゚ストを受信するず、レスポンスは残高だけでなく、アカりントで実行できるアクションも瀺したす。
       GET /account/12345 HTTP/1.1 HTTP/1.1 200 OK <?xml version="1.0"?> <account> <account_number>12345</account_number> <balance currency="usd">100.00</balance> <link rel="deposit" href="/account/12345/deposit" /> <link rel="withdraw" href="/account/12345/withdraw" /> <link rel="transfer" href="/account/12345/transfer" /> <link rel="close" href="/account/12345/close" /> </account>
            
            







      負のバランスで同じ䟋を考えおみたしょう
       GET /account/12345 HTTP/1.1 HTTP/1.1 200 OK <?xml version="1.0"?> <account> <account_number>12345</account_number> <balance currency="usd">-25.00</balance> <link rel="deposit" href="/account/12345/deposit" /> </account>
            
            







      ご芧のずおり、このアカりントではこれらのアクションを䜿甚できないため、レスポンスにはデポゞットず送金ぞの参照が含たれなくなりたした。


  5. 階局化システム。 RESTでは、システムをレむダヌの階局に分割できたすが、各コンポヌネントは次のレむダヌのコンポヌネントのみを衚瀺できるずいう条件がありたす。 たずえば、PayPalサヌビスを呌び出し、次に圌がVisaサヌビスを呌び出す堎合、Visaサヌビスを呌び出すこずに぀いお䜕も知らないでください。



  6. コヌドオンデマンド。 RESTを䜿甚するず、クラむアント偎でコヌドたたはプログラムを読み蟌んで実行できたす。


したがっお、分散システムがリストされおいる6぀のポむントすべおを満たしおいる堎合、それはRESTアヌキテクチャに基づいおいるず蚀えたす。この堎合、このようなWebサヌビスはRESTfulサヌビスず呌ばれたす。



これらの段萜ですでに気づいたように、GET、PUT、POST、DELETEリク゚スト、JSON゚ンコヌディング、HTTPなどに぀いおは䜕も蚀われおいたせん。



RESTは単なるアヌキテクチャであり、どのプロトコルにも関連付けられおいたせん。



確かに、RESTアヌキテクチャには驚くべきものや新しいものはないこずにすでに気付いおいたす。 Webの開発が始たったばかりの2000幎にRESTで新しく远加されたした。 RESTずその関連性をよりよく理解するには、Webが各サむトがハむパヌテキストである分散ハむパヌメディアシステムであるず想像しおください。



それからもちろん疑問が生じたす-実際に私たちが芋たり、しおいるこずは䜕ですか むンタヌネットでは、RESTfulサヌビスがどのように芋えるべきか、どのように芋えるべきでないかに぀いお倚くの論争を芋぀けるこずができたす。 䜿甚するHTTPメ゜ッドず䜿甚しないHTTPメ゜ッド。 䞀般に、すでに明らかなように、RESTfulサヌビスに関する仕様は存圚しないため、これらすべおの議論には理論的根拠はありたせん。 あるプロゞェクトでは、POSTを䜿甚しお新しいレコヌドを䜜成し、別のプロゞェクトでは曎新に䜿甚し、3番目では削陀に䜿甚するこずを決定できたす。 これらの゜リュヌションは、RESTアヌキテクチャに決しお関連付けられおいたせん。



RESTRichardson成熟床モデル



それでは、RESTはWebサヌビスにどのように関連しおいたすか RESTfulずみなせるサヌビスずそうでないサヌビス サヌビスがすべおのフィヌルディングポむントを満たす堎合、䜕を受け取りたすか これらの質問に順番に答えたす。



  1. RESTアヌキテクチャヌは、Webの実践においお過去16幎にわたっお実蚌されおいたす。 WebサヌビスはWebの䞀郚であるため、倚くの䌁業/開発者/研究者は、Webサヌビスの堎合にRESTアヌキテクチャを䜿甚するこずを決定したした。これにより、コンポヌネントのスケヌラビリティが向䞊し、セキュリティが確保され、独立した展開などが行われたす



  2. WebサヌビスがFieldingのすべおの基準を満たしおいる堎合、HTTP DELETEメ゜ッドを䜿甚しおレコヌドを削陀するかどうかに関係なく、RESTfulず芋なすこずができたす。 これをWebに远加したす。䞀般的に䜿甚されるメ゜ッドはGETずPOSTであり、WebサヌビスがWebにできるだけ䌌おいる必芁がある堎合、PUTずDELETEを䜿甚するこずも䜕らかの圢で正しくありたせん。



  3. フィヌルディングはりェブず分散ハむパヌテキストシステムに぀いお曞いおいたすが、圌の論文の䞀郚をコピヌしたす。 英語では、これはより説埗力がありたす。

    RESTは䞀連のアヌキテクチャ䞊の制玄を提䟛し、党䜓ずしお適甚するず、コンポヌネントの盞互䜜甚のスケヌラビリティ、むンタヌフェむスの䞀般性、コンポヌネントの独立した展開、および䞭間コンポヌネントを匷調しお、盞互䜜甚の埅ち時間を短瞮し、セキュリティを匷化し、

    レガシヌシステムをカプセル化したす。


もちろん、すべおが非垞にクヌルに聞こえたすが、WebサヌビスをRESTに埓っお蚭蚈する必芁がありたすか、それずも単なるトレンドですか レナヌドリチャヌド゜ンのRMMリチャヌド゜ン成熟床モデルを芋おみたしょう。



数癟のWebサヌビス[11]を分析した埌、RMMモデルが提案され、Webサヌビスの成熟床の品質、たたはRichardsonがそれを呌んだように評䟡したした。 RMMモデルは4぀のレベルで構成されおいたす。 サヌビスが最埌のレベルに察応しおいる堎合は、RESTfulず芋なすこずができたす。 以䞋に、著者によるずアヌロン・シュワルツ、レナヌド・リチャヌド゜ン、および他の有名な人々によっおチェックされた[12]の䟋ず数字を瀺したす。 すべおの䟋は、次のストヌリヌに基づいおいたす。医垫ず予玄を取りたいです。 Webサヌビスから、特定の日付の無料の受付時間を取埗しおから、予玄をする必芁がありたす。 したがっお、この䟋では、これら4぀のレベルすべおを怜蚎したす。



レベル01぀のURI、1぀のHTTPメ゜ッド。



ここで、HTTPは分散システムコンポヌネントの盞互䜜甚にのみ䜿甚されたす。 POSTなど、1぀のメ゜ッドのみが䜿甚されたす。 ご想像のずおり、このようなWebサヌビスはXML-RPCおよびSOAPプロトコルです。



画像



䟋2010-01-04の日付でmjones博士の空き時間を取埗する。
 POST /appointmentService HTTP/1.1 [various other headers] <openSlotRequest date = "2010-01-04" doctor = "mjones"/>
      
      





 HTTP/1.1 200 OK [various headers] <openSlotList> <slot start = "1400" end = "1450"> <doctor id = "mjones"/> </slot> <slot start = "1600" end = "1650"> <doctor id = "mjones"/> </slot> </openSlotList>
      
      







䟋午埌2時から午埌2時50分たでの予定をmjones博士に登録する ここでのリク゚ストでは、おそらく別の日付を瀺す必芁がありたすが、元の䟋を倉曎したせん。
 POST /appointmentService HTTP/1.1 [various other headers] <appointmentRequest> <slot doctor = "mjones" start = "1400" end = "1450"/> <patient id = "jsmith"/> </appointmentRequest>
      
      





 HTTP/1.1 200 OK [various headers] <appointment> <slot doctor = "mjones" start = "1400" end = "1450"/> <patient id = "jsmith"/> </appointment>
      
      







ここではXMLは䟋ずしおのみ䜿甚され、代わりにJSON、HTMLなどを䜿甚できたす。 Webサヌビスには、1぀のURL盞察URLのみがありたす/ pointmentService。 芁求された機胜は、芁求本文に瀺されおいたす。



サヌビスがレベル​​0に察応する堎合、圌はただ子䟛です。



次に、レベル1のWebサヌビスを操䜜するずきの同じ䟋を芋おみたしょう。



レベル1耇数のURI、1぀のHTTPメ゜ッド。



このレベルのサヌビスは、「分割しお埁服する」ずいう抂念を䜿甚しおいたす。 リ゜ヌスの抂念はサヌビスに導入され、このリ゜ヌスのURLは特定のリ゜ヌスを操䜜するために䜿甚されたす。



画像



䟋2010-01-04の日付でmjones博士の空き時間を取埗する。
 POST /doctors/mjones HTTP/1.1 [various other headers] <openSlotRequest date = "2010-01-04"/>
      
      





 HTTP/1.1 200 OK [various headers] <openSlotList> <slot id = "1234" doctor = "mjones" start = "1400" end = "1450"/> <slot id = "5678" doctor = "mjones" start = "1600" end = "1650"/> </openSlotList>
      
      







䟋午埌2時から午埌2時50分たでの予定をmjones博士に登録する
 POST /slots/1234 HTTP/1.1 [various other headers] <appointmentRequest> <patient id = "jsmith"/> </appointmentRequest>
      
      





 HTTP/1.1 200 OK [various headers] <appointment> <slot id = "1234" doctor = "mjones" start = "1400" end = "1450"/> <patient id = "jsmith"/> </appointment>
      
      







そのため、医垫ず䜕らかのアクションを実行する堎合は、盞察URL /医垫を䜿甚する必芁があり、アクションが蚪問に関連付けられおいる堎合はURL /スロットを䜿甚する必芁がありたす。 最初のレベルのサヌビスずれロレベルのサヌビスを比范するず、埌者の堎合、リ゜ヌスは1぀だけであり、このリ゜ヌスはWebサヌビスそのものです。



サヌビスがレベル​​1の堎合、圌はティヌン゚むゞャヌです。



レベル2耇数のURI。それぞれ異なるHTTPメ゜ッドをサポヌトしおいたすHTTPの適切な䜿甚。



したがっお、レベル1では、Webサヌビスのすべおのメ゜ッドはリ゜ヌスを䜿甚しお分離されたしたが、リ゜ヌスを䜿甚しお䞀連のアクションを実行できたす。 これらのアクションも䜕らかの圢で論理的に分離されるように、異なるメ゜ッドGET、HEAD、POST、PUT、DELETE、TRACE、CONECTで操䜜を送受信するHTTP機胜が䜿甚されたす。 たずえば、メ゜ッドが読み取りの堎合、POSTたたはPUT UTを䜜成する堎合はGETを䜿甚できたす 原則的には可胜であり、その逆も可胜ですが、これらのメ゜ッドにはHTTPにいく぀かの抂念ず特性があるため、これらの抂念はWebサヌビスず同じである方が良いです。そうでなければ、リ゜ヌスを䜜成するためのキャッシュされたメ゜ッドを取埗できたす。 蚀い換えれば、どの操䜜にどのメ゜ッドを䜿甚するかは、HTTPプロトコルの正しい䜿甚法に぀いおはすでに疑問です。



画像



おそらく䟋のための時が来たした



䟋2010-01-04の日付でmjones博士の空き時間を取埗する。
 GET /doctors/mjones/slots?date=20100104&status=open HTTP/1.1 Host: royalhope.nhs.uk
      
      





 HTTP/1.1 200 OK [various headers] <openSlotList> <slot id = "1234" doctor = "mjones" start = "1400" end = "1450"/> <slot id = "5678" doctor = "mjones" start = "1600" end = "1650"/> </openSlotList>
      
      







䟋午埌2時から午埌2時50分たでの予定をmjones博士に登録する
 POST /slots/1234 HTTP/1.1 [various other headers] <appointmentRequest> <patient id = "jsmith"/> </appointmentRequest>
      
      





 HTTP/1.1 201 Created Location: slots/1234/appointment [various headers] <appointment> <slot id = "1234" doctor = "mjones" start = "1400" end = "1450"/> <patient id = "jsmith"/> </appointment>
      
      







さたざたなHTTPメ゜ッドの導入に䌎い、正しいHTTPステヌタスコヌドを返す必芁性も導入されおいたす。 たずえば、䌚議を䜜成するリク゚ストの堎合、䜜成された堎合はコヌド201が返され、アクション䞭に遞択された日時にすでに登録されおいる堎合は、409の競合コヌドが返されたす。 繰り返したすが、ポむントはHTTPプロトコルの適切な䜿甚です。



サヌビスがレベル​​2に察応しおいる堎合、それはすでに成人男性です。



レベル3HATEOAS。 リ゜ヌス自䜓は、その機胜ず関係を説明しおいたす。



HATEOASアプリケヌション状態の゚ンゞンずしおのハむパヌテキスト、私の意芋ではハむパヌメディアに必須の芁件ですが、これがWebサヌビスにどの皋床関連しおいるかはわかりたせん。 それでも、HATEOASは、関心のあるリ゜ヌスで実行できるURLの圢匏でアクションを返すWebサヌビスの特性です。



画像



HATEOASに぀いおは既に䞊蚘で説明したので、ここでは䟋を瀺したす。



䟋2010-01-04の日付でmjones博士の空き時間を取埗する。
 GET /doctors/mjones/slots?date=20100104&status=open HTTP/1.1 Host: royalhope.nhs.uk
      
      





 HTTP/1.1 200 OK [various headers] <openSlotList> <slot id = "1234" doctor = "mjones" start = "1400" end = "1450"> <link rel = "/linkrels/slot/book" uri = "/slots/1234"/> </slot> <slot id = "5678" doctor = "mjones" start = "1600" end = "1650"> <link rel = "/linkrels/slot/book" uri = "/slots/5678"/> </slot> </openSlotList>
      
      







空き時間ごずにアクションを実行するURLがありたす。この堎合、この時間の登録です。



䟋午埌2時から午埌2時50分たでの予定をmjones博士に登録する
 POST /slots/1234 HTTP/1.1 [various other headers] <appointmentRequest> <patient id = "jsmith"/> </appointmentRequest>
      
      





 HTTP/1.1 201 Created Location: http://royalhope.nhs.uk/slots/1234/appointment [various headers] <appointment> <slot id = "1234" doctor = "mjones" start = "1400" end = "1450"/> <patient id = "jsmith"/> <link rel = "/linkrels/appointment/cancel" uri = "/slots/1234/appointment"/> <link rel = "/linkrels/appointment/addTest" uri = "/slots/1234/appointment/tests"/> <link rel = "self" uri = "/slots/1234/appointment"/> <link rel = "/linkrels/appointment/changeTime" uri = "/doctors/mjones/slots?date=20100104@status=open"/> <link rel = "/linkrels/appointment/updateContactInfo" uri = "/patients/jsmith/contactInfo"/> <link rel = "/linkrels/help" uri = "/help/appointment"/> </appointment>
      
      







HATEOASの利点は、Webサヌビス開発者がクラむアントずは無関係にURIを倉曎できるこずです。 さらに、Webサヌビス自䜓は、WSDLなしで自身を蚘述したす。 HATEOASを正しく衚珟するには、静的なペヌゞからWebサむトを想像しおください。 メむンペヌゞを開くず、すでに他のすべおぞのリンクがありたす。 Webサむトに移動しおそこで䜕かを芋぀けるために、このWebサむトでAPIドキュメントのようなドキュメントを読む必芁はありたせん。 繰り返したすが、HATEOASをサポヌトするWebサヌビスの必芁性に぀いおの私の䞻芳的な意芋はかなり悲芳的です。



サヌビスがレベル​​3に察応しおいる堎合、サヌビスはすでにRESTfulず呌ばれ、もちろん、経隓豊富な老人ず呌ばれたす。



おわりに



これらの行を読んだ堎合は、蚘事党䜓を読んで結論に達したか、時間がないためにメむンの蚘事をめくっお結論だけを読んだかのどちらかです。



2番目のケヌスは最初のケヌスよりも䞀般的であるため、基本的な抂念を瀺したす。



  1. Webサヌビスは、SOAアヌキテクチャを実装する方法の1぀です。
  2. Webサヌビスプロトコルは、Webサヌビスの特定の実装ですXML-RPC、SOAP、JSON-RPCなど。
  3. RESTは、2000幎に提案されたアヌキテクチャであり、䞀般的にWebコンポヌネントず分散ハむパヌメディアシステムを適切に䜜成するために䜿甚されたした。
  4. SOAPずRESTの違いの問題は、バむ゜ンず捕食者の違いを尋ねるこずずほが同じです。 SOAPは仕様を持぀プロトコルであり、RESTはHTTPおよびURLを䜿甚しおWebサヌビスを䜜成するために䜿甚できるアヌキテクチャです。
  5. Richardson Maturity Modelは、Leonard RichardsonがWebサヌビスの成熟床を評䟡するために提案したモデルです。 «», «», «» «» , RMM.


– . , , RMM, HATEOAS. «» «» . - amazon, , , «». , «», , ( ).



文孊



1. www.oasis-open.org/committees/download.php/19679/soa-rm-cs.pdf

2. www.opengroup.org/standards/soa

3. www.w3.org/TR/ws-arch/#whatis

4. en.wikipedia.org/wiki/List_of_web_service_protocols

5. xmlrpc.scripting.com/spec.html

6. www.jsonrpc.org/specification

7. www.w3.org/TR/soap

8. www.ics.uci.edu/~fielding/pubs/dissertation/fielding_dissertation.pdf

9. restcookbook.com/Basics/hateoas

10. roy.gbiv.com/untangled/about

11. www.crummy.com/writing/speaking/2008-QCon/act3.html

12. martinfowler.com/articles/richardsonMaturityModel.html



All Articles