2

zap2it TV Listingsのような TV リスト アプリの JSON データを返す API を想像してみてください。

これは基本的に、TV チャンネルのリストであり、各チャンネルについて現在およびそれ以降に放送されている番組です。現在、すべてのチャンネルを返す API がありますGET /channels。ただし、そのデータにチャンネルごとに現在オンになっている番組を追加する必要があります。GET /channels/on_now現在の API との差別化のために、新しい API を追加することを考えています。新しい API について明確にしたいのですが、チャンネルごとに個別の呼び出しを行いたくありません。show-on-now データはすべてのチャンネルに対して返される必要があります。これは良い REST API 設計ですか?

現在のGET /channelsJSON データ

[
   "channel": {
      "channelName": "KRON4",
    },
   "channel": {
      "channelName": "KTOV5",
    },
   ...
]

GET /channels/on_now以下の新しい API に期待される JSON データ

[
  {
   "channel": {
      "channelName": "KRON4",
    },
    "on_now": {
      "startTime": "2012-06-04T11:30:00",
      "endTime": "2012-06-04T12:00:00",
      "shortDescription": "Latest local, statewide & national news events, along with sports & weather.",
      "shortTitle": "4:30am Newscast"
    }
  },
  {
   "channel": {
      "channelName": "KTOV5",
    },
    "on_now": {
      "startTime": "2012-06-04T11:30:00",
      "endTime": "2012-06-04T12:30:00",
      "shortDescription": "Local morning news and weather report",
      "shortTitle": "Morning Newscast"
    }
  },
  ...next channel...
]
4

5 に答える 5

3

URL ではなく、コンテンツに集中することをお勧めします。

例: エントリ ポイント '/' があります。これは、API 内の唯一の URL です。GET して st を返す

{
    "channels" : {
        "href" : "path.to/channels"
        },
    "programs" : {
        "href" : "path.to/programs"
        }
}

チャネルのリストを取得するには、対応する URL で GET を実行します (事前に知る必要はありません)。たとえば、次のように取得します。

[
    {
        "name" : "BBC",
        "id" : 452,
        "href" : "path.to/channels/452"
    },
    {
        "name" : "FOO",
        "id"   : 112,
        "href" : "path.to/channels/112"
    }
] 

BBC に関する詳細情報については、提供された URL で GET します。

{
    "name" : "BBC",
    "id" : 452,
    "self" : "path.to/channels/452",
    "live_url" : "link.to.bbc.cast",
    "whatever" : "bar",
    "current" : "path.to/channels/452/current",
    "program" : "path.to/channels/452/program"
}

等々。URL はオンザフライで検出されます。いつでも自由に変更できます。API を構成するのはコンテンツです。返されるもの (フィールド、タイプなど) についてクライアントと合意する必要があります。最後に、上記の「現在の」URL を呼び出して、現在のプログラムに関する情報を取得します。

詳細については、こちらをお読みください: http://kellabyte.com/2011/09/04/clarifying-rest/

OPコメントの後に編集:

リクエストの量を制限するために「埋め込み」パラメータを導入できます。

GET path.to/channels/452?embed=current

戻ります:

{
    "name" : "BBC",
    "id" : 452,
    "self" : "path.to/channels/452",
    "live_url" : "link.to.bbc.cast",
    "whatever" : "bar",
    "current" : {
        "self" : "path.to/channels/452/current",
        "name" : "Morning Show",
        "start_time" : "(datetime here)",
        "end_time"   : "(datetime here)",
        "next"       : "whatever.comes.ne/xt"
        },
    "program" : "path.to/channels/452/program"
}
于 2012-06-04T23:09:07.957 に答える
2

あなたは尋ねました:

これは良い REST API 設計ですか?

はい、そうです。

回答した他の人々とは対照的に、名詞を表す限り、自由にリソースを定義できます。これには、「現在のテレビ番組」や「<city> の現在の天気」など、時間に依存するサービスが含まれます。これらのサービス リソースは、番組やチャンネルを表すより静的なリソースと同様に有効です。

ただし、URI を変更します。/channelsコレクション リソース URI のように見えます。子は次のようなチャネルになると/channels/kron4思います (インスタンス リソースを識別するために、ID ではなく任意の一意の文字列を使用できます)。
そのため、/channels/on_now奇妙に見えます。「on_now」というチャンネルのようです。それを使用することを妨げるものは何もありませんが、後で「On Now」と呼ばれるチャネルと競合する可能性があります! 私は単に/on_nowあなたのURIとして使用します。 /channels/kron4/on_now単一チャネルの応答にも明らかに適しています。

于 2012-12-05T12:30:28.460 に答える
1

上記の回答に追加するだけです:

/Channels/bbc/Shows/time/now -----> Get all the show played on BBC now
/Channels/bbc/Shows/time/2011-03-27T03:00:00.000+02:00 -----> Get all the show played on BBC  on 2011-03-27T03:00:00.000+02:00 .

これはより拡張性が高く、current という名前の番組について心配する必要はありません。

編集: ここで api-doc アクセスを取得できれば、そのようなことを行うのに有利なスタートを切ることができますhttps://developer.sdp.nds.com/page/about

私によると、より多くのデータが必要になり、API は次のようになります: //epg?time=&start=0&limit=1&duration=

これは、時間と期間に基づいて位置情報ベースの tv_listing 情報を取得する汎用 API を定義します。結果は、指定された期間内に発生するチャネル リスト間のすべての番組でページ付けされます。

于 2012-06-04T23:05:31.883 に答える
1
/Channels -----------------------> Get All Channels
/Channels/bbc  ------------------> Get BBC Channel
/Channels/bbc/Shows -------------> Get All shows in BBC
/Channels/bbc/Shows/Baseball ----> Get the show called "Baseball", in bbc channel
/Channels/bbc/Shows/current -----> Get the Current show running, in bbc channel

あなたのチャンネルのいずれかのために呼び出されたショーを持っていない (そしてしない) と仮定しますCurrent! :) 。

于 2012-06-04T21:50:11.287 に答える