HTTP POST запитує подати додаткові дані від клієнта (браузера) на сервер в тілі повідомлення. У контрасті, ЗАРАЗ запити включають усі необхідні дані в URL-адресу. Форми в HTML можуть використовувати будь-який метод, вказавши метод = "POST" або метод = "Отримати" (за замовчуванням) у елемент. Зазначений метод визначає, як дані форми подаються на сервер. Коли метод GET, всі дані форми кодуються в URL-адресу, додану до дії URL як параметри рядка запиту. З POST дані форми відображаються в тілі повідомлення запиту HTTP.
ЗАРАЗ | POST | |
---|---|---|
Історія | Параметри залишаються в історії браузера, оскільки вони є частиною URL-адреси | Параметри не зберігаються в історії браузера. |
Закладка | Можна зробити закладку. | Неможливо встановити закладки. |
Кнопка НАЗАД / повторне подання | GET-запити повторно виконуються, але їх не можна повторно подавати на сервер, якщо HTML зберігається в кеші браузера. | Зазвичай браузер попереджає користувача про те, що дані потрібно буде повторно подати. |
Тип кодування (атрибут enctype) | додаток / x-www-form-urlencoded | багаточастинні / форма-дані або додаток / x-www-form-urlencoded Використовуйте багаточастинне кодування для бінарних даних. |
Параметри | може надсилати, але дані параметрів обмежені тим, що ми можемо вставити у рядок запиту (URL). Найбезпечніше використовувати параметри менше ніж 2 К, деякі сервери обробляють до 64 Кб | Може надіслати параметри, включаючи завантаження файлів, на сервер. |
Зламали | Простіше зламати для дітей сценарію | Складніше зламати |
Обмеження щодо типу даних форми | Так, дозволено використовувати лише символи ASCII. | Без обмежень. Бінарні дані також дозволені. |
Безпека | GET менш безпечний порівняно з POST, оскільки дані, що надсилаються, є частиною URL-адреси. Таким чином, це зберігається в історії браузера та журналах сервера в простому тексті. | POST трохи безпечніший ніж GET, оскільки параметри не зберігаються в історії браузера або в журналах веб-сервера. |
Обмеження щодо довжини даних форми | Так, оскільки дані форми є в URL-адресі, а довжина URL-адреси обмежена. Безпечна межа довжини URL-адреси часто 2048 символів, але залежить від браузера та веб-сервера. | Без обмежень |
Корисність | Метод GET не слід використовувати при надсиланні паролів або іншої конфіденційної інформації. | Метод POST, який використовується при надсиланні паролів або іншої конфіденційної інформації. |
Видимість | Метод GET видимий для всіх (він відображатиметься в адресному рядку веб-переглядача) і має обмеження щодо кількості інформації для надсилання. | Змінні методу POST не відображаються в URL-адресі. |
Кешування | Можна кешувати | Не кешовано |
Принципова різниця між METHOD = "Отримати" і METHOD = "POST" це те, що вони відповідають різні HTTP-запити, як визначено в специфікаціях HTTP. Процес подання обох методів починається однаково - набір даних форми формується браузером і потім кодується у спосіб, визначений ентетип атрибут. Для METHOD = "POST то ентетип атрибут може бути багаточастинні / форми-дані або додаток / x-www-form-urlencoded, тоді як для METHOD = "Отримати", тільки додаток / x-www-form-urlencoded дозволено. Потім цей набір даних форми передається серверу.
Для подання форми з METHOD = "GET" браузер будує URL-адресу, приймаючи значення дії атрибут, додаючи а ? до нього, потім додаючи набір даних форми (кодується за допомогою типу вмісту application / x-www-form-urlencoded type). Потім браузер обробляє цю URL-адресу, ніби переходячи за посиланням (або як якщо б користувач ввів URL-адресу безпосередньо). Веб-переглядач розділяє URL-адресу на частини і розпізнає хост, а потім надсилає цьому хосту GET-запит з рештою URL-адреси в якості аргументу. Сервер приймає його звідти. Зауважте, що цей процес означає, що дані форми обмежені кодами ASCII. Слід бути особливо обережним для кодування та декодування інших типів символів при передачі їх через URL-адресу у форматі ASCII.
Подання форми з METHOD = "POST" викликає надсилання запиту POST, використовуючи значення дії атрибут та повідомлення, створене відповідно до типу вмісту, визначеного ентетип атрибут.
Оскільки дані форми надсилаються як частина URL коли ЗАРАЗ використовується --
В принципі, обробка поданих даних форми залежить від того, чи надсилаються вони METHOD = "Отримати" або METHOD = "POST". Оскільки дані кодуються по-різному, потрібні різні механізми декодування. Таким чином, загалом кажучи, зміна способу може вимагати зміни сценарію, який обробляє подання. Наприклад, при використанні інтерфейсу CGI сценарій отримує дані в змінній середовища (QUERYSTRING), коли ЗАРАЗ використовується. Але коли POST використовується, дані форми передаються у стандартному потоці введення (stdin), а кількість байтів, які потрібно прочитати, задається заголовком довжини вмісту.
GET рекомендується подавати "ідентичні" форми - ті, які не "суттєво змінюють стан світу". Іншими словами, форми, які включають лише запити до бази даних. Інша перспектива полягає в тому, що кілька ідентифікованих запитів матимуть такий же ефект, як і один запит. Якщо задіяні оновлення бази даних або інші дії, такі як запуск електронних листів, рекомендується використовувати POST.
З блогу розробників Dropbox:
веб-переглядач не точно знає, що робить певна форма HTML, але якщо форма подається через HTTP GET, браузер знає, що безпечно автоматично повторити подання, якщо є мережна помилка. Для форм, які використовують HTTP POST, можливо, це не є безпечним для повторної спроби, тому браузер спочатку запитує у користувача підтвердження.
Запит "GET" часто кешується, тоді як запит "POST" навряд чи може бути. Для систем запитів це може мати значний вплив на ефективність, особливо якщо рядки запитів прості, оскільки кеші можуть обслуговувати найчастіші запити.
У певних випадках використовують POST рекомендується навіть для ідентичних запитів:
Оновлено 15 травня 2015 року. Зокрема, при використанні HTTPS (HTTP через TLS / SSL) POST пропонує більш безпеку, ніж GET?
Це цікаве питання. Скажіть, ви робите запит GET на веб-сторінку:
Отримайте https://www.example.com/login.php?user=mickey&passwd=mini
Якщо припустити, що підключення до Інтернету контролюється, яка інформація про цей запит буде доступна для снайпера? Якщо замість цього використовується POST, а дані користувача та passwd включені до змінних POST, чи буде це більш безпечно у випадку з'єднань HTTPS?
Відповідь - ні. Якщо ви робите такий запит GET, зловмиснику буде відома лише така інформація, яка контролює ваш веб-трафік:
Частина шляху URL-адреси - тобто фактична запитувана сторінка, а також параметри рядка запиту - захищені (зашифровані), поки вони знаходяться "по дроту", тобто під час руху на шляху до цільового сервера. Ситуація точно така ж і для запитів POST.
Звичайно, веб-сервери, як правило, реєструють всю URL-адресу в простому тексті у своїх журналах доступу; тому надсилання конфіденційної інформації через GET не є хорошою ідеєю. Це застосовується незалежно від того, використовується HTTP або HTTPS.