web-dev-qa-db-ja.com

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

私はモバイル側で新しい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つの呼び出しで取得する必要があります。

リスクは、Restful APIが最も多くなり、応答のないモバイルアプリが最も役に立たなくなる可能性があることです。

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

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

25
MikaelW

設計されている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なデザインの問題ではありません。これは実際のa 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 -to-1(データベース行を使用)これは不要であり、推奨されません。

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

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

これがジムウェバーがこれについてより詳細に議論しているところです(Railsも同様に!)

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

27
Cormac Mulhall