Будет ли этот формат ответа RESTful JSON совместимым с HATEOAS?

Работая над REST API для работы, я столкнулся с проблемой, когда я хочу передать значение, представляющее связь, а также URL-адрес этой связи, чтобы он мог быть совместим с HATEOAS.

Я думаю, что нашел подходящее решение, но хотел бы получить подтверждение от тех, у кого больше знаний, чем у меня.

Будет ли этот ответ RESTful JSON соответствовать принципам HATEOAS?

{
  "employee":{
      "empId":12345,
      "fName":"Bubba",
      "lName":"Gump",
      "title":"Shrimp",
      "reportsTo":54321,
      "hateoas":{
          "self":"http://www.bubbagumpshrimp.com/rest/Employees/12345",
          "reportsTo":"http://www.bubbagumpshrimp.com/rest/Employees/54321",
          "directReports":"http://www.bubbagumpshrimp.com/rest/Employees/?reportsTo=12345"
      }
  }
}

Так что вы все думаете? Такой формат будет работать?

Основываясь на предложении @fumanchu ниже, это формат, который я сейчас попробую использовать...

{
    "employee":{
        "empId":12345,
        "fName":"Bubba",
        "lName":"Gump",
        "title":"Shrimp",
        "reportsTo":54321,
        "hateoas":{
            "collection":"http://www.bubbagumpshrimp.com/rest/Employees/",
            "self":"12345",
            "reportsTo":"54321",
            "directReports":"12345/DirectReports"
        }
    }
}

Спасибо за руководство!


person hypno7oad    schedule 13.02.2012    source источник


Ответы (1)


Он "работает", но избыточен. Если у вас есть URI, зачем хранить голые идентификаторы, которые ничего не сообщают об их семантике или о том, как их следует использовать? Я бы рекомендовал вам попробовать это вместо этого:

{
    "employee":{
        "self":"http://www.bubbagumpshrimp.com/rest/Employees/12345",
        "fName":"Bubba",
        "lName":"Gump",
        "title":"Shrimp",
        "reportsTo":"http://www.bubbagumpshrimp.com/rest/Employees/54321",
        "directReports":"http://www.bubbagumpshrimp.com/rest/Employees/12345/directReports"
    }
}

(Нет причин выставлять ресурс «directReports» как «?reportsTo=12345». Всегда лучше идентифицировать его по его значению, чем по его реализации.)

Если вы контролируете свой API и/или тип носителя (и вы должны это делать, чтобы сообщить своим клиентам, где ожидать URI, поскольку JSON не определяет их), вы даже можете сократить это, объявив, что «reportsTo», а значения «directReports» — это URI, которые относятся к «я»:

{
    "employee":{
        "self":"http://www.bubbagumpshrimp.com/rest/Employees/12345",
        "fName":"Bubba",
        "lName":"Gump",
        "title":"Shrimp",
        "reportsTo":"54321",
        "directReports":"12345/directReports"
    }
}
person fumanchu    schedule 14.02.2012
comment
Да, это лишнее :/ . Причина, по которой я выбрал формат, заключалась в том, как моя серверная технология обрабатывает перевод ресурсов в ответы XML или JSON. (Я использую аннотации Java JAX-RS для JAXB POJO). То, как я это делаю сейчас, позволяет авторам и читателям ответов Java по умолчанию обрабатывать все HTTP-команды с помощью одного POJO, что уменьшает общее количество строк кода и сложность. Простота программирования действительно важна, так как я пытаюсь разработать шаблон для других программистов, незнакомых с Java или REST. (Не идеальный я знаю, но такова корпоративная среда). - person hypno7oad; 14.02.2012