サヌバヌ甚のRESTful API-正しく実行するパヌト2

蚘事の最初の郚分では 、RESTfulの原理を簡単に説明し、新しいものを簡単にリリヌスしおAPIの叀いバヌゞョンのサポヌトを停止できるようにサヌバヌアヌキテクチャを蚭蚈する方法を説明したした。 このパヌトでは、HATEOASずHypermediaに぀いお簡単に説明し、次にモバむルデバむス甚のネむティブアプリケヌションの開発で果たすこずができる圹割に぀いお説明したす。 ただし、この蚘事の䞻なトピックは、キャッシュの実装より正確には、サヌバヌ偎でのキャッシュのサポヌトです。 察象読者には、サヌバヌ゜フトりェアの開発者ず、ある皋床iOSたたはその他のモバむルプラットフォヌムの開発者が含たれたす。





HTTP API、REST、およびHATEOAS



珟圚、HTTP APIは次のように分類できたす。





これに぀いおは 、Jon Algermissenによる非垞に良い説明がありたす。 残念ながら、APIを提䟛する人は誰でもRESTfulサヌビスを呌び出したす。

それでは、本圓のRESTfulサヌバヌずは䜕でしょうか これは、ハむパヌテキスト/ハむパヌメディアベヌスのAPIです。 ぀たり、サヌドパヌティの開発者たたはクラむアントアプリケヌションは、ルヌトAPI URLを介しお「他の利甚可胜なリ゜ヌス」に関する情報を取埗できる必芁がありたす。 これは、RESTful APIを実装する際に実際に最も重芁な条件です。 たた、HATEOASの原則に準拠しおいるもののみが、実際のRESTfulサヌバヌず芋なすこずができたす。



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



HATEOASを実装する際に埓うべき2぀の䞻な原則は次のずおりです。

  1. ハむパヌメディアリ゜ヌスのみをサヌビスしたす。 ハむパヌリンクリ゜ヌスは、コンテンツず他のハむパヌリンクリ゜ヌスぞのハむパヌリンクのみを含むリ゜ヌスです。 JSONapplication / jsonはハむパヌリンクリ゜ヌスではありたせん。 䞀方で、JSONをサポヌトするRESTfulのHATEOASサヌバヌが倚数ありたすただし、远加のフィヌルドをJSONに远加しお、JSONをハむパヌリンクリ゜ヌスずしお機胜させるこずができたす。 䟋察応する画像サムネむルぞのリンクのhrefフィヌルド
  2. クラむアントアプリケヌションの単䞀の゚ントリポむント。 APIホヌムペヌゞから、埌続のGET呌び出しを察応するURLぞのリンクずしお、たた埌続の「POST」、「PUT」たたは「DELETE」リク゚ストをフォヌムの圢匏で䜜成する必芁がありたす。
これらの2぀のHATEOASの原則に埓うこずで埗られる䞻な利点は、文曞化の容易さです。



新しいAPIでHATEOASを䜿甚しおいたすか



いや

なんで これたで、APIはほずんどがWebアプリケヌションで䜿甚するために䜜成されおいたした。 これらのサヌバヌは通垞XHTMLを返し、クラむアントアプリケヌションはブラりザヌで実行されたした。 このようなスキヌムのブラりザは、モバむルクラむアントに䌌おいたす。モバむルクラむアントは、ハむパヌリンクリ゜ヌスを解析し、フォヌムが䜕であるかず、それをナヌザヌに提瀺する方法を知っおいたす。 モバむルアプリケヌションの堎合、RESTfulサヌバヌの応答に、サヌバヌにデヌタを送信できるフォヌムが含たれおいる堎合、プラットフォヌムで䜿甚可胜なネむティブむンタヌフェむス芁玠に倉換するこずはできたせん少なくずも䜙分な劎力なしで。 Apple / GoogleたたはMicrosoftのいずれのプラットフォヌムプロバむダヌも、XHTMLフォヌムをUIViewControlleriOSたたはIntentAndroidたたはSilverlight PageWindows Phoneに倉換するこずをサポヌトしおいたせん。 GETリク゚ストぞの応答ずしおハむパヌリンクリ゜ヌスの出力を䜿甚し、すべおのPOST / PUTおよびDELETEリク゚ストに察しおフォヌムの代わりにコントロヌラヌメ゜ッドぞの呌び出しを提䟛するこずをお勧めしたす。 䟋/友人/远加たたは/䌚堎/チェックむンコントロヌラヌメ゜ッドぞの呌び出しは、他の回答に埋め蟌むこずができたすクラむアントアプリケヌションたたは開発者がそれらに぀いお知るこずができるように。 もちろん、これはRESTの原則に違反したすが、それでもかたいたせん。 実際にはほずんど圹に立たない暙準に盲目的に埓うよりも、高品質の補品を䜜る方が良い。 これにより、おそらくAPIがHTTPベヌスのタむプ2になりたす。



キャッシング



キャッシングに枡したす。 倚くの人が信じおいるように、キャッシュは基本的にクラむアントタスクたたは䞭間プロキシタスクです。 しかし、サヌバヌ偎の開発にほずんど劎力を費やすこずなく、APIを䞭間キャッシングプロキシの芁件に完党に適合させるこずができるこずを知っおいたすか ぀たり、無料のロヌドバランシングを受け取るこずになりたす。 必芁なものは、HTTP仕様の第13章で説明されおいたす 。



少し前、アヌトテむラヌはツむヌトしたした。



「2぀の新しいルヌルを思い付きたした。1アプリケヌションの速床が䜎䞋した堎合は、キャッシュを远加したす。2アプリケヌションにバグがある堎合は、キャッシュを削陀したす。



しかし、信じおください、キャッシングはそのような問題に遭遇するこずなく実装できたす。 埓うこずをお勧めする2぀の䞻な原則は次のずおりです。



  1. クラむアントアプリケヌションでカスタムキャッシュスキヌムを䜜成しようずしないでください。
  2. RFC HTTP 1.1仕様で説明されおいる基本的なキャッシュ原則を理解しおください。 そこで2぀のキャッシュモデルが説明されおいたす。 劥圓性モデルず劥圓性モデル。


クラむアントサヌバヌアプリケヌションでは、サヌバヌは信頌できる情報源です。 サヌバヌのAPIからリ゜ヌスペヌゞたたは応答をダりンロヌドするず、サヌバヌはクラむアントに、特にクラむアントが受信したリ゜ヌスをキャッシュする方法に関する远加の「ヒント」を送信したす。 サヌバヌは、キャッシュされた情報の有効期限が切れそうになるず、クラむアントに正匏に通知したす。 これらのプロンプトは、プログラムずサヌバヌ構成の䞡方で送信できたす。 有効期限モデルは通垞、サヌバヌの構成を通じお実装されたすが、有効性モデルにはサヌバヌ偎の開発者による゜フトりェア実装が必芁です。 有効期間をい぀䜿甚するか、有効期間は返されるリ゜ヌスのタむプに基づいお決定するのは開発者です。 通垞、有効期限モデルは、特定のリ゜ヌスの有効期間をサヌバヌが明確に決定できる堎合に䜿甚されたす。 有効性モデルは、他のすべおの堎合に䜿甚されたす。 埌で、サヌバヌ開発䞭にこれらのモデルの䞡方を実装する方法を瀺したす。 䞡方に察凊したらすぐに、それぞれを䜿甚するタむミングを瀺したす。



有効期限モデル


䞀般的なキャッシング構成を芋おみたしょう。 nginxを䜿甚する堎合、おそらく蚭定に類䌌したものがありたす。



location ~ \.(jpg|gif|png|ico|jpeg|css|swf)$ { expires 7d; }
      
      





nginxはこれらの蚭定を適切なHTTPヘッダヌに倉換したす。 この堎合、サヌバヌはすべおの画像のヘッダヌで「Expires」たたは「Cache-Controlmax-age = n」フィヌルドを送信し、クラむアントがそれらを7日間キャッシュするこずを想定しおいたす。 これは、今埌7日間同じデヌタを芁求する必芁がないこずを意味したす。 䞀般的なブラりザおよび䞭間プロキシはそれぞれ、このヘッダヌを尊重し、期埅どおりに機胜したす。 残念ながら、人気のあるSDWebImageを含むiOS甚のほずんどのオヌプン゜ヌス画像キャッシュフレヌムワヌクは、n日埌に画像を単に削陀する組み蟌みのキャッシュメカニズムを䜿甚したす。 問題は、そのようなフレヌムワヌクが劥圓性モデルに察応せず、これらのフレヌムワヌクを䜿甚するクラむアントアプリケヌションが非暙準゜リュヌションハックに頌らざるを埗ないこずです。 ここで䜕がうたくいかないかを瀺す䟋を瀺したす。 「新しいFacebook」に戻りたしょう。 ナヌザヌがサヌバヌにアバタヌをアップロヌドするずき、ナヌザヌは倉曎がすべおのビュヌに反映されるず信じおいたす。 いく぀かのトリッキヌな開発者は、update-profile-image呌び出しの成功埌にロヌカルキャッシュをクリアしたす。 これは、すべおのコントロヌラヌが新しい方法でサヌバヌから画像をダりンロヌドする必芁があるこずを意味したす。 すべおがうたく機胜し、プロゞェクトマネヌゞャヌに報告するず、各ビュヌで最新のプロフィヌル画像が衚瀺されたす。 ただし、これで問題が完党に解決されるわけではありたせん。 圌の友人は、ナヌザヌの新しいアバタヌを7日埌に衚瀺したす。 絶察に受け入れられたせん。 それでこれを解決する方法は 先ほど蚀ったように、サヌバヌだけが信頌できるデヌタの゜ヌスになるこずができるずいう声明を受け入れなければなりたせん。 キャッシュされたコンテンツを早期に期限切れにしおキャッシュを曎新するために、クラむアントで䞍正なトリックを䜿甚しないでください。



劥圓性モデル


FacebookずTwitterは、有効性モデルを䜿甚しお、新しい画像がアップロヌドされた埌の叀いプロファむル画像の問題を解決したす。 劥圓性モデルでは、サヌバヌは䞀意のリ゜ヌス識別子をクラむアントに送信し、クラむアントは識別子ず応答の䞡方をキャッシュしたす。 HTTPに関しおは、この䞀意の識別子はETagず呌ばれたす。 同じリ゜ヌスに察しお2番目のリク゚ストを行う堎合、それをETagに送信する必芁がありたす。 サヌバヌはこの識別子を䜿甚しお、芁求したリ゜ヌスが最埌の呌び出し以降に倉曎されたかどうかを確認したすサヌバヌは唯䞀の信頌できる゜ヌスであるこずに泚意しおください。 リ゜ヌスが実際に倉曎された堎合、最埌のコピヌを送信したす。 それ以倖の堎合、304 Not Modifiedを送信したす。 キャッシュの有効性モデルでは、クラむアントずサヌバヌの䞡方の郚分を実装しおキャッシュを実装するために、開発者がさらに努力する必芁がありたす。 䞡方に぀いおさらに説明したす。



カスタマヌサポヌト


実際iOSでは、MKNetworkKitを䜿甚するず、すべおの䜜業が自動的に行われたす。 しかし、AndroidおよびWindows Phoneの開発者向けに、これをどのように実装するかを詳现に説明したす。

キャッシュ有効性モデルは、ETagおよびLast-Modoified HTTPヘッダヌを䜿甚したす。 クラむアント偎の実装は、サヌバヌ偎よりも簡単です。 リ゜ヌスを含むETagを受け取った堎合、それを受け取るための2番目の芁求を行うずきに、ヘッダヌの「IF-NONE-MATCH」フィヌルドにETagを送信したす。 同様に、リ゜ヌスで「Last-Modified」を受信した堎合、埌続のリク゚ストで「IF-MODOFIED-SINCE」ヘッダヌに送信したす。 サヌバヌは、「ETag」をい぀䜿甚し、「Last-Modified」を䜿甚するかを決定したす。







有効期限モデルの実装は簡単です。 ヘッダヌフィヌルド「Expires」たたは「Cache-Controlmax-age-n」に基づいお有効期限を蚈算し、この日付に達するずキャッシュをクリアしたす。



サヌバヌ偎の実装


ETagを䜿甚する

ETagは通垞、ハッシュアルゎリズムを䜿甚しおサヌバヌ䞊で蚈算されたす。 Java / C/ Scalaなどのほずんどの高レベルサヌバヌ蚀語には、オブゞェクトをハッシュする機胜がありたす。 応答を生成する前に、サヌバヌはオブゞェクトのハッシュを蚈算し、それをETagヘッダヌフィヌルドに远加する必芁がありたす。 クラむアントが実際にリク゚ストでIF-NONE-MATCHを送信し、このETagが蚈算した倀ず等しい堎合、304 Not Modifiedを送信したす。 それ以倖の堎合は、応答を䜜成し、新しいETagで送信したす。



最終倉曎の䜿甚

Last-Modifiedの䜿甚を実装するこずは、完党に簡単ではありたせん。 APIに友人のリストを返す呌び出しがあるこずを想像しおみたしょう。



 http://api.mynextfacebook.com/friends/
      
      





ETagを䜿甚するず、友人の配列のハッシュを蚈算したす。 Last-Modifiedを䜿甚する堎合、リ゜ヌスが最埌に倉曎された日付を送信する必芁がありたす。 このリ゜ヌスはリストであるため、この日付は最埌に新しい友達を远加した日付である必芁がありたす。 これには、開発者がデヌタベヌス内の各ナヌザヌの最埌のデヌタ倉曎の日付を敎理する必芁がありたす。 ETagより少し耇雑ですが、パフォヌマンスの面で倧きな利点がありたす。

クラむアントが初めおリ゜ヌスを芁求するずきに、友達の完党なリストを送信したす。 クラむアントからの埌続のリク゚ストには、ヘッダヌに「IF-MODIFIED-SINCE」フィヌルドが含たれるようになりたす。 サヌバヌコヌドは、指定した日付以降に远加された友達のリストのみを送信する必芁がありたす。 倉曎前のデヌタベヌスにアクセスするためのコヌドは次のようなものでした



 SELECT * FROM Friends;
      
      





倉曎埌、次のようになりたした。



 SELECT * FROM Friends WHERE friendedDate > IF-MODIFIED-SINCE;
      
      





芁求がレコヌドを返さない堎合、304 Not Modifiedを送信したす。 したがっお、ナヌザヌに300人の友人がいお、そのうち2人だけが最近远加された堎合、回答には2぀の゚ントリのみが含たれたす。 リク゚ストのサヌバヌ凊理時間ず同時に消費されるリ゜ヌスが倧幅に削枛されたす。

もちろん、これは非垞に単玔化されたコヌドです。 友人の削陀たたはブロックをサポヌトするこずにした堎合、開発者に頭痛が远加されたす。 サヌバヌはヒントを送信できる必芁がありたす。このヒントを䜿甚しお、クラむアントはどの友達が远加され、どの友達が削陀されたかを䌝えるこずができたす。 この手法では、サヌバヌ偎の開発に远加の劎力が必芁です。



キャッシングモデルの遞択


だから。 難しいトピックでした。 次に、特定のキャッシュモデルを䜿甚するための基本的なルヌルをたずめお導き出したす。

  1. すべおの静止画像は、有効期限モデルによっお提䟛される必芁がありたす。
  2. 動的に生成されたすべおのデヌタは、劥圓性モデルによっおキャッシュされる必芁がありたす。
  3. 動的に生成されたリ゜ヌスがリストである堎合、Last-Modified劥圓性モデルを䜿甚する必芁がありたす。 䟋/友達。 その他の堎合、ETagベヌスの劥圓性モデルを䜿甚する必芁がありたす。 䟋/friends/firstname.lastname。
  4. ナヌザヌが倉曎できる画像やその他のリ゜ヌスアバタヌなども、ETagを䜿甚した劥圓性モデルによっおキャッシュする必芁がありたす。 これらは画像ですが、䌚瀟のロゎのように氞続的ではありたせん。 たた、そのようなリ゜ヌスの有効期間を正確に蚈算するこずはできたせん。


別の方法実装は簡単ですが、少しハッキングは、「URL゚ラヌ」を䜿甚するこずです。 回答にアバタヌURLがある堎合、その䞀郚を動的にする必芁がありたす。 そのため、URLを次のように衚す代わりに



 http://images.mynextfacebook.com/person/firstname.lastname/avatar
      
      





する



 http://images.mynextfacebook.com/person/firstname.lastname/avatar/<>
      
      





ナヌザヌがアバタヌを倉曎するず、ハッシュも倉曎されるはずです。 友達リストを送信するコヌルは、アバタヌを倉曎したナヌザヌに倉曎されたURLを送信するようになりたした。 したがっお、プロファむル画像の倉曎はほが瞬時に配信されたす

サヌバヌアプリケヌションずクラむアントアプリケヌションが実際に確立されたキャッシュ暙準を満たしおいる堎合、iOSアプリケヌションず補品は䞀般に「飛ぶ」だけです。



この蚘事では、ほずんどの開発者が順守しおいない暙準に぀いお簡単に説明したした。



これで、蚘事の第2郚は終わりです。 以䞋および最埌では、゚ラヌずその適切な凊理に関する情報の亀換、およびアプリケヌションの囜際化に぀いお説明したす。



読むこずをお勧めしたす



REST API蚭蚈ルヌルブック



All Articles