Если имеется более одной страницы ответов, и вы не хотите предлагать всю коллекцию одновременно, значит ли это, что существует несколько вариантов?
При запросе к /db/questions
верните 300 Multiple Choices
с Link
заголовками, которые указывают, как добраться до каждой страницы, а также с объектом JSON или страницей HTML со списком URL-адресов.
Link: <>; rel="http://paged.collection.example/relation/paged"
Link: <>; rel="http://paged.collection.example/relation/paged"
...
У вас будет один Link
заголовок для каждой страницы результатов (пустая строка означает текущий URL-адрес, а URL-адрес одинаков для каждой страницы, только для доступа с разными диапазонами), и отношение определяется как пользовательский на предстоящий Link
spec . Эти отношения объяснят ваш обычай 266
или ваше нарушение 206
. Эти заголовки являются вашей машиночитаемой версией, поскольку все ваши примеры в любом случае требуют понимания клиента.
(Если вы придерживаетесь маршрута «range», я думаю, что ваш собственный код возврата 2xx
, как вы его описали, будет лучшим поведением здесь. От вас ожидают, что вы сделаете это для своих приложений и тому подобного [» Коды состояния HTTP являются расширяемыми. "], И у вас есть веские причины.)
300 Multiple Choices
говорит, что вы ДОЛЖНЫ также предоставить телу способ выбора для пользовательского агента. Если ваш клиент понимает, он должен использовать заголовки Link
. Если это пользователь, просматривающий вручную, возможно, HTML-страницу со ссылками на специальный «выгружаемый» корневой ресурс, который может обрабатывать отображение этой конкретной страницы на основе URL-адреса? /humanpage/1/db/questions
или что-то такое отвратительное?
Комментарии к сообщению Ричарда Левассера напоминают мне о дополнительной опции: заголовок Accept
(раздел 14.1). Когда появилась спецификация oEmbed, я удивился, почему она не была полностью реализована с использованием HTTP, и написал альтернативную версию, используя их.
Сохраняйте заголовки 300 Multiple Choices
, Link
и HTML-страницу для начального наивного HTTP GET
, но вместо диапазонов используйте, чтобы ваши новые отношения подкачки определяли использование заголовка Accept
. Ваш следующий HTTP-запрос может выглядеть следующим образом:
GET /db/questions HTTP/1.1
Host: paged.collection.example
Accept: application/json;PagingSpec=1.0;page=1
Заголовок Accept
позволяет вам определить приемлемый тип контента (ваш возврат в JSON), а также расширяемые параметры для этого типа (номер вашей страницы). Судя по моим заметкам из моей записи oEmbed (здесь я не могу связать их, я перечислю их в своем профиле), вы можете быть очень откровенными и предоставить здесь версию спецификации / отношения в случае, если вам нужно переопределить то, что page
параметр означает в будущем.