web-dev-qa-db-ja.com

JSON表現での関係のリンク

JSON表現に基づいてRESTful APIを設計しています。 HATEOASに準拠するために、リソース間のリンクを広く使用しています。したがって、ATOMリンクと非常によく似た方法でリンクをシリアル化するために この提案 に従いました。

現在、正しいリンク関係タイプを特定するのに問題があることがあります。リソースにそれ自体へのリンクが含まれている場合、self関係は明白です。リソースがサブリソースのコレクションや集約である場合、または関連リソースへのリンクが多数含まれている場合は、さらに複雑になります。

ブログ投稿を例に取り、このブログ投稿の作成者、タグ、コメントなど、ブログ投稿のスナップショットを返すリソースを考えてみてください。明らかに、このリソースには多くのサブリソースが含まれており、もちろんそれらへの個別のリンクも提供する必要があります。

サンプルリソース:

{
   "blogpost":{
      "link":{
         "rel":"self",
         "href":"http://blog/post/4711"
      },
      "author":{
         "name":"Bob",
         "link":{
            "rel":"???",
            "href":"http://author/uri"
         }
      },
      "title":"foobar",
      "content":"A long article here…",
      "comments":[
         {
            "comment":"great article",
            "link":{
               "rel":"???",
               "href":"http://blog/post/4711/comment/1"
            },
            "author":{
               "name":"John Doe",
               "link":{
                  "rel":"???",
                  "href":"http://author/uri"
               }
            }
         }
      ],
      "tags":[
         {
            "value":"foo",
            "link":{
               "rel":"???",
               "href":"http://blog/post/4711/tag/foo"
            }
         }
      ]
   }
}

それで、与えられたリンクに適切な関係は何ですか? tagなどの関係タイプがあることは知っていますが、私のリソースのすべてが既存の関係タイプと一致するわけではありません。それとも、それを囲むJSON(サブ)オブジェクトのコンテキストに関連しているため、author/tag/commentを参照するときにselfを使用しても問題ありませんか? selfが意味するエンティティは何ですか?

RFC 5988は次のように述べています:

リンクのコンテキストは、表示場所に応じて、フィードIRIまたはエントリIDのいずれかです。

これをJSONでどのように解釈できますか?新しいオブジェクト{…}はそれぞれ新しいコンテキストですか?

ありがとう!

48
b_erb

それは素晴らしい質問です。 Hal の例を見ると、サブリソースのコンテキスト内でrelが定義されていることがわかります。
relがリソース全体または含まれているサブリソースに関連しているときの決定的なガイドは知りません。
指摘できる唯一の追加情報は、RFC5988のアンカーパラメータで、フラグメントまたは完全に新しいURIを使用してコンテキストIRIを再定義できます。

理想的には、メディアタイプは、ネストされたリソースのコンテキストIRIが異なるかどうか、またはコンテキストIRIを明示的に変更する必要があるかどうかを示す必要があります。これは、Hal仕様で述べられているように、プレーンな古いapplication/jsonではなく、application/vnd.hal + jsonのようなメディアタイプを使用するもう1つの利点です。

@rel-ターゲットURIが「サブジェクトリソース」にどのように関連するかを識別するため。サブジェクトリソースは、最も近い親リソース要素です。

13
Darrel Miller

LSON-LD

JSON-LDLinked Data のJavaScriptオブジェクト表記法)を見てください。 [〜#〜] hal [〜よりも複雑に見えます#〜] しかし、それを使ってもっと多くのことができます。

JSON-LDはW3C内で標準化されています これは提案の推奨事項です

また

申し訳ありませんが、例を提供する時間はありません。

8
Yves M.