Максимальна довжина запиту HTTP GET


487

Яка максимальна довжина запиту HTTP GET ?

Чи визначена помилка відповіді, яку сервер може / повинен повернути, якщо отримає GET-запит, що перевищує цю довжину?

Це в контексті API веб-сервісу, хоча і цікаво бачити обмеження браузера.



7
@KillianDS Це не має нічого спільного з максимальною довжиною URL-адреси. Питання стосується максимальної тривалості запиту, який надсилається до URL-адреси.
Маркіз Лорн

2
@EJP Вміст GET "GET" не більше URI.
KillianDS

@JimAho ваш коментар теж є дублікатом першого коментаря .....
'18, о 18:22

Відповіді:


463

Ліміт залежить від використовуваного сервера та клієнта (і, якщо застосовно, також і проксі-сервера, який використовується сервером або клієнтом).

Більшість веб-серверів мають обмеження 8192 байт (8 Кб), що зазвичай можна налаштувати десь у конфігурації сервера. Що стосується питання клієнта, специфікація HTTP 1.1 навіть попереджає про це. Ось уривок глави 3.2.1 :

Примітка. Сервери повинні бути обережними щодо залежно від довжини URI вище 255 байт, оскільки деякі старі клієнтські або проксі-сервіси можуть не підтримувати ці довжини належним чином.

Обмеження в Internet Explorer і Safari - близько 2 Кб, в Opera близько 4 КБ, а в Firefox - близько 8 Кб. Таким чином, ми можемо припустити, що 8 КБ - це максимально можлива довжина, і що 2 Кбайт - це більш доступна довжина, на яку слід покладатися на стороні сервера, і що 255 байт - це найбезпечніша довжина, щоб припустити, що вся URL-адреса надійде.

Якщо ліміт буде перевищено або в браузері, або на сервері, більшість просто вріже символи за межами цього обмеження без будь-якого попередження. Однак деякі сервери можуть надсилати помилку HTTP 414 . Якщо вам потрібно надіслати великі дані, то краще використовувати POST замість GET. Його межа набагато вищий, але більше залежить від використовуваного сервера, ніж клієнт. Зазвичай середній веб-сервер дозволяє до 2 ГБ. Це також можна налаштувати десь у налаштуваннях сервера. Середній сервер відображатиме специфічну для сервера помилку / виняток при перевищенні межі POST, як правило, як помилка HTTP 500.


6
Ви відповідаєте на питання з точки зору обмежень браузера. Чи знаєте ви, чи є різниці між GET та POST (щодо розміру проблемного запиту), якщо, скажімо, HttpClient використовується для взаємодії з сервером REST?
aioobe

3
Звичайно, POST використовує тіло для надсилання даних. Специфікація HTTP не встановлює конкретного обмеження розміру для публікацій.
Ігнасіо А. Полетті

1
Спеціалісти Http цілком дозволяють розміщувати тіло в GET і DELETE запитах. Я перевірив його на Java, і він працює. На жаль, тут знову деякі проксі могли перерізати тіло.
Ніколя Зозол

12
Метод "Get and Post" має дуже специфічне значення, тому використання POST для виконання GET - це те саме, що і використання молотка для розбиття яйця.
nohros

18
@nohros Це ідеально ідеально, але GET також має обмеження, яких POST / PUT не мають. Наприклад, припустимо, ви хочете виконати дуже довгий запит, що включає купу ідентифікаторів; якщо ви вибираєте сотні ідентифікаторів, це може порушити ліміт допустимого розміру URL-адреси, тоді як введення цього запиту в POST може цього уникнути, навіть якщо концептуально це не має великого сенсу. Особисто я хочу, щоб HTTP дозволяв GET запитам мати такі органи, як PUT та POST.
devios1

143

Ви задаєте тут два окремих питання:

Яка максимальна довжина запиту HTTP GET?

Як вже було сказано, сам HTTP не накладає жодного жорстко обмеженого обмеження на довжину запиту; але браузери мають обмеження від 2 Кб - 8 КБ (255 байт, якщо рахувати дуже старі браузери).

Чи визначена помилка відповіді, яку сервер може / повинен повернути, якщо він отримує GET-запит, що перевищує цю довжину?

Це той, кому ніхто не відповів.

HTTP 1.1 визначає код статусу 414 Request-URI Too Longдля випадків, коли досягається визначений сервером ліміт. Детальнішу інформацію про RFC 2616 можна переглянути .

У випадку встановлених клієнтом лімітів немає сенсу, коли сервер щось повертає, оскільки сервер взагалі не отримає запит.




3

Технічно я бачив, що у HTTP GET виникнуть проблеми, якщо довжина URL-адреси перевищує 2000 символів. У такому випадку краще використовувати HTTP POST або розділити URL.


2

Як вже було сказано, сам HTTP не накладає жодного жорстко обмеженого обмеження на довжину запиту; але браузери мають обмеження від 2048 символів, дозволених методом GET.


-6

Отримайте запит за допомогою браузера Chrome

Так. У запиті GET немає жодних обмежень.

Я можу надіслати ~ 4000 символів як частину рядка запиту, використовуючи як браузер Chrome, так і команду curl.

Я використовую сервер Tomcat 8.x, який повернув очікувану відповідь 200 ОК.

Ось знімок екрана HTTP-запиту Google Chrome (приховування кінцевої точки, яку я намагався з міркувань безпеки):

ВІДПОВІДЬ

Отримайте за допомогою браузера Chrome

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.