Будет ли этот формат ответа RESTful JSON соответствовать HATEOAS? - PullRequest
3 голосов
/ 13 февраля 2012

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

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

Будет ли этот ответ 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"
        }
    }
}

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

1 Ответ

3 голосов
/ 14 февраля 2012

Это "работает", но это избыточно.Если у вас есть 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, относящимися к «self»: ​​

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