Передача значительных данных в запросе REST GET - PullRequest
0 голосов
/ 21 июня 2019

ОТДЫХ.Допустим, у меня есть база данных, в которой будет миллион элементов.Я хочу получить, скажем, 10 000 из них через REST GET, передав в запросе GET идентификаторы из 10 000 элементов.Используя параметры запроса URL-адреса, он быстро превысит максимальную длину URL-адреса.Как люди решают это?Использовать POST вместо этого и передать его в теле?Это кажется вздорным.

1 Ответ

0 голосов
/ 21 июня 2019

Вы не должны обращаться к этой форме через параметры URL, она имеет ограничение: 2000 символов Ограничение URL-адреса

Я предполагаю, что вы делаете что-то вроде этого:

https://localhost/api/applicationcollections/(47495dde-67d2-4854-add0-7e25b2fe88e4,1b470799-cc8a-4284-9ca7-76dc34a5aebb)

Если вы планируете получить более 10 тыс. Записей, вы можете передать информацию в теле запроса, которая не имеет ограничений.Говоря технически, вы должны сделать это через запрос POST, но это не относится к семантике глагола POST.Даже для GET вы можете включить тело: HTTP GET с телом запроса , но оно не должно рассматриваться как часть семантики.

Обычно вы не фильтруете 10k элементов по идентификатору, вместо этогопо запросу вы получаете 10 тыс. элементов, передавая параметр разбиения на страницы, если хотите через URL, но это может убить ваше приложение, особенно если учесть, что DTO имеет более одного поля, например

ApplicationDto
 field1
 field2....
 field15

Bellow,у вас есть пример того, как передать параметры разбиения на страницы и получить первые 10 тыс. записей

https://localhost:44390/api/applications?pageNumber=1&pageSize=10000

Кроме того, API должны возвращать дополнительный заголовок, назовем его X-Pagination, где вы можете получить информацию, если у вас естьбольше страниц для разбивки на страницы, включая общее количество элементов.

В качестве дополнительной меры по уменьшению размера запроса вы можете формировать данные и получать только те поля, которые вам нужны.Приложение должно содержать только: field1, field3, см. Ниже:

https://localhost:44390/api/applications?fields=field1,field3

Посмотрите, как Twitter также решает эту проблему: Ответ курсора Twitter

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...