REST APIの設計:複数の呼び出しとAPIの単一の呼び出し


18

モバイルアプリで使用されるeコマースWebサイト用のRest APIを開発しています。

アプリのホームページでは、スライダー、トップブランド、ベストセラー製品、トレンド製品などの複数のリソースを呼び出す必要があります。

API呼び出しを行うための2つのオプション:

シングルコール:

www.example.com/api/GetAllInHome

複数の呼び出し:

www.example.com/api/GetSliders

www.example.com/api/GetTopBrands

www.example.com/api/GetBestSellingProducts

www.example.com/api/GetTrendingProducts

残りのAPI設計に最適なアプローチはどれですか。単一呼び出しか複数呼び出しか、長所と短所を説明してください。

どちらがリクエストに応答するのに時間がかかりますか?

回答:


14

理論複数の同時呼び出しが同じくらい速く、より柔軟です。

ただし、実際には、ページをロードしてからそのページの各部分をロードすると、結果が返されるまでロードスピナーが表示され、結果は遅くなり、ばらばらになります。

このため、データのAJAXリクエストは控えめに使用する必要があります。ページのセクションが読み込みが遅いか、ページの残りのサイクルとは異なるサイクルで更新する必要がある場合にのみ使用してください。マスターから詳細を表示します。マスターからオプションを選択し、マスターをリロードせずに対応する詳細を表示します。

一般的な設計は、コーディングの柔軟性とマイクロサービスの懸念のために別個のAPIを保持し、Webサイトのデータサーバー側を結合することです。そのため、クライアントは自分のWebサイトに1回だけ呼び出す必要があります。適切なキャッシングを使用したAPI呼び出しは、データセンター内で高速である必要があります。

また、クライアントAPI呼び出しをまったく行わないことを検討してください。HTMLサーバー側を生成するだけです。javascriptシングルページアプリフレームワークは、APIルートを押し下げます。通常、大量の電子商取引サイトに最適なアプローチではありません。

ここに画像の説明を入力してください


おかげで、実際にはこのAPIはAndroidおよびi電話アプリで消費されています。スライダー、ブランド、単一のAPI呼び出しで製品を取得するか、個々のリソースのAPIを個別に呼び出すと、アプリのホームページがいつ読み込まれるかを知りたいですユーザーは下にスクロールしますか?
shaijut

同じロジックが適用され、不要な場合の同時呼び出しを最小限に抑えます。ただし、アプリを使用すると、バックグラウンドで情報をダウンロードする柔軟性が少し高くなります。GetChangesSInce(date)アプローチに切り替えることをお勧めします
Ewan

結論として、アプリのホームページが読み込まれたときにすべてのホームページリソースの応答を一度に呼び出す単一のAPIを持ち、ページのセクションを更新する場合はスライダー、ブランドなどのマイクロAPIに対して別々のAPIを別々に使用するのが最善です?
shaijut

これらのセクションにページ/メインデータが読み込まれないだけの正当な理由がない限り、そうではありません
ユアン

アマゾンやフリップカートのようなアプリはどのように機能するのでしょうか?ユーザーがアプリを開いたときに、1回の呼び出しですべてのホームページリソースをロードしませんか?これに対する最善のアプローチは何かを知りたいです。
shaijut

5

TL; DR:他のすべてのアプリケーションの考慮事項は別として、単一の呼び出しを実行すると、複数の呼び出しを実行するよりも速くなります。呼び出しを非同期で実行すると、ユーザーの観点から特定の操作を完了するために必要な全体の時間(これで十分な場合もあります)を削減できますが、合計すると、複数の呼び出しにかかる時間はさらに長くなります。

ただし、あなたの場合、それが完全なストーリーかどうかはわかりません。

REST APIは、アイディアを一般的にした論文のさまざまな解釈のために、少し曖昧な用語です。しかし、REST APIを構成するものの最もリベラルな解釈でさえ、あなたが持っているものは実際には適合しません。

基本原則は、アクションを実行するリソースがあることです。URIは、関心のあるリソースを識別します。通常、HTTP動詞を使用して、そのリソースに対して何をしたいのかを示します。

特定のケースでは、すべてのメソッドの名前に「get」という単語が含まれています。HTTPリクエストで使用される動詞を変更して、その場所で利用可能なリソースを「取得」することを示す必要があります。

URIスキームは、APIのユーザーが利用できるようにするリソースの論理階層を表す必要があります。そのため、この場合/api/products?category=sliders、製品のコレクションをフィルタリングするようなものを使用することを検討します。これは、クライアントがすべての製品を取得したいときに、クエリ文字列を単に省略できることを意味します。


おかげで、あなたが、単一の意味url異なるリソースへのクエリ文字列を使用して行われるべきであるAPIが、要求のために?、これも確認してください。
shaijut

はい、呼び出しを非同期で実行すると、データを取得するのに必要な絶対時間が短縮されますが、全体としては、さらに時間がかかります。より多くの呼び出しは、TCP接続のオーバーヘッドと通信の往復を繰り返す必要があります。keep-alivearentのような機能を使用しても、これは完全に削除されます。
richzilla

カテゴリは、個々の製品リソースのプロパティになります。論理的に、あなたは、製品のコレクションを取得し、指定されたカテゴリを持つすべてのものをフィルタリングすることでしょう
richzilla

つまり、ユーザーがアプリのホームページを開いたときに、上記のすべてのリソースを返すAPIに1回コールする必要がありますか?または彼がスクロールしたときに、特定のリソースに対して個別の呼び出しを行う必要がありますが、これはベストプラクティスです。
shaijut

ユーザーがアプリケーションの各ポイントで何を期待するかによって異なります。あなたはをクリックすると、例えば、このウェブサイトを取るquestionsあなたURIが表示さ/questionsあなたのお気に入りのタグのいずれかをクリックすると、URIは、/questions/tagged/<tagname>
richzilla
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.