В настоящее время я работаю над новым продуктом и делаю REST API как для общественных, так и для внутренних нужд. Я начал со спецификации {json:api} и был ею вполне доволен, пока не столкнулся с некоторыми вопросами, на которые не могу найти ответы.
Согласно спецификации JSON API, каждый ресурс ДОЛЖЕН содержать id
.
Каждый ресурсный объект ДОЛЖЕН содержать элемент id и элемент типа. Значения элементов id и type ДОЛЖНЫ быть строками.
И это хорошо во многих случаях, но не во всех.
Большинство наших конечных точек связаны с «ресурсами».
Если я попрошу коллекцию "вещей" (http://example.com/things
)
{
"data": [{
"type": "things",
"id": "1",
"attributes": {
"title": "first"
},
"links": {
"self": "http://example.com/things/1"
}
}, {
"type": "things",
"id": "1",
"attributes": {
"title": "second"
},
"links": {
"self": "http://example.com/things/2"
}
}]
}
Если я попрошу один ресурс "вещи" (http://example.com/things/1
)
{
"data": {
"type": "things",
"id": "1",
"attributes": {
"title": "first"
},
"links": {
"self": "http://example.com/things/1"
}
}
}
Но что делать с конечными точками, которые не относятся к ресурсам и не имеют идентификатора?
Например, в нашем приложении есть конечная точка http://example.com/stats
, которая должна возвращать статистику текущего пользователя, вошедшего в систему. Нравиться
{
"active_things": 23,
"last_login": "2017"
}
Для этого «ресурса» нет идентификатора (на самом деле это не ресурс, не так ли?). Бэкэнд просто собирает некоторую «статистику» для вошедшего в систему пользователя и возвращает объект статистики. В этом приложении много подобных конечных точек, например, у нас есть страница Центр уведомлений, где пользователь может менять адреса электронной почты для разных уведомлений.
Таким образом, внешнее приложение (одностраничное приложение) сначала должно получить текущие значения и отправить запрос на GET http://example.com/notification-settings
.
{
"notifications_about_new_thing": "[email protected]",
"notification_about_other_thing": "[email protected]"
}
И таких конечных точек гораздо больше. Проблема в том, как вернуть эти ответы в формате JSONAPI? В этих конечных точках нет идентификатора.
И самый большой вопрос - почему никто больше не сталкивается с этой проблемой (по крайней мере, я не могу найти обсуждения по этому поводу)? :D Все API, которые я когда-либо создавал, имеют некоторые конечные точки, у которых нет «id».
У меня есть две идеи, первая — подделать id
, как "id": "doesnt_matter"
, вторая — не использовать json-api
для этих конечных точек. Но мне они оба не нравятся.
http://example.com/stats/<user-id>
?.. - person Arūnas Smaliukas   schedule 10.04.2018