Как я должен обрабатывать ссылки и ссылки HATEOAS в JSON?

Я в процессе разработки REST api и быть таким же спокойным, как он получает. Я хочу включить HATEOAS в ответы json.

добавление URL-адресов к связанным ресурсам достаточно просто, но было некоторое обсуждение структуры для использования этих ссылок.

многие статьи, которые я нашел, используют структуру, заимствованную из атом ленты:

"links": [ 
    {"rel": "self", "href":"http://example.org/entity/1"},
    {"rel": "friends", "href":"http://example.org/entity/1/friends"}, ... 
]

Это вызвало некоторые вопросы:

  • зачем использовать массив в качестве контейнера? согласно разработчику javascript, которого я знаю, доступ к ссылкам будет проще с ссылками как свойствами объекта. Например:

    "self":    { "href":"http://example.org/entity/1" }, /* (facebook uses this) */  
    "friends": { "href":"http://example.org/entity/1/friends", "type": "..."}
    
  • есть ли общая структура json (опять рядом с адаптацией атома) для описания ссылок в свойствах ресурсов? (например, отправитель сообщения).

    ссылка вероятно, следует снова разрешить как url-адрес, но было бы плохо включить простой идентификатор? вроде как:

    "sender": { 
        "id": 12345,
        "href": "resource-uri"
    }
    

мой способ мышления заключается в том, что, хотя HATEOAS делает это так, что клиенту не нужно много знаний для использования API, я неохотно удаляю возможность использовать эти знания (например, доступ к изображению профиля, создавая клиентскую сторону ссылки, не глядя на пользователя в первую очередь).

3 ответов


я перезапустил эту тему в группе API-Craft google и получил отличные ответы.

основными преимуществами конструкции массива:

  • несколько ссылок для одного и того же отношения
  • несколько отношений для одной и той же ссылки без написания ссылки aggain
  • возможность заказать ссылки

карта причин имеет лучшую доступность.

насколько структура идет там много возможности:

Я думаю, я пойду с HAL, так как это самое чистое решение, остальные все выглядят вроде... странно для JSON.


Что касается структуры, вы можете попробовать посмотреть на HAL (http://stateless.co/hal_specification.html) или JSON-LD: (http://json-ld.org/)


Я думаю, что это так, что вы можете предложить несколько ссылок на основе метода http.

например

"links": [ 
    {"rel": "sender", "method":"post", "href":"http://example.org/entity/1"},
    {"rel": "sender", "method":"put", "href":"http://example.org/entity/1"}, ... 
]

возможно, вы могли бы адаптировать это к своей идее

"sender": { 
     "href":"http://example.org/entity/1",
     "methods": ["put","post"]
}