1

CRUDRESTAPIがtweetsリソースのアイデアをどのように実装するかについて興味があります。もちろん、Twitterなどのアプリケーションにはtweetオブジェクトの概念がありますが、これらはさまざまな方法(「コレクション」)でアプリケーションに必要です。

Twitterには、タイムライン(特定のユーザーによって公開された)とタイムライン(ユーザーがフォローしているユーザーからのツイートのタイムライン)のエンドポイントがuser必要tweetsですhome。CRUD APIでは、userタイムラインは次のようなURIに配置されると思います。tweets?filter={username:"Bob"}

ただし、CRUDAPIデザインがhomeツイートのタイムラインコレクションをどのように実装するかはよくわかりません。さらに、ユーザー向けなどのコレクションfavourites—これらは完全に別個のリソースとして扱われますか、それとも何らかの方法でtweetsリソースにアタッチする必要がありますか?

さらに、TwitterはAPIにCRUDデザインを使用していません。多分これには正当な理由がありますか?

4

1 に答える 1

2

リソース設計の良いところは、(ある程度) 理にかなっている限り、それほど重要ではないということです。明らかに、いくつかのニュアンスが整っていますが、ポイントに行きましょう. ビジネス モデルはリソースに 1:1 をマップしません (する必要はありません)。これがおそらく、Twitter API でそのような関係が見つからない理由です。

いくつかの仮定: タイムラインは事前に定義されており、その動作は影響を受けない、または新しいツイートを作成することによる。お気に入りはツイート (への参照) です。お気に入りは影響力があります。

お気に入りのコレクション リソースは次のようになります。

  • /user/bob/favorites

「CRUD」操作は次のようになります。

  • [POST] /user/bob/favorite{ "tweet_id": "343fe4a" } -- 新しいお気に入りを追加
  • [GET] /user/bob/favorite-- ユーザー Bob のすべてのお気に入り
  • [DELETE] /user/bob/favorite/343fe4a-- ツイート 343fe4a をお気に入りとして削除

通常、1 つのリソースに複数の変数を含めることは避けるのが最善です。これにより、不要な複雑さが生じるからです。ただし、この例では、お気に入りには独自の識別子がありません。代わりに、ツイートの識別子を再利用し、ユーザーと密結合しています。

お気に入りに独自の識別子がある場合は、次のようなリソースを作成します。/favorite/ef213e13fこれは、メタデータを返したり、HTTP GET メソッドのツイートへのエイリアス (リダイレクト) として機能したり、何かを「お気に入りから外す」ためのリソースとして機能したりできます。 (DELETE メソッド)。

ツイートについてではなく、記事やコメントを含むブログについて話している場合、このステートメントはおそらくより理にかなっています。

  • /blog/article/42-- 記事を表す
  • /blog/article/42/comments-- この記事のすべてのコメントのコレクションを表します
  • /blog/comment/44571-- 単一のコメントを表す

必要に応じて、タイムラインのいくつかの例を次のようなリソースにすることができます。

  1. /user/bob/timeline/home
  2. /user/bob/timeline?type=home
  3. /timeline/home?user=bob

前述したように、1 つのリソースで複数の変数を使用することは避けるのが最善です。おそらくオプション 3 を選択します。理由は、変数が多すぎるという複雑さに加えて、そのようなリソースは (クライアント側で) キャッシュする価値がなく、CUD アクションが実行されない可能性があるためです。さまざまなエンティティの集約リソースである可能性が最も高いためです。

締めくくりの言葉:

  • 最初にリソースを設計してから、一致する URL を考え出す
  • リソースを 1 対 1 で (ビジネス) モデルに設計しない
  • 最初から状況を考えすぎないでください。何かを実装し、それをいじって、将来起こりうる問題を確認します。満足したら、製品に入れます。

さらに読むための提案:

于 2013-03-14T15:13:16.320 に答える