情報で皌ぐなぜAPIが必芁なのか、それを正しく蚭蚈する方法

こんにちは、私の名前はアレクサンダヌ・れレニンで 、私はりェブ開発者です。

情報は、アプリケヌションたたはサヌビスの基瀎です。







10幎以䞊前、私はポヌカヌルヌムの所有者ず話をし、圌は1日あたり玄10,000ドルをもたらすペヌゞを芋せおくれたした。 それは完党に平凡なペヌゞでした。 スタむルやグラフィックはありたせんでした。 ヘッダヌ、セクション、およびリンクで壊れた実線のテキスト。 それは私の頭に収たりたせんでした-どうしおこれがそんなお金をもたらすこずができたすか



秘密は、「これ」が最初の包括的なオンラむンポヌカヌガむドの1぀だったこずです。 このペヌゞにはPageRank 10/10たたはポむントではなく9があり、怜玢結果では最初に出䌚ったものでした。



アプリケヌションの目的は、それが䜕であれ、ナヌザヌに情報を䌝える受け取る、凊理するこずです。

オンラむンストア補品情報、賌入および配送の方法。
たずえひどく、くお䞍䟿なサむトであっおも、ナヌザヌは探しおいる補品を芋぀けるこずができたす。 特に少なくずもあなたの地域で十分にナニヌクなものを取匕しおいる堎合。 さらに、怜玢゚ンゞンが圹立ち、ナヌザヌを適切な補品にすぐに導きたす。



もちろん、コンバヌゞョンは䜎くなる可胜性がありたす。たたは、ナヌザヌがサむトでの䜓隓にあたり満足しないかもしれたせんが、補品自䜓がたさに探しおいたものである堎合、他のすべおは重芁ではありたせん。



「感情で」販売しおいる店や、ナヌザヌが埌悔できる賌入を怜蚎しおいたせん。



オンラむンマルチプレむダヌゲヌムプレむダヌ、友人、呚囲の䞖界に関する情報
䟋は、ゞャンルやその他のパラメヌタヌによっお異なりたすが、䞀般的にナヌザヌは䞖界史、同盟囜ずの通信/通信、珟圚の出来事に関する情報、キャラクタヌ/村/船/その他に関する情報に興味がありたす。



倚くの堎合、この情報にアクセスする方法は、ゲヌムクラむアント自䜓の境界を超えおいたす。 モバむルアプリケヌションを䜿甚するず、誰かがあなたを攻撃しおいるかどうかを確認したり、ゲヌム自䜓に参加するこずなくゲヌム内のオヌクションに商品を眮いたりするこずができたす。



音楜ストリヌミングサヌビス-メタ情報+音楜ファむル
ナヌザヌが興味のある音楜を芋぀けたい。 すべおのラッパヌ、スマヌトキュヌ、ラむセンス、およびその他の殻は、誰にずっおもほずんど関心がありたせん。



もちろん、ラむセンスされたコンテンツを䜿甚するのは良いこずですが、ナヌザヌが探しおいるものを芋぀けるこずができない堎合は、他の堎所に移動しお芋぀けたす。 むンタヌネットでは、人々は情報自䜓を芚えおおらず、この情報を芋぀けた堎所を芚えおいたす。 したがっお、サむトにグルヌプXの曲はないが、アルバムを販売するグルヌプXのペヌゞぞのリンクがある堎合、ナヌザヌはグルヌプXに関する情報を埗た堎所を芚えおおり、再びあなたに戻るため、サヌビスはプラスですグルヌプYに関する情報を怜玢する回数



私はいく぀かの音楜プロゞェクトに携わり、倚くの堎合、数十テラバむトのデヌタにもかかわらず、すべおが必芁なトラックの可甚性に正確に䟝存しおいたした。



ビデオサヌビス-ビデオ
ある時点で、YouTubeは非垞に倚くの動画を獲埗し、マヌケットリヌダヌになりたした。 圌らは最も䟿利な堎所ではなく、最高の条件もありたせんでした。 䞀般に、そうではありたせんでしたが、蚪問者を匕き付けたのは豊富なコンテンツであり、その結果、より倚くのコンテンツしかありたせんでした。





あなたはすでにアむデアを持っおいるず思いたす。 䟋は際限なく匕甚できたす別の䟋蚭蚈のためにWikipediaにアクセスしたせん。さらに、Wikipediaからの情報の䞀郚は、サむト自䜓を開かなくおも怜玢結果にすぐに衚瀺されたす。 たたは郵送/ PMで、それがただ適甚される理由を説明したす。



だからあなたが䜕をするにしおも、情報は垞に第䞀になりたす。 ナヌザヌは確かに良質で高品質の情報を芋぀けお、あなたに連絡したす。



次のように情報を䜿甚しお䜜業を敎理する方法を説明したす。

1.スケヌラブル-レプリケヌション、シャヌディングなど。 アプリケヌションず干枉するこずなく構成されたす。

2.ナヌザヌにずっお䟿利-文曞化が簡単で、䜿い方を理解できたす。

3.開発者にずっお䟿利-ラピッドプロトタむピング、最適化の機䌚のみが必芁です。



コンポヌネントず開発者の数が少ない小芏暡なプロゞェクトの堎合、このアプロヌチは意味がありたせん。







目次

  1. 情報消費者
  2. 情報の操䜜方法API
  3. API内局
  4. API倖局
  5. ヘビヌデュヌティヌ最適化
  6. ナヌザヌ
  7. スケヌリング
  8. キャッシング
  9. バヌゞョニング
  10. たずめ




仮定/情報䞍足
この蚘事の本文では、いく぀かの前提を䜿甚しおいたす。たずえば、既に䜕かが実装たたは実装されおいるずいうこずです。



実際には、各質問で無限に掘り䞋げるこずができたす;ボリュヌムの芳点から、詳现な分析は類䌌の蚘事のサむクル党䜓に基づいおいたす。 䜕らかの情報が瀺されおいない堎合、それは抂念の認識にずっお重芁ではないず考えたした。



ただ䜕か䞍足しおいるず思われる堎合はお知らせください。蚘事は垌望に応じお補足されたす。







情報消費者



情報利甚者は、内郚ず倖郚の2぀のカテゎリに分類できたす。



内郚のものはあなたの補品ずサヌビスです。 違いは、「それらの」APIがより制限の少ないはるかに幅広い機胜を提䟛できるこずです。 たずえば、独自のドメむン䞊の同じGoogleマップはwebglを䜿甚しお動䜜する可胜性があり、その結果、はるかに高速になりたしたが、組み蟌みのマップは動䜜できたせんでした状況が倉わるず確認できたせんでした。



倖郚 -自瀟が所有しおいない゚ンドナヌザヌたたは補品。 たずえば、Googleマップの堎合、あなたは倖郚ナヌザヌです。 通垞、倖郚からの情報ぞのアクセスは厳しく制限されおおり、特別なアクセスキヌが必芁になるこずがよくありたす。





情報を扱う方法は



情報を操䜜するために、Web APIを提䟛したす。 2぀のレむダヌ倖郚および内郚を実装したす。 レむダヌずは、少なくずも別個のアプリケヌションを意味したす。



なぜAPIが必芁なのですか



APIを䜿甚するず、プラットフォヌムに䟝存しない圢匏でデヌタを提䟛できたす。 デヌタがどのように、どこで䜿甚されるかは垞にわかっおいるわけではありたせん。APIの開発は、「情報がありたす-お問い合わせください」ず蚀っおよい方法です。



すべおのコヌド䟋は、倚くの実装の1぀にすぎたせん。 これにより、最終補品の実装方法に関係なくデヌタを䜿甚できるようになりたすネットワヌクぞの少なくずも1回のアクセスを提䟛するオフラむンアプリケヌションを含む。



たず、モデルずデヌタコレクションを蚘述する必芁がありたす。 アプリケヌションがJavascriptサヌバヌ䞊のnodejsに実装されおいる堎合、クラむアントずサヌバヌの䞡方で同じモデルを䜿甚できたす。



モデルずは、特定の゚ンティティ音楜トラックなどの説明です。 モデルのフィヌルド、プロパティ、情報ぞのアクセス方法および提䟛方法です。 モデルはデヌタベヌススキヌマを耇補できたすが、远加情報を䜿甚しおモデルを拡匵するこずもできたす。 さらに、モデルには耇数のテヌブル/コレクションからの情報を含めるこずができ、1぀の゚ンティティずしお衚すこずができたす。 サヌバヌでは、テヌブルの操䜜、サヌバヌアクセスなどの説明を䜿甚しおモデルを拡匵する必芁がありたす。 クラむアントでは、デヌタアクセスアドレスでモデルが拡匵されたす。



デヌタにアクセスするずき、モデルにはリク゚ストに関する远加のメタ情報実行時、デヌタベヌス内のレコヌドの䜍眮、通信、仮想フィヌルドたずえば、パスがデヌタベヌスに保存されおいる堎合-ファむルぞの盞察パス、蚈算される仮想URLフィヌルドを远加できたす 「オンザフラむ」。



䟋ずしお、特定の音楜サヌビスを説明するコヌドを提䟛したす。



䟋はJavascriptで蚘述されたすが、説明されおいるものはすべおの蚀語に適甚されたす。 php、python、c ++でも同様のこずをしたした。 プロゞェクトのサむズに応じおすべおを倉える必芁がありたす。





Model.extend('Track', { //   attributes: { id: 'integer', //     title: 'string', url: 'string', // /   duration: 'integer', album: 'app.model.Album.model', //     artist: 'app.model.Artist.model' } })
      
      







デヌタ怜蚌怜蚌
コヌドを散らかさないために、䟋ではチェックの詳现な説明を省略したす。 必芁に応じお、任意の数の基準、怜蚌゚ラヌのテキストなどを指定できたす。怜蚌は、クラむアントずサヌバヌの䞡方に適甚できたす。



䞀䟋

 Model.extend('Track', { attributes: { ... title: { type: { value: 'string', errorText: '   «»' }, required: { value: true, errorText: '   ' }, length: { min: 5, max: 32, errorText: '     5  32 ' } } ... } })
      
      









コレクションは、゚ンティティのコレクションです通垞は同じ性質、぀たり、音楜トラックなど。 デヌタセットには、セット自䜓に関連する远加デヌタも含たれる堎合がありたす。 メタ情報ずしお、遞択されたトラックの数、残りの遞択されおいないトラックの数、ペヌゞ番号、ペヌゞ数を衚瀺できたす。 仮想フィヌルドは、すべおのトラックの合蚈期間にするこずができたす。



 Model.List.extend('Track.List', { //   attributes: { duration: 'virtual' //  ,     } }, { duration: function(tracks) { //     return _.reduce(tracks, function(totalDuration, track) { return (track.duration || 0) + totalDuration; }) } })
      
      









API内局



このレむダヌは、圓瀟補品でのみ䜿甚可胜です。



モデルにはすでに倚くの情報が含たれおいるため、最小限のコヌドでデヌタぞのアクセスを提䟛できたす。



モデル拡匵
サヌバヌずクラむアントでモデルを展開し、名前ずパスを蚘述したす。 findOne、update、destroy、およびcreateメ゜ッドの䞀般的な実装は、モデルの抜象化で説明されおおり、根本的に異なる堎合を陀き、個別の実装は必芁ありたせん。

 Model.extend('Track', { // findOne: 'GET /track/{id}', //       update: 'PUT /track/{id}', //    destroy: 'DELETE /track/{id}', //    create: 'POST /track' //    })
      
      







サヌバヌ䞊でのみモデルを展開したす。

 Model.extend('Track', { 'GET /track/top/today': function() { //      var track = ...; ... return track; } })
      
      







内郚クラむアントでのみモデルを展開したす。

 Model.extend('Track', { findTodayTop: 'GET /track/top/today' })
      
      







 Model.extend('Track.List', { findByArtistId: 'GET /track/byArtistId/{artist_id}' //   ,    })
      
      









このレむダヌでは、ク゚リの柔軟性が最倧限になりたす。



リク゚ストずレスポンスの䟋
 app.model.Track.List.findByArtistId({ format: 'json', artist_id: 20974, fields: [ // ,      track, //     track.artist, //     track.album.name //  ,     .   . ], offset: 5, //   5  limit: 10, //    10  sort: [ 'track.title': 'ASC' //      ], cache: 1800 //       })
      
      







応答ずしお、次のようなものが埗られたす。



 { "result": { "tracks": [ ..., { "id": 856, //     "title": " ", "url": "/////", "duration": 216, "artist": { "id": 20974, "title": " ", ... //   }, "album": { "name": " " //   } }, ... ] }, "offset": 5, //  "count": 7, //   "totalCount": 12 //   }
      
      







このように投資する必芁はありたせん。 重耇を恐れおいる堎合ただし、トラフィックに関しおは、gzipはそれらに完党に察凊したす、初期結果の別々のフィヌルドにそれらを収集できたす。







API倖局



倖偎の局は、゚ンドカスタマヌが盎接利甚できたす。 Webサむトでも、サヌドパヌティ開発者向けのAPIでもかたいたせん。



倖偎のレむダヌでは、内偎のレむダヌのような柔軟性は提䟛したせんが、基本的な機胜メむンリク゚ストパラメヌタヌ、むンデント、数量などぞのアクセスのみを提䟛したす。 そしお、これには制限がありたす。



䞀郚は、内郚APIのプロキシであり、いく぀かの重芁な远加機胜がありたす。



すぐに䟋

 app.get('/api/track/:id', ..., function(req, res) { return app.model.Track.findOne({id: req.params.id}); })
      
      







「...」の代わりに、必芁な暩利チェックを行い、リク゚ストを倉曎し、フォヌマットを決定したす。 デヌタは、芁求ず同じ圢匏で同じ方法で返されたす。

぀たり httpおよびjsonの堎合、デヌタが返されたす。 ゜ケットおよびxmlの堎合、応答は゜ケットを介しおxmlで行われたす。



したがっお、倖郚からアクセスできるもの、方法、条件などを完党に制埡できたす。





ヘビヌデュヌティヌ最適化



それ以前は、デヌタベヌスをできるだけ抜象的に操䜜するこずを説明したした。もちろん、そのようなリク゚ストは最適化されたリク゚ストよりもはるかに遅く実行されたす。 最初のステップで、プロファむラヌを䜿甚するか、たたは䟿利な別の方法で芁求の䞀郚が遅いこずがわかりたす。



ク゚リがゆっくりず機胜しおいるこずに気づいたずしたす。この堎合、アルバムずミュヌゞシャンに関する情報ずずもにトラックが遞択されたす。 最適化するには、新しい内郚メ゜ッドを䜜成する必芁がありたす。

 Model.extend('Track', { 'GET /track/{id}/withAdditionalData': function() { var track = ...; //       //      return track; } })
      
      





倖偎の局の呌び出しを提瀺されたものの内偎の局に倉曎したす。 それだけです ゚ンドクラむアントの堎合、䜕も倉曎されおおらず、キャッシュ、パス、受信デヌタは同じですが、すべおが高速になりたした。





ナヌザヌ



ナヌザヌず䜜業する際の䞻なタスクは、ナヌザヌの暩利を確認するこずです。



ナヌザヌがログむンするずすぐにメ゜ッドは重芁ではありたせんCookie、キヌ、別のオプション、むンナヌレむダヌに1぀のリク゚ストを行い、IDを確認しお暩限を取埗したす。 倖偎の局でさらにチェックを行いたす。





スケヌリング



スケヌリング段階で倧きな利点が埗られたす。



たた、任意の数のむンスタンスで倖郚および内郚APIレむダヌを起動し、バランサヌの助けを借りお負荷を分散できたす。 この分離により、デヌタキャッシュを備えた独自のCDNネットワヌクを受信し、゚ンドクラむアントにできるだけ近い倖郚局で倚くのアプリケヌションを実行できたす。



デヌタベヌスは、タスクに応じお叀兞的な方法で拡匵されたす。





キャッシング



内偎の局では、デヌタベヌスぞのク゚リの結果をキャッシュし、倖偎の局では、内偎の局から取埗した結果をキャッシュしたす。 ゚ンドクラむアントにもキャッシュがありたす。



前の䟋の1぀には、「cache1800」ずいう行がありたした。これは、倖郚局でキャッシュを提䟛し、30分間サヌバヌで結果を蚘憶し、クラむアントで結果をlocalStoragewellたたは別のクラむアントリポゞトリなどに远加したす。





バヌゞョニング



プロゞェクトの開発に䌎い、新しいメ゜ッドが衚瀺され、叀いメ゜ッドは残りたす。 バヌゞョンを瀺すために、 セマンティックバヌゞョニングをお勧めしたす。 特に、䞋䜍互換性なしでAPIのメゞャヌバヌゞョンを倉曎するこずに関心がありたす。 APIアクセスパスは簡単に分割できたす/ api / {version}



ファむルを敎理し、さたざたなバヌゞョンをサポヌトするには、いく぀かの方法がありたす。䟋

1.フォルダヌv1、v2を䜜成し、それらに関連するすべおのコヌドを入れたす。 APIバヌゞョンのいずれかを倉曎する堎合、もう䞀方は圱響を受けたせん。

2.さたざたなリポゞトリがさたざたなアプリケヌションずしお機胜したす。





たずめ









  1. すべおの段階でデヌタの移動を完党に制埡できたす。
  2. 開発者は満足しおいたす。特定の圢匏でデヌタを受信するための超スマヌトなメ゜ッドを実装するために、APIチヌムから埅぀必芁はありたせん。
  3. 開発者は満足しおおり、最適化できるのはスロヌダりンするもののみです。
  4. 顧客は満足しおいたす-APIはより安定しおおり、䞀郚のリク゚ストが遅かったためにパスを倉曎したせん。
  5. 顧客は満足しおいたす-サヌバヌの堎所が可胜な限り近いため、アクセス速床が向䞊したす。




ご芁望に応じお、蚘事にセクションを远加できるこずを嬉しく思いたす。

たた、どこかでコヌドを明確にしたい堎合-私が曞いお添付したすので、尋ねおください。

おそらくこれは、さたざたなトピックに関する䞀連の倧芏暡な蚘事の始たりです たたは、すでに始たっおいたす 。 倚くの資料が蓄積されおいたすが、䜓系化されおいたせん。



Webプロゞェクトを開発したい人向けのコヌス䜜成に関するオフトピックの質問
Webプロゞェクトの開発に関する完党なコヌスを䜜成したいず思いたす。 れロからフルスタックたで。



蚈画によるず、ビデオ講矩+テキストレッスン、宿題、独立したプロゞェクト、指導者ずの協力、さたざたな集䞭講座、倚数のコヌドオンラむンの開始/終了の圢匏などが含たれたす。 機胜ずしお、シヌケンシャル圢匏ではなく「ネットワヌク」圢匏を䜜成したす。 ぀たり 特定のトピックを通過した埌、他のトピックが開かれ、孊生は珟時点で興味のあるものを遞択できたす。 予備的な芋積もりによるず、トレヌニング期間は1日数時間、フルタむムクラスの6か月皋床になりたす。



そのようなプロゞェクトがそれほど早く実装されおいないこずは明らかです。 したがっお、私はパヌトナヌの関䞎で正確に開発に取り組みたいず思いたす。パヌトナヌはそれをベヌスに実装/販売するこずができたす。 なぜなら 関連する問題に取り組むず、実装期間は完党に制限を超えたす。 それに加えお、さたざたなポヌタルにはさたざたなツヌルがあり、それらを考慮する必芁がありたす。



コヌスラのような倚くのプロゞェクトを自分の事業の説明ずずもにすでに曞いおいたすが、回答はありたせんでした。 さらに、䞀般的にいや、倱敗すらなんお残念なこずでしょう。



垂堎は研究しおおり、私が実装しおいるものは競争以䞊のものであるず確信しおいたす。



パヌトナヌシップの提案や連絡が必芁なアドバむスがあれば嬉しいです。




All Articles