В зависимости от логики вашей серверной стороны может быть два подхода.
Подход 1. Когда сервер недостаточно умен для обработки состояний объекта.
Вы можете отправить на сервер уникальные идентификаторы всех кэшированных записей, например ["id1", "id2", "id3", "id4", "id5", "id6", "id7", "id8", " id9 "," id10 "] и логический параметр, чтобы узнать, запрашиваете ли вы новые записи (потяните для обновления) или старые записи (загрузите больше).
Ваш сервер должен отвечать за возврат новых записей (загрузка дополнительных записей или новых записей с помощью pull для обновления), а также идентификаторы удаленных записей из ["id1", "id2", "id3", "id4", "id5" "," id6 "," id7 "," id8 "," id9 "," id10 "].
Пример: -
Если вы запрашиваете дополнительную нагрузку, ваш запрос должен выглядеть примерно так: -
{
"isRefresh" : false,
"cached" : ["id1","id2","id3","id4","id5","id6","id7","id8","id9","id10"]
}
Теперь предположим, что вы запрашиваете старые записи (загрузите больше) и предположим, что запись «id2» обновлена кем-то, а записи «id5» и «id8» удалены с сервера, тогда ваш ответ сервера должен выглядеть примерно так: -
{
"records" : [
{"id" :"id2","more_key":"updated_value"},
{"id" :"id11","more_key":"more_value"},
{"id" :"id12","more_key":"more_value"},
{"id" :"id13","more_key":"more_value"},
{"id" :"id14","more_key":"more_value"},
{"id" :"id15","more_key":"more_value"},
{"id" :"id16","more_key":"more_value"},
{"id" :"id17","more_key":"more_value"},
{"id" :"id18","more_key":"more_value"},
{"id" :"id19","more_key":"more_value"},
{"id" :"id20","more_key":"more_value"}],
"deleted" : ["id5","id8"]
}
Но в этом случае, если у вас много локальных кешированных записей, предположим, что 500, тогда ваша строка запроса будет слишком длинной, например: -
{
"isRefresh" : false,
"cached" : ["id1","id2","id3","id4","id5","id6","id7","id8","id9","id10",………,"id500"]//Too long request
}
Подход 2: Когда сервер достаточно умен, чтобы обрабатывать состояния объекта в соответствии с датой.
Вы можете отправить идентификатор первой и последней записи, а также время предыдущего запроса. Таким образом, ваш запрос всегда будет небольшим, даже если у вас большой объем кэшированных записей
Пример: -
Если вы запрашиваете дополнительную нагрузку, ваш запрос должен выглядеть примерно так: -
{
"isRefresh" : false,
"firstId" : "id1",
"lastId" : "id10",
"last_request_time" : 1421748005
}
Ваш сервер отвечает за возврат идентификаторов удаленных записей, которые удаляются после last_request_time, а также за возврат обновленной записи после last_request_time между «id1» и «id10».
{
"records" : [
{"id" :"id2","more_key":"updated_value"},
{"id" :"id11","more_key":"more_value"},
{"id" :"id12","more_key":"more_value"},
{"id" :"id13","more_key":"more_value"},
{"id" :"id14","more_key":"more_value"},
{"id" :"id15","more_key":"more_value"},
{"id" :"id16","more_key":"more_value"},
{"id" :"id17","more_key":"more_value"},
{"id" :"id18","more_key":"more_value"},
{"id" :"id19","more_key":"more_value"},
{"id" :"id20","more_key":"more_value"}],
"deleted" : ["id5","id8"]
}
Потяните, чтобы обновить: -
Загрузить еще
Только что отредактировал вопрос - проблема в том, что foo # 101 не будет отображаться в результатах, и потребитель API, пытающийся вытащить все foo, пропустит один.
Я столкнулся с этой же проблемой и искал решение. AFAIK, на самом деле нет надежного гарантированного механизма для этого, если каждая страница выполняет новый запрос. Единственное решение, которое я могу придумать, - это сохранить активный сеанс и сохранить набор результатов на стороне сервера, и вместо того, чтобы выполнять новые запросы для каждой страницы, просто захватите следующий кешированный набор записей.
О, я только что увидел часть вашего вопроса, в которой вы бы хотели избежать этого сценария
Посмотрите, как Twitter достигает этого dev.twitter.com/rest/public/timelines
@java_geek Как обновляется параметр Since_id? На веб-странице Twitter кажется, что они делают оба запроса с одинаковым значением Since_id. Интересно, когда он будет обновлен, чтобы при добавлении новых твитов их можно было учесть?
@Petar Потребитель API должен обновить параметр Since_id. Если вы видите, приведенный здесь пример относится к клиентам, обрабатывающим твиты.
Описанная вами архитектура разбиения на страницы называется разбиением на страницы со смещением , а описанная вами проблема известна как перекос страницы . Это признанный недостаток при использовании смещений для запроса наборов результатов, которые можно переупорядочить или удалить элементы в середине сеанса. Решение - выбрать альтернативную архитектуру нумерации страниц. API Paging Built The Right Way предлагает краткое и приятное сравнение архитектур разбиения на страницы: engineering.mixmax.com/blog/api-paging-built-the-right-way