REST API-モバイル固有の課題


25

モバイル側で、新しいiOSアプリプロジェクトに取り組んでいます。いくつかのアーキテクチャの変更が行われているため、構築中のアプリやWebサイトなどの他のクライアントが使用するカスタムビルドのプライベートAPIに依存する必要があります。

設計されているAPIは、HTTP動詞にマップされるリソース中心のURIおよびCRUD操作のRestスタイルに従います。次のようなもの:

GET www.example.com/books
DELETE www.example.com/books/482094
POST www.example.com/users/6793

問題は、このスタイルでは、多くの場合、モバイルクライアントが単一のアプリ画面の読み込みや単一のユーザーUIアクションの管理を行う必要が生じることです。これにより、必要なものがすべて揃うまで、アプリは8秒間ロードモードになります。低速で応答しないアプリ。

接続に関しては、モバイルクライアントには重大な制限があるため、理想的には次のようなルールに従う必要があります。

1画面== 1 API呼び出し

1保存== 1 API呼び出し。

これにより、REST設計の原則との衝突コースに入る多くの状況があります。例:

  • アプリが1日間オフラインで、バックエンドデータベースの4つのテーブルと同期する必要があり、次のような呼び出しが必要だとします www.example.com/sync_everything?since=2015-07-24
  • ユーザーが自分のオブジェクトの多くを編集できる画面があるとしましょう。たとえば、todoリストでタスクをチェックします。編集ごとに1つのAPI呼び出しを行うのではなく、1つのバッチAPI呼び出しですべてのタスクレコードを編集する方法が必要です。
  • ORDER、SALESMEN、およびPRODUCT dbテーブルからの情報を混合する画面があるとしましょう。3つではなく1つの呼び出しでそのデータを取得する必要があります。

リスクは、最も安らかなAPIが存在し、また、最も役に立たない無反応のモバイルアプリが存在する可能性があることです。

問題は、私はただの新しい請負業者であり、私が必要なのは、私がそれらのポイントを作るのに役立つもの、尊敬される情報源からの記事、またはそのようなものです。モバイルクライアントのRESTスタイルで妥協している主要なプレーヤー(例:複合集計APIエンドポイントの使用による)。

または、この一般的な問題の解決策。ありがとう!


3
あなたの質問は、「RESTスタイルを保持しつつ、APIがオブジェクトのコレクションと同種または異種の埋め込みオブジェクトをどのように配信できるのか」という質問のように聞こえます。あなたの質問を理解していますか?
joshp

一般的な答えは、各REST呼び出しがさまざまなオプションのパラメーターを取る必要があるため、柔軟でありながら比較的直感的であることができると考えています。同期の場合は常に注意が必要ですが、通常のページでは通常、同じタイプの複数の呼び出し、つまりすべてのGETを確認していますか?
Ixrec

1
問題が並列リクエストの欠如である場合 APIの適応は間違った解決策だと思います。8つの小さなリクエストは、互いに待つ必要がない大きな1つのリクエストよりもそれほど悪くはありません。HTTP / 2に切り替えることはできますか?または、少なくともHTTP / 1.1パイプラインを使用しますか?
アモン

参照:REST Webサービスでバッチ操作を処理するためのパターン?。重要なのは、どの種類のコマンド(およびどのような前提条件)が競合することなくバッチ処理できるかを特定し、バッチ処理された順序のJSON表現を作成してから送信することです。キャッシュ機能であるRESTの主な魅力は失われますが、キャッシュ機能はすべての種類のアプリケーションに常に関連するとは限りません。論理的な依存関係がある場合、バッチ/同時実行性は適用できないことに注意してください。
rwong

中間者がシーケンス内の複数の操作を実行する必要がある状況の類推は、先行する各操作に重要な論理依存関係があり、「ストアドプロシージャ」のようなもので、データベース内ではなくその仲介者で実行されます。その下では、ミドルマンは単一の「ストアドプロシージャ」コールを必要な数のRESTfulリクエストに変換できますが、それはミドルマンの実装の詳細です。
rwong

回答:


27

設計されているAPIは、HTTP動詞にマップされるリソース中心のURIおよびCRUD操作のRestスタイルに従います。

これがあなたの問題です。

データベース内のモデルにリソースを制限しました(と仮定しています)。サーバーにはデータベースに表現のないリソースの概念がないため、これらすべてのリソースをロードするには時間がかかります。

たとえば

www.example.com/books/482094
www.example.com/books/582045
www.example.com/books/427454
www.example.com/books/319343

ライブラリを取得するためにすべてをロードする必要がある

これはRESTfulなデザインの問題ではなく、これは実際のRESTアンチパターンです。RESTには、データベースモデルを含むシステムの他のリソースとの1対1のマッピングがリソースに必要であると言う絶対的なものはありません。

解決策は、ロードするものによりよく一致するリソースをさらに作成することです。常に一緒になる5つのリソースがある場合、それらの5つのリソースの情報を含む新しいリソースを作成します。

あなたが持っているべきものはこのようなものです

www.example.com/users/334/my_library

そのユーザーのすべての書籍が読み込まれます。「my_library」はデータベースのモデルではありませんが、リソースです。サーバーはデータベース内のモデルに基づいて作成しますが、1対1のマッピングはなく、サーバーはDBモデルを変更せずにこのリソースを作成する柔軟性を備えています。

あなたも持っているかもしれません

www.example.com/users/334/favioured_books
www.example.com/users/334/books_ordered_last_week
www.example.com/users/334/wishlist

データベースまたはドメイン空間にモデルとして存在する必要はありません。

Railsのようなフレームワークは、リソースを1対1の方法でドメイン空間のモデルにデータベースの行と1対1で再びマップするように人々に教えたため、これは間違ったことだと誤解されています。これは必要ではなく、推奨されません。

リソースは多数、安価で軽量でなければなりません。それらは簡単に作成でき、ドメインモデルから抽象化する必要があります。新しいものが必要な場合は、新しいものを作成してください。それを実行するのに問題がある場合、それはRESTの障害ではなくフレームワークの障害です。

もちろん、フレームワークでこれを行うことができるかどうかは、もちろん大きな問題です。「時間を節約する」ために1対1をマップするコースを取っているRailsやDjangoのようなフレームワークは、これを行うのを難しくしています。しかし、それはフレームワークの欠陥であり、RESTfulな設計の欠陥ではありません。

これは、Jim Webberがこれについてより詳細に議論している(Railsのいくつかの掘り下げも含む!)

https://yow.eventer.com/yow-2011-1004/domain-driven-design-for-restful-systems-by-jim-webber-1047


これは非常に興味深いことであり、私はこれに完全に同意しますが、悲しいことに、私はAPIを実行している人ではないため、影響を与える方法はありません。多くの人がその「アンチパターン」を使用し(多くの理由で、フレームワークの制限が1つである)、データベースについて明確に考えるためにURI定義を使用します。APIエンドポイントは、DBを視覚化する別の方法にすぎません...また、場合によっては、オブジェクトが実際には異なるため、説明したようなリソースを作成するのが難しい場合があります。
ミカエルW

効率性の観点から問題に戻るために、彼らは、モバイル画面が非常に遅い場合(そしてこれが発生した場合のみ)、いくつかの複合呼び出しが可能ですが、APIをラップするコンポーネントに座っていることに同意しました( API自体ではなく)モバイルクライアントのみが使用し、コアAPIであるコアドメインの一部とは見なされません。
-MikaelW

@MikaelW、あなたは正しい。Cormacが言った理想的なシナリオでも、他の多くのシステム(デスクトップ、モバイル、Web、スケジュールされたジョブ、レガシーシステムなど)に参加する必要があるAPIを使用している場合があります。この種類のAPIは非常に柔軟である必要があり、可能な限り多くの可能性に対応するリソースを提供しますが、1人の消費者の特定のパフォーマンス要件すべてに対応することはできません。その場合、多くの選択肢はありません
...-デリック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.