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. Надеюсь, это поможет!
"page_count": 20
и{"last": "/products?page=26&per_page=20"}
?Как человек, написавший несколько библиотек для использования REST-сервисов, позвольте мне представить вам точку зрения клиента на то, почему я считаю, что упаковка результата в метаданные - лучший способ:
И предложение: как и в Twitter API , вы должны заменить page_number прямым индексом / курсором. Причина в том, что API позволяет клиенту устанавливать размер страницы для каждого запроса. Является ли возвращаемый page_number количеством страниц, запрошенных клиентом на данный момент, или номером страницы с учетом последнего использованного page_size (почти наверняка более позднего, но почему бы не избежать такой двусмысленности в целом)?
источник
Я бы рекомендовал добавить заголовки для того же самого. Перемещение метаданных заголовков помогает в избавлении от огибающих , как
result
,data
илиrecords
и тело ответа содержит только данные , которые нам нужны. Вы можете использовать заголовок Link, если вы также создаете ссылки для пагинации.Подробнее см .:
https://github.com/adnan-kamili/rest-api-response-format
Для файла swagger:
https://github.com/adnan-kamili/swagger-response-template
источник
просто добавьте новое свойство серверного API в тело ответа. из примера .net core:
В ответе тела это выглядит так
}
источник
Как правило, я делаю простым способом, что бы то ни было, я создаю конечную точку restAPI, например, «localhost / api / method /: lastIdObhibited /: countDateToReturn» с этими параметрами, вы можете сделать это простым запросом. в сервисе, например. .сеть
В Ionic, когда я прокручиваю снизу вверх, я передаю нулевое значение, когда получаю ответ, я устанавливаю значение последнего полученного идентификатора, а когда я скользлю сверху вниз, я передаю последний полученный идентификатор регистрации
источник