Связи в представлениях JSON - PullRequest
       13

Связи в представлениях JSON

48 голосов
/ 09 августа 2011

Я разрабатываю RESTful API на основе представлений JSON. Чтобы соответствовать 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, но не все мои ресурсы соответствуют существующим типам отношений. Или можно использовать self при обращении к автору / тегу / комментарию, поскольку оно относится к контексту включающего JSON (под) объекта? Что означает семантическая сущность self?

RFC 5988 заявляет:

Контекст ссылки является либо IRI канала, либо идентификатором записи, в зависимости от того, где он появляется

Как я могу интерпретировать это с точки зрения JSON? Является ли каждый новый объект {…} новым контекстом?

Спасибо!

Ответы [ 3 ]

13 голосов
/ 10 августа 2011

Это отличный вопрос.Если вы посмотрите на пример для Hal , вы увидите, что rel определены в контексте подресурса.
Я не знаю какого-либо определенного руководства, когда rel связан сресурс в целом или отдельный субресурс.
Единственная дополнительная информация, на которую я могу указать, - это параметр привязки в RFC5988, который позволяет переопределить IRI контекста, используя либо фрагмент, либо совершенно новый URI.

В идеале ваш медиатип должен указывать, отличается ли IRI контекста для вложенных ресурсов или нужно явно изменить IRI контекста.Это было бы еще одним преимуществом использования типа мультимедиа, такого как application / vnd.hal + json вместо простого старого application / json, поскольку спецификация Hal гласит:

@ rel - для определения того, как соотносится целевой URIна «Тематический ресурс».Subject Resource является ближайшим родительским элементом Resource.

8 голосов
/ 10 декабря 2013

LSON-LD

Вы можете взглянуть на JSON-LD (нотация объектов JavaScript для Связанные данные . Это выглядит сложнее, чем HAL , но вы можете сделать больше с этим.

JSON-LD стандартизируется внутри W3C, вот рекомендация предложения .

Также

Извините, у меня нет времени привести пример ..

0 голосов
/ 22 сентября 2013

Слишком поздно ответить на этот вопрос, но для дальнейшего использования, вот как я решаю эту проблему:

{
   "blogpost":{
      "title":"foobar",
      "content":"A long article here…",
      "link":{
         "rel":"self",
         "href":"http://blog/post/4711"
      },
      "link":{
         "rel": "author",
         "href": "http://author/uri",
         "alt":"Bob"
      },
      "link":{
        "rel": "comment",
        "alt": "great article",
        "href":"http://blog/post/4711/comment/1"
      },
      "link": {
        "rel":"tag",
        "href":"http://blog/post/4711/tag/foo",
        "alt":"foo"
      }
   }
}

когда вы думаете об этом, комментарии, теги и т. Д. - это все отдельные ресурсы, связанные с вашим постом ... почему бы не сделать их такими, какие они есть .. ссылки! Вы даже экономите на размере своего ответа;)

...