API-интерфейсы ReSTful в основном используются другими системами, поэтому я помещаю данные подкачки в заголовки ответов. Однако некоторые потребители API могут не иметь прямого доступа к заголовкам ответов или могут создавать UX поверх вашего API, поэтому предоставление способа извлечения (по запросу) метаданных в ответе JSON является плюсом.
Я считаю, что ваша реализация должна включать машиночитаемые метаданные по умолчанию и удобочитаемые метаданные по запросу. Удобочитаемые метаданные могут быть возвращены с каждым запросом, если хотите, или, предпочтительно, по запросу с помощью параметра запроса, такого как include=metadata
илиinclude_metadata=true
.
В вашем конкретном сценарии я бы включил URI для каждого продукта с записью. Это упрощает для потребителя API создание ссылок на отдельные продукты. Я бы также установил некоторые разумные ожидания относительно ограничений моих запросов на подкачку. Внедрение и документирование настроек по умолчанию для размера страницы является приемлемой практикой. Например, API GitHub устанавливает размер страницы по умолчанию на 30 записей, максимум 100, а также устанавливает ограничение скорости на количество запросов к API. Если ваш API имеет размер страницы по умолчанию, тогда в строке запроса можно просто указать индекс страницы.
В сценарии, удобочитаемом человеком, при переходе к /products?page=5&per_page=20&include=metadata
адресу ответ может быть следующим:
{
"_metadata":
{
"page": 5,
"per_page": 20,
"page_count": 20,
"total_count": 521,
"Links": [
{"self": "/products?page=5&per_page=20"},
{"first": "/products?page=0&per_page=20"},
{"previous": "/products?page=4&per_page=20"},
{"next": "/products?page=6&per_page=20"},
{"last": "/products?page=26&per_page=20"},
]
},
"records": [
{
"id": 1,
"name": "Widget #1",
"uri": "/products/1"
},
{
"id": 2,
"name": "Widget #2",
"uri": "/products/2"
},
{
"id": 3,
"name": "Widget #3",
"uri": "/products/3"
}
]
}
Для машиночитаемых метаданных я бы добавил в ответ заголовки Link :
Link: </products?page=5&perPage=20>;rel=self,</products?page=0&perPage=20>;rel=first,</products?page=4&perPage=20>;rel=previous,</products?page=6&perPage=20>;rel=next,</products?page=26&perPage=20>;rel=last
(значение заголовка ссылки должно быть закодировано)
... и, возможно, настраиваемый total-count
заголовок ответа, если хотите:
total-count: 521
Другие данные подкачки, отображаемые в метаданных, ориентированных на человека, могут быть излишними для метаданных, ориентированных на машину, поскольку заголовки ссылок сообщают мне, на какой странице я нахожусь, и количество на странице, и я могу быстро получить количество записей в массиве . Поэтому я бы, вероятно, создал только заголовок для общего подсчета. Вы всегда можете передумать позже и добавить больше метаданных.
Кстати, вы можете заметить, что я удалил /index
из вашего URI. Общепринятое соглашение заключается в том, чтобы ваша конечная точка ReST открывала коллекции. Наличие /index
в конце немного запутывает это.
Это всего лишь несколько вещей, которые мне нравятся при использовании / создании API. Надеюсь, это поможет!