Контакти

Get і post приклади. Атрибут Action і Method. Методи GET і POST. Вибір між GET і POST

Сучасні веб-ресурси не просто надають інформацію відвідувачу, але і взаємодіють з ним. Для взаємодії з користувачем потрібно отримувати деяку інформацію від нього. Для отримання даних є кілька методів, дуже поширені методи GET і POST. І відповідно в PHP є підтримка цих методів передачі даних GET і POST. Подивимося, як працюють ці методи.
метод GETдані методом GET передаються шляхом їх додавання до URL-адресою викликається сценарію, призначеного для обробки отриманої інформації. для пояснення даного методу наберіть в адресному рядку браузера URL-адресу ресурсу і додайте спочатку знак питання (?), а потім рядок num \u003d 10. наприклад

http: //домен.ru/script.php? num \u003d 10


Якщо у вас локальний сервер, То зазвичай домен буде localhost, і тоді попередній запис буде виглядати

http: //localhost/script.php? num \u003d 10


В цьому випадку ми передаємо параметр num рівний 10. Для додавання наступних параметрів сценарієм потрібно використовувати роздільник - амперсант (&), наприклад

http: //домен.ru/script.php? num \u003d 10 & type \u003d new & v \u003d text


В даному випадку ми передали скрипту три параметра: num зі значенням 10, type зі значенням "new" і v зі значенням "text".
Для отримання цих параметрів в скрипті потрібно використовувати вбудований масив $ _GET $ _GET [ "num"], $ _GET [ "type"], $ _ GET [ "v"]. Ці елементи масиву і будуть містити значення переданих параметрів. Для демонстрації цього прикладу створіть файл script.php такого змісту



Перевірка методу GET в PHP


echo ($ _GET [ "num"]. "
");
echo ($ _GET [ "type"]. "
");
echo ($ _GET [ "v"]);
?>




І тепер викличте цей файл в браузері

http: //путь/script.php? num \u003d 10 & type \u003d new & v \u003d text


і ви побачите передані параметри у вікні браузера. Але якщо ви викличте цей файл без додаткових параметрів http: //путь/script.php, то побачите помилки, які видасть інтерпретатор PHP, Про те, що таких елементів масиву $ _GET немає. Перевірці даних одержуваних від користувача можна посвітити не одну статтю, тому в цій статті я не буду порушувати це момент.
Як ви, напевно, розумієте змушувати користувача набирати дані в адресному рядку браузера не дуже добре і зовсім незручно. Тому для прийому даних від користувача потрібно використовувати html-форми. Напишемо простеньку html-форму.


Введіть число

У Вас є комп'ютер?

Ваш коментар:





Трохи прокоментую створену форму. Форми створюються тегом form. Поля форми створюються тегами input, select, textarea (докладніше можна почитати). У тезі form в атрибуті action вказується URL-адресу скрипта, який отримає дані форми. У нашому випадку ми вказали вже існуючий у нас файл script.php. Атрибут method задає метод відправки даних. Ми вказали метод GET. Тепер ми знаємо, якому файлу будуть передані дані форми, і яким способом, залишилося розібратися, де їх там шукати ?!
Дані цієї форми будуть передані веб-ресурсу браузером шляхом додавання їх до URL-адресою: спочатку буде знак питання (?), Потім будуть представлені параметри розділені амперсант (&). Назва параметра буде братися з атрибута name, яке повинно бути прописано у будь-якого поля форми. Значення параметра буде залежати від типу поля. Якщо поле є текстовим, то значенням буде введений користувачем текст. Якщо ж поле буде являти собою список, групу перемикачів або прапорців, то значенням параметра буде значення атрибута value вибраного пункту. Поясню на прикладі нашої форми. Якщо користувач введе в поле input число 10, то назвою параметра буде num (значення атрибута name тега input), а значенням буде 10 (введене користувачем число). Відповідно браузер сформує пару "num \u003d 10". Якщо користувач зі списку вибере варіант "Так", то назвою параметра буде type (значення атрибута name тега select), а значенням буде yes (значення атрибута value тега option). Відповідно браузер сформує пару "type \u003d yes".
Тепер цю форму розмістимо на сторінці forma.php.



Форма для передачі даних методом GET і PHP



Введіть число

У Вас є комп'ютер?

Ваш коментар:









Введіть в поля форми будь-які значення і натисніть кнопку "Відправити". Після натискання кнопки браузер відкриє іншу сторінку (script.php), і у вікні браузера будуть відображені дані, які ви ввели. Я думаю зрозуміло чому: браузер передасть дані сценарієм script.php, і в скрипті ці дані будуть оброблені і виведені на екран.
метод POSTТепер давайте розглянемо, як працює метод POST.
Для відправки даних методом POST потрібно використовувати HTML-форми. Як ми пам'ятаємо, що за спосіб відправки даних форми відповідає атрибут method тега form. Тому потрібно в атрибуті method тега form вказати значення POST. В іншому форма може бути та ж, як і для методу GET. Змінимо нашу форму, яку ми вже використали для передачі даних способом GET, для передачі методом POST.


Введіть число

У Вас є комп'ютер?

Ваш коментар:





Як бачите, форма залишилася та ж за винятком атрибутів method і action. Тепер дані будуть передаватися сценарієм script_post.php. Помістимо нашу форму на сторінці forma_post.php.



Форма для передачі даних методом POST і PHP



Введіть число

У Вас є комп'ютер?

Ваш коментар:









Тепер треба написати сценарій, який буде обробляти дані нашої форми.
Для отримання в скрипті даних переданим методом POST потрібно використовувати вбудований масив $ _POST. Ключами цього масиву будуть назви параметрів. У нашому випадку потрібно використовувати $ _POST [ "num"], $ _POST [ "type"], $ _ POST [ "v"]. Ці елементи масиву і будуть містити значення переданих даних. Як бачите відміну від використання способу GET, виражається лише в використанні масиву $ _POST. Тому нам не важко буде написати файл script_post.php:



Перевірка методу POST в PHP


echo ($ _POST [ "num"]. "
");
echo ($ _POST [ "type"]. "
");
echo ($ _POST [ "v"]);
?>




Тепер відкрийте файл forma_post.php в браузері. Введіть якісь дані в поля форми і натисніть кнопочку "Відправити". Зараз, напевно, ви помітили відмінність методу POST від GET - в адресному рядку браузера не з'явилися дані форми. дані методом POST не можна передати через адресний рядок браузера. Це суттєва відмінність потрібно запам'ятати.
В PHP в незалежності, яким способом були відправлені дані - методом POST або методом GET - отримати дані можна використовуючи масив $ _REQUEST. Порівняння методів GET і POSTПри використанні методу GET дані передаються шляхом додавання до URL-адресою. Таким чином, вони будуть видні користувачеві, що з точки зору безпеки не завжди добре. Також максимальний обсяг переданих даних буде залежати від браузера - від максимально-допустимої кількості символів адресному рядку браузера.
При використанні методу POST дані не будуть видні користувачеві (не відображаються в адресному рядку браузера). І тому вони більш захищені, а, отже, і програма обробна ці дані більш захищена в плані безпеки. Також обсяг переданих даних практично ні чим не обмежений.
Вибираючи спосіб передачі даних потрібно враховувати наведені особливості і зупинятися на найбільш прийнятному методі.

Спільного між ними то що вони працюють однаково. Різниці між ними технічно ніякої. А ось ідеологічні відмінності є.

Я розповім про них в контексті PHP. Прошу зауважити що протокол HTTP до PHP має непряме відношення бо він створювався для обміну html сторінками а PHP просто розширює можливості і того і іншого.

GET запит використовується щоб отримати дані а POST щоб відправити. (Нагадую що технічно вони працюють однаково).

Тому в контексті PHP спираючись на цю ідеологію зробили такий спосіб:
1. При кожному запуску PHP за замовчуванням створюються суперглобальні масиви ($ _GET, $ _POST).
2. Якщо в рядку запиту є знак питання (?). Те все що після нього вважається параметрами GET запиту вони представлені в форматі "ключ" \u003d "значення" і як роздільник використовується знак амперсанда (&)
приклад:
GET /index.php?name\u003dАндрей&surname\u003dГалкін
це рядок запиту, тут 2 параметра. ці параметри потраплять в масив $ _GET.
3. $ _POST заповнюється іншим способом. вміст цього масиву заповнюється з "заголовків запиту". Тобто з місця, прихованого від очей в явному вигляді. Всю рутину по створенню таких заголовків бере на себе браузер. Хоча іноді і щось редагується в заголовках в ручну.

Найчастіше пост запит використовується в формах (для відправки даних).

Наприклад у нас є форма для входу 2 поля логін і пароль.

Уявімо що ми використовуємо GET метод. Тоді при відправці форми ми перейдемо на наступну адресу /login.php?login\u003dАндрей&password\u003d123 погодьтеся що так передавати таку інформацію зовсім небезпечно. Будь-хто може відкрити ваш браузер і починаючи вводити адресу сайту він з історії може побачити ваші паролі і логіни.

А ось якби ми вказали методом POST то ми б отримали такий запит:
POST /login.php (login \u003d Андрій & password \u003d 123) то що в дужках було б приховано і ніяк не збережено в браузері.

Загалом підсумовуючи:
GET - це щоб отримати певну сторінку в певному виді (сортування, поточна сторінка в блозі, рядок пошуку і т.п.).
POST - для оправлення даних які не впливають на відображення сторінки, в тому плані що ці дані впливають тільки на результат виконання скрипта (логіни, паролі, номери кредиток, повідомлення і т.п.).

І ще одна хороша новина їх можна комбінувати, наприклад
POST /index.php?page\u003dlogin (login \u003d Андрій & password \u003d 123) Думаю я вже досить пояснив що з цього вийде і які параметри в який масив потраплять.

Методи GET і POST в HTTP і HTTPS - два найпопулярніших методу, використовуваних для передачі даних з клієнта на сервер з використанням протоколу HTTP (протокол передачі гіпертексту). І GET, і POST можуть використовуватися для відправки запиту і отримання відповіді, але між ними існує значна різниця.

Різниця між запитами GET і POST в HTTP або HTTPS - популярне питання на кожному інтерв'ю з веб-програмування. Оскільки HTML не залежить від технології веб-сервера, такий як Java, ASP або PHP і HTTP - це основний протокол в просторі Інтернету, не можна чітко ігнорувати важливість розуміння методів GET і POST. У цій статті ми розглянемо, що таке HTTP-метод GET, що таке HTTP-метод POST, коли використовувати той чи інший запит і яка різниця між ними. Розберемо кожне поняття окремо.

Що таке HTML?

HTML - це мова, яка використовується для створення веб-сторінок. Гіпертекст відноситься до гіперпосиланнями, які може містити HTML-сторінка. Мова розмітки означає спосіб використання тегів для визначення макета сторінки і елементів на сторінці.
нижче наведено приклад HTML, Який використовується для визначення базової веб-сторінки з заголовком і одним абзацом тексту:



<Голова>
<Название> TechTerms.com

<Тело>

Це приклад абзацу в HTML.

Перший рядок визначає тип вмісту, що міститься в документі., і , Які все включені в приклад вище. Заголовок сторінки, метадані та посилання на файли з прив'язкою поміщаються між Фактичне вміст сторінки знаходиться між тегами .

За останні кілька десятиліть мережу пережила безліч змін, але HTML завжди була основною мовою, використовуваним для розробки веб-сторінок. Цікаво, що хоча веб-сайти стали більш просунутими і інтерактивними, HTML став простіше. Якщо ви порівнюєте джерело сторінки HTML5 з аналогічною сторінкою, написаної в HTML 4.01 або XHTML 1.0, на сторінці HTML5 буде менше коду. Це пов'язано з тим, що сучасний HTML спирається на каскадні таблиці стилів або JavaScript для форматування майже всіх елементів всередині сторінки.

Багато динамічні веб-сайти генерують веб-сторінки «на льоту», використовуючи серверний мова сценаріїв, такий як PHP або ASP. Однак навіть динамічні сторінки повинні бути відформатовані з використанням HTML. Тому мови сценаріїв часто генерують HTML-код, який відправляється в веб-браузер.

Протокол передачі гіпертексту HTTP призначений для взаємодії між клієнтами і серверами і працює як протокол запиту-відповіді.

Веб-браузер може бути клієнтом, а додаток на комп'ютері, на якому розміщений веб-сайт, - сервером.

Клієнт (браузер) відправляє HTTP-запит серверу, сервер повертає відповідь, який містить інформацію про стан запиту і може також містити запитаний контент.

Два методу запитів GET і POST

Два часто використовуваних методу для запиту-відповіді між клієнтом і сервером:

    GET - запитує дані з вказаного ресурсу;

    POST - відправляє даних, що підлягають обробці, на зазначений ресурс.

Переклад GET і POST в буквальному сенсі означає отримання і постобработку.

Детальніше про HTTP

HTTP - це протокол, який використовується для передачі даних через Інтернет. Є частиною пакета інтернет-протоколу і визначає команди і служби, які використовуються для передачі даних веб-сторінки.

HTTP використовує модель server-client. Клієнт може бути домашнім комп'ютером, ноутбуком або мобільним пристроєм. HTTP-сервер, як правило, є веб-хостом з програмним забезпеченням веб-сервера, таким як Apache або IIS. Коли користувач отримує доступ до веб-сайту, браузер відправляє запит на відповідний веб-сервер і відповідає кодом стану HTTP. Якщо URL-адресу дійсний і з'єднання надано, сервер відправить браузеру веб-сторінку і пов'язані файли.

Загальні коди стану HTTP включають:

    200 - успішний запит (існує веб-сторінка);

    301 - переміщається постійно (часто перенаправляється на новий URL-адресу);

    401 - несанкціонований запит (необхідно ввійти в систему);

    500 - внутрішня помилка сервера (часто викликана неправильною конфігурацією сервера).

POST і GET в HTTP

HTTP визначає команди GET і POST, які використовуються для обробки подань форм на веб-сайтах. Команда CONNECT використовується для полегшення безпечного з'єднання, яке шифрується з використанням SSL. Зашифровані HTTP-з'єднання відбуваються через HTTPS - розширення HTTP, призначене для захищених передач даних.

URL-адреси, що починаються з «http: //», доступні за стандартними протоколами передачі гіпертексту і за замовчуванням використовують порт 80. URL-адреси, що починаються з «https: //», доступні через безпечне з'єднання HTTPS і часто використовують порт 443.

POST

POST - це серія системних перевірок, Виконуваних комп'ютерами та іншими електронними пристроями при їх включенні. Результати тесту можуть відображатися на екрані, виводитися через миготливі світлодіоди або просто записуватися всередині. В комп'ютерних системах операція POST виконується на початку послідовності завантаження. Якщо всі тести пройдені, інша частина процесу запуску буде продовжена автоматично.

Операційні системи пристроїв Mac і Windows запускають POST кожен раз, коли комп'ютер завантажується або перезавантажується. сканування перевіряє апаратне забезпечення і гарантує, що процесор, ОЗУ і пристрої зберігання даних будуть працювати правильно. Якщо під час виконання POST виникла помилка, процес запуску може призупинитися або повністю припинитися, а на моніторі може з'явитися повідомлення про На ПК помилки POST часто відображаються на екрані інформації про BIOS. Вони можуть виводитися як кріптовие коди, такі як «08», або як системне повідомлення, наприклад, «Помилка системної пам'яті при зміщенні ». на Mac помилки POST часто позначаються простою графікою, наприклад, зламаною іконкою папки, яка вказує, що завантажувальний пристрій, не знайдено.

фізичні прояви

У деяких випадках екран комп'ютера може навіть не включатися перед помилками POST. Якщо це станеться, коди помилок можуть виводитися через миготливі світлодіодні індикатори або звукові сигнали. Наприклад, Apple iMac буде відтворювати три послідовних тони, витримувати паузу в п'ять секунд, а потім повторювати тони, коли під час запуску виявляється погана ОЗУ. Більшість ПК також видають звукові сигнали при виявленні помилок POST, хоча кожен виробник використовує свої власні коди.

POST - досить технічний термін, який використовують тільки комп'ютерні техніки на регулярній основі. Однак це хороша абревіатура, бо дає змогу краще зрозуміти повідомлення про помилки, які можуть з'явитися на комп'ютерах або інших електронних пристроях. Якщо комп'ютер не запускається через помилку POST, можна використовувати інший пристрій для пошуку значення і причини помилки з веб-сайту виробника. Потім можна вжити відповідних заходів - видалення модуля пам'яті або повторну установку відеокарти з подальшим перезапуском обладнання.

GET

POST також є методом передачі змінних форми HTML з одного веб-сторінки на іншу, не відображаючи їх в адресному рядку. Альтернативний метод - GET, який додає значення в URL. Запити HTTP POST надають додаткові дані від клієнта (браузера) на сервер в тексті листа. Навпаки, запити GET включають всі необхідні дані в URL. Форми в HTML можуть використовувати будь-який метод, вказавши метод \u003d POST або method \u003d GET (за замовчуванням) в елементі

. Зазначений метод визначає, як дані форми передаються на сервер. Коли використовується метод GET, всі дані форми кодуються в URL-адресу в якості параметрів рядка запиту. З POST дані форми з'являються в тексті листа HTTP-запиту.

Відмінності в поданні форми

Метод запиту POST запитує веб-сервер на прийом і зберігання даних, укладені в тіло повідомлення запиту. Часто використовується при завантаженні файлу або при відправці заповненої веб-форми.

Метод запиту HTTP GET витягує інформацію з сервера. В рамках запиту GET деякі дані можуть передаватися в рядку запиту URL-адреси, вказуючи умови пошуку, діапазони дат іншу інформацію, яка визначає запит.

В рамках запиту POST довільний обсяг даних будь-якого типу може бути відправлений на сервер в тексті листа запиту. Поле заголовка в запиті POST зазвичай вказує тип інтернет-носія тіла повідомлення.

Основна відмінність між запитами GET і POST полягає в тому, що вони відповідають різним HTTP-запитами, як визначено в специфікаціях HTTP. Процес подачі обох методів починається таким же чином: набір даних форми створюється браузером і потім кодується способом, зазначеним атрибутом enctype. Для METHOD \u003d "POST атрибут enctype може бути multipart / form-data або application / x-www-form-urlencoded, тоді як для METHOD \u003d" GET "запускається тільки через application / x-www-form-urlencoded. Ці дані форми set потім передається на сервер.

Для відправки форми за допомогою METHOD \u003d "GET" браузер створює URL-адресу, приймаючи значення атрибута дії і додаючи до нього набір даних форми, закодованого з використанням типу контенту application / x-www-form-urlencoded). Потім браузер обробляє цей URL-адресу, як якщо б він посилався на посилання (або, як якщо б користувач набрав URL-адресу вручну). Браузер ділить URL на частини і розпізнає хост, потім відправляє на цей хост запит GET з іншою частиною URL в якості аргументу. Важливо відзначити, що цей процес означає, що дані форми обмежені кодами ASCII. Особливу увагу слід приділяти кодування і декодування інших типів символів при передачі їх по URL-адресою в форматі ASCII.

Подання форми з METHOD \u003d "POST» викликає відправку запиту POST з використанням значення атрибута дії і повідомлення, створеного відповідно до типу контенту, зазначеним атрибутом enctype.

PHP

PHP - це вбудований в HTML. Це означає, що PHP-код можна вставити в HTML-сторінку. Код PHP читається або аналізується сервером, на якому знаходиться сторінка. Висновок функцій GET і POST в PHP на сторінці зазвичай повертається як HTML-код, який може бути прочитаний браузером. Оскільки PHP-код перетворюється в HTML до завантаження сторінки, користувачі не можуть переглядати PHP-код на сторінці. Це робить сторінки PHP достатніми для доступу до баз даних та іншої захищеної інформації.

Велика частина синтаксису PHP запозичена з інших мов, таких як C, Java і Perl. Однак PHP має ряд унікальних функцій і спеціальних функцій. Мета цієї мови - дати можливість веб-розробникам швидко і легко писати динамічно згенеровані сторінки.

Wordpress

WordPress - це безкоштовна система управління контентом, яка використовується для створення та обслуговування веб-сайтів. Його простота використання і унікальні функції ведення блогу допомогли йому стати самим популярним інструментом ведення блогів в Інтернеті.

Інтерфейс WordPress дозволяє будь-кому, хто не має досвіду веб-розробки, створити і опублікувати веб-сайт. Вбудовані інструменти ведення блогу забезпечують простий спосіб відстеження окремих повідомлень, відвідувачів і коментарів користувачів.

Незважаючи на те що доступні тисячі шаблонів WordPress і плагінів, система POST GET в WordPress все ще має свої обмеження. Оскільки це служба на основі шаблонів, користувач повинен почати з заздалегідь створеного веб-сайту, а не створювати сторінки з нуля. Крім того, немає можливості вставляти скрипти або підтримувати базу даних з тим же рівнем контролю, який пропонує власної веб-сайт.

Інструмент POST_GET_ID () дозволяє використовувати скрипти для управління елементом, так як він має унікальний ідентифікатор, і при відправленні його в вигляді форми через дані методи розкривається буде відправлений з унікальним ідентифікатором, який дозволяє сценарієм помічати, яка публікація працює. В якості альтернативи може бути відправлена \u200b\u200bприхована змінна, яка дозволить сценарієм побачити, яка публікація відноситься до подання.

Цей пост - відповідь на питання, поставлене в коментарі до однієї з моїх статей.

У статті я хочу розповісти, що ж із себе представляють HTTP-методи GET / POST / PUT / DELETE та інші, для чого вони були придумані і як їх використовувати відповідно до REST.

HTTP

Отже, що ж представляє із себе один з основних протоколів Інтернету? Педантів відправлю до RFC2616, а іншим розповім по-людськи :)

Цей протокол описує взаємодію між двома комп'ютерами (клієнтом і сервером), побудоване на базі повідомлень, званих запит (Request) і відповідь (Response). Кожне повідомлення складається з трьох частин: стартова рядок, заголовки і тіло. При цьому обов'язковою є тільки стартова рядок.

Стартові рядки для запиту і відповіді мають різний формат - нам цікава тільки стартова рядок запиту, яка виглядає так:

METHOD URI HTTP / VERSION ,

Де METHOD - це як раз метод HTTP-запиту, URI - ідентифікатор ресурсу, VERSION - версія протоколу (на наразі актуальна версія 1.1).

Заголовки - це набір пар ім'я-значення, розділених двокрапкою. У заголовках передається різна службова інформація: Кодування повідомлення, назву та версію браузера, адреса, з якого прийшов клієнт (Referrer) і так далі.

Тіло повідомлення - це, власне, передані дані. У відповіді переданими даними, як правило, є html-сторінка, яку запросив браузер, а в запиті, наприклад, в тексті листа передається вміст файлів, що завантажуються на сервер. Але як правило, тіло повідомлення в запиті взагалі відсутня.

Приклад HTTP-взаємодії

Розглянемо приклад.

запит:
GET /index.php HTTP / 1.1 Host: example.com User-Agent: Mozilla / 5.0 (X11; U; Linux i686; ru; rv: 1.9b5) Gecko / 2008050509 Firefox / 3.0b5 Accept: text / html Connection: close
Перший рядок - це рядок запиту, інші - заголовки; тіло повідомлення відсутній

відповідь:
HTTP / 1.0 200 OK Server: nginx / 0.6.31 Content-Language: ru Content-Type: text / html; charset \u003d utf-8 Content-Length: тисячі двісті тридцять чотири Connection: close ... САМА HTML-СТОРІНКА ...

Ресурси і методи

Повернемося до стартової рядку запиту і згадаємо, що в ній присутній такий параметр, як URI. Це розшифровується, як Uniform Resource Identifier - однаковий ідентифікатор ресурсу. Ресурс - це, як правило, файл на сервері (приклад URI в даному випадку "/styles.css"), але взагалі ресурсом може бути і якийсь абстрактний об'єкт ( "/ blogs / webdev /" - вказує на блок «Веб- розробка », а не на конкретний файл).

Тип HTTP-запиту (також званий HTTP-метод) вказує сервера на те, яку дію ми хочемо зробити з ресурсом. Спочатку (на початку 90-х) передбачалося, що клієнт може хотіти від ресурсу тільки одне - отримати його, однак зараз по протоколу HTTP можна створювати пости, редагувати профіль, видаляти повідомлення і багато іншого. І ці дії складно об'єднати терміном «отримання».

Для розмежування дій з ресурсами на рівні HTTP-методів і були придумані такі варіанти:

  • GET - отримання ресурсу
  • POST - створення ресурсу
  • PUT - оновлення ресурсу
  • DELETE - видалення ресурсу
Зверніть увагу на той факт, що специфікація HTTP не зобов'язує сервер розуміти всі методи (яких насправді набагато більше, ніж 4) - обов'язковий тільки GET, а також не вказує серверу, що він повинен робити при отриманні запиту з тим чи іншим методом. А це означає, що сервер у відповідь на запит DELETE /index.php HTTP / 1.1 не зобов'язаний видаляти сторінку index.php на сервері, так само як на запит GET /index.php HTTP / 1.1 не зобов'язаний повертати вам сторінку index.php, він може її видаляти, наприклад :)

У гру вступає REST

REST (REpresentational State Transfer) - це термін був введений в 2000-му році Роєм Філдінгом (Roy Fielding) - одним з розробників протоколу HTTP - в якості назви групи принципів побудови веб-додатків. Взагалі REST охоплює більш широку область, ніж HTTP - його можна застосовувати і в інших мережах з іншими протоколами. REST описує принципи взаємодії клієнта і сервера, засновані на поняттях «ресурсу» і «дієслова» (можна розуміти їх як підмет і присудок). У разі HTTP ресурс визначається своїм URI, а дієслово - це HTTP-метод.

REST пропонує відмовитися від використання однакових URI для різних ресурсів (тобто адреси двох різних статей на кшталт /index.php?article_id\u003d10 і /index.php?article_id\u003d20 - це не REST-way) і використовувати різні HTTP-методи для різних дій. Тобто веб-додаток, написаний з використанням REST підходу буде видаляти ресурс при зверненні до нього з HTTP-методом DELETE (зрозуміло, це не означає, що треба давати можливість видалити все і вся, але будь-який запит на видалення в додатку повинен використовувати HTTP-метод DELETE).

REST дає програмістам можливість писати стандартизовані і трохи більше красиві веб-додатки, ніж раніше. Використовуючи REST, URI для додавання нового користувача буде не /user.php?action\u003dcreate (метод GET / POST), а просто /user.php (метод строго POST).

У підсумку, поєднавши наявну специфікацію HTTP і REST-підхід нарешті знаходять сенс різні HTTP-методи. GET - повертає ресурс, POST - створює новий, PUT - оновлює існуючий, DELETE - видаляє.

Проблеми?

Так є невелика проблема із застосуванням REST на практиці. Проблема ця називається HTML.

PUT / DELETE запити можна надсилати за допомогою XMLHttpRequest, за допомогою звернення до сервера «вручну» (скажімо, через curl або навіть через telnet), але не можна зробити HTML-форму, що відправляє повноцінний PUT / DELETE-запит.

Справа в тому, специфікація HTML не дозволяє створювати форми, які надсилають дані інакше, ніж через GET або POST. Тому для нормальної роботи з іншими методами доводиться імітувати їх штучно. Наприклад, в Rack (механізм, на базі якого Ruby взаємодіє з веб-сервером; із застосуванням Rack зроблені Rails, Merb і інші Ruby-фреймворки) в форму можна додати hidden-поле з ім'ям "_method", а в якості значення вказати назву методу (наприклад, «PUT») - в цьому випадку буде відправлений POST-запит, але Rack зможе зробити вигляд, що отримав PUT, а не POST.

HTML-форми. Масиви $ _POST і $ _GET

HTML-форми. Методи відправки даних на сервер

З HTML-формами ви напевно вже зустрічалися:

Введіть ваше ім'я:

зберігши даний код в HTML-файлі і переглянувши його за допомогою вашого улюбленого браузера, ви побачите звичну HTML-форму:

Тег

, Що має парний завершальний тег
, Власне і задає форму. Його атрибути - обидва необов'язкові:

  • action - вказує URL (повний або відносний), на який буде відправлена \u200b\u200bформа. Якщо цей атрибут й вказати, більшість браузерів (точніше кажучи, всі відомі мені браузери) відправляють форму на поточний документ, тобто "саму на себе". Це зручне скорочення, але за стандартом HTML атрибут action обов'язковий.
  • method - спосіб відправки форми. Їх два.
    • GET - відправка даних форми в адресному рядку.
      Ви могли помітити на різних сайтах присутність в кінці URL символу "?" і наступних за ним даних в форматі параметр \u003d значення. Тут "параметр" відповідає значенню атрибута name елементів форми (див. Нижче про тег ), А "значення" - вмісту атрибута value (в ньому, наприклад, міститься введення користувача в текстове поле того ж тега ).
      Для прикладу - спробуйте пошукати що-небудь в Яндексі і зверніть увагу на адресний рядок браузера. Це і є спосіб GET.
    • POST - дані форми відправляються в тілі запиту. Якщо не зовсім зрозуміло (або зовсім незрозуміло), що це таке - не хвилюйтеся, скоро ми до цього питання повернемося.
    Якщо атрибут method не вказано - мається на увазі GET.

Тег - задає елемент форми, який визначається атрибутом type:

  • Значення "text" задає однорядкове текстове поле введення
  • Значення "submit" задає кнопку, при натисканні якої відбувається відправка форми на сервер

Можливі й інші значення (та й - не єдиний тег, що задає елемент форми).

Отже, що ж відбувається, коли ми натискаємо кнопку "OK"?

  1. Браузер переглядає входять в форму елементи і формує з них атрибутів name і value дані форми. Припустимо, введено ім'я Vasya. У цьому випадку дані форми - name \u003d Vasya & okbutton \u003d OK
  2. Браузер встановлює з'єднання з сервером, відправляє на сервер запит документа, зазначеного в атрибуті action тега
    , Використовуючи метод відправки даних, вказаний в атрибуті method (в даному випадку - GET), передаючи в запиті дані форми.
  3. Сервер аналізує отриманий запит, формує відповідь, відправляє його браузеру і закриває з'єднання
  4. Браузер відображає отриманий від сервера документ

Відправка того ж запиту вручну (з допомогою telnet) виглядає наступним чином (припустимо, що доменне ім'я сайту - www.example.com):

Telnet www.example.com 80 GET /cgi-bin/form_handler.cgi?name\u003dVasya&okbutton\u003dOK HTTP / 1.0 \\ r \\ n Host: www.example.com \\ r \\ n \\ r \\ n

Як ви, швидше за все, вже здогадалися, натискання submit-кнопки в формі з методом відправки "GET" аналогічно введенню відповідного URL (зі знаком питання і даними форми в кінці) в адресному рядку браузера:

Http://www.example.com/cgi-bin/form_handler.cgi?name\u003dVasya&okbutton\u003dOK

Насправді, метод GET використовується завжди, коли ви запитуєте з сервера будь-якої документ, просто ввівши його URL, або клацнувши по посиланню. При використанні , До URL просто додаються знак питання і дані форми.

Можливо, всі ці технічні подробиці і вправи з telnet-ом здаються вам неймовірно нудними і навіть непотрібними ( "а при чому тут PHP?"). А дарма. :) Це основи роботи по протоколу HTTP, які необхідно знати назубок кожному Web-програмісту, і це не теоретичні знання - все це стане в нагоді на практиці.

Тепер замінимо перший рядок нашої форми на наступну:

Ми вказали метод відправки "POST". У цьому випадку дані відправляються на сервер дещо іншим способом:

Telnet www.example.com 80 POST /cgi-bin/form_handler.cgi HTTP / 1.0 \\ r \\ n Host: www.example.com \\ r \\ n Content-Type: application / x-www-form-urlencoded \\ r \\ При використанні методу POST дані форми відправляються вже після "двох Enter-ів" - в тілі запиту. Все, що вище - насправді заголовок запиту (і коли ми використовували метод GET, дані форми відправлялися в заголовку). Для того, щоб сервер знав, на якому байте закінчити читання тіла запиту, в заголовку присутній рядок Content-Length; про те ж, що дані форми будуть передані вигляді параметр1 \u003d значення1 & параметр2 \u003d значення2 ..., причому значення передаються у вигляді urlencode - тобто, точно так же, як і за допомогою методу GET, але в тілі запиту, - сервера повідомляє заголовок Content -Type: application / x-www-form-urlencoded.

Перевага методу POST - відсутність обмеження на довжину рядка з даними форми.

При використанні методу POST неможливо відправити форму, просто "зайшовши за посиланням", як було з GET.

При використанні POST-форми, в її атрибуті action можна вказати після знака питання і параметри GET-форми. Таким чином, метод POST включає в себе і метод GET.

Масиви $ _GET і $ _POST

Отже, форми є основним способом обміну даними між веб-сервером і браузером, тобто забезпечують взаємодію з користувачем - власне, для чого і потрібно веб-програмування.

Розглянемо простий приклад:

if ($ _SERVER [ "REQUEST_METHOD"] \u003d\u003d "POST") (



echo "
Привіт,

". $ _POST [" name "]." Введіть ваше ім'я:

!" ;
}
?>
">
Форма, наведена в рядках 8-12, містить два елементи: name і okbutton. Атрибут method вказує метод відправки форми POST, атрибут ж action, який вказує URL, на який відправляється форма, заповнюється значенням серверної змінної PHP_SELF - адресою виконуваного в даний момент скрипта.






- скорочена форма запису для

Припустимо, в поле name ми ввели значення Вася, і натиснули кнопку OK. При цьому браузер відправляє на сервер POST-запит. Тіло запиту: name \u003d Вася & okbutton \u003d OK. PHP автоматично заповнює масив $ _POST: .

$ _POST [ "name"] \u003d "Вася"

$ _POST [ "okbutton"] \u003d "OK"
Насправді, значення "Вася" відправляється браузером в urlencode-вигляді; для кодування windows-1251 це значення виглядає як% C2% E0% F1% FF. Але, оскільки PHP автоматично здійснює необхідне декодування, ми можемо "забути" про цю особливість - поки не доведеться працювати з HTTP-запитами вручну.

Так як в тілі запиту вказуються тільки імена і значення, але не типи елементів форм, PHP поняття не має, відповідає $ _POST [ "name"] рядку введення, кнопці, або списку. Але ця інформація нам, в общем-то, абсолютно не потрібна. :)

Оскільки знати, що написано на кнопці submit, нам необов'язково, в рядку 11 можна видалити атрибут name, скоротивши опис кнопки до . В цьому випадку, браузер відправить POST-запит name \u003d Вася.

А тепер - те ж саме, але для GET-форми:



if (isset ($ _ GET [ "name"])) (
Привіт,

". $ _POST [" name "]." ". $ _GET [" name "]."

!" ;
}
?>
">
Форма, наведена в рядках 8-12, містить два елементи: name і okbutton. Атрибут method вказує метод відправки форми POST, атрибут ж action, який вказує URL, на який відправляється форма, заповнюється значенням серверної змінної PHP_SELF - адресою виконуваного в даний момент скрипта.







У рядку 8 можна було б з таким же успіхом написати

: GET - метод за замовчуванням. Цього разу браузер відправляє GET-запит, який рівносильний введенню в адресному рядку адреси: http: //адрес-сайта/імя-скріпта.php? Name \u003d Вася.

PHP з GET-форма надходить точно так же, як і з POST, з тією відмінністю, що заповнюється масив $ _GET.

Кардинальне ж відмінність - в рядку 4. Оскільки простий введення адреси в рядку браузера є GET-запитом, перевірка if ($ _SERVER [ "REQUEST_METHOD"] \u003d\u003d "GET") безглузда. Тому ми вдаємося до конструкції isset (), яка повертає true, якщо дана змінна визначена (тобто їй було присвоєно значення), і false - якщо змінна не визначена. Якщо форма була заповнена - як ви вже зрозуміли, PHP автоматично привласнює $ _GET [ "name"] відповідне значення.

Cпособ перевірки за допомогою isset () - універсальний, його можна було б використовувати і для POST-форми. Більш того, він краще, так як дозволяє з'ясувати, які саме поля форми заповнені.

Трохи складніший приклад.




echo "Вкажіть ім'я!
" ;
< 1900 || $_POST [ "year" ] > 2004 ) {
echo
"
;
) Else (

" ;

echo "Вам". $ Age. "років
" ;
}
Привіт,


" ;
}
?>
">
Форма, наведена в рядках 8-12, містить два елементи: name і okbutton. Атрибут method вказує метод відправки форми POST, атрибут ж action, який вказує URL, на який відправляється форма, заповнюється значенням серверної змінної PHP_SELF - адресою виконуваного в даний момент скрипта.


Введіть Ваш рік народження:







Ніяких нових прийомів тут не використовується. Розберіться, виконайте код, спробуйте модифікувати ...

Змінимо останній приклад, щоб користувачеві не потрібно було повторно заповнювати поля. Для цього заповнимо атрибути value елементів форми тільки що введеними значеннями.



$ Name \u003d isset ($ _ POST [ "name"])? $ _POST [ "name"]: "";
$ Year \u003d isset ($ _ POST [ "year"])? $ _POST [ "year"]: "";

If (isset ($ _ POST [ "name"], $ _POST [ "year"])) (
if ($ _POST [ "name"] \u003d\u003d "") (
echo "Вкажіть ім'я!
" ;
) Else if ($ _POST [ "year"]< 1900 || $_POST [ "year" ] > 2004 ) {
echo "Вкажіть рік народження! Допустимий діапазон значень: 1900..2004
"
;
) Else (
echo "Привіт,". $ _POST [ "name"]. "!
" ;
$ Age \u003d 2004 - $ _POST [ "year"];
echo "Вам". $ Age. "років
" ;
}
Привіт,


" ;
}
?>
">
Форма, наведена в рядках 8-12, містить два елементи: name і okbutton. Атрибут method вказує метод відправки форми POST, атрибут ж action, який вказує URL, на який відправляється форма, заповнюється значенням серверної змінної PHP_SELF - адресою виконуваного в даний момент скрипта.


Введіть Ваш рік народження:







Кілька незрозумілими можуть виявитися рядка 4 та 5. Всі дуже просто: рядок 4 можна було б записати так:

if (isset ($ _ POST [ "name"]))
$ Name \u003d $ _POST [ "name"];
else
$ Name \u003d "";

Може виникнути питання - чому б не викинути рядка 4-5 і не написати:

Форма, наведена в рядках 8-12, містить два елементи: name і okbutton. Атрибут method вказує метод відправки форми POST, атрибут ж action, який вказує URL, на який відправляється форма, заповнюється значенням серверної змінної PHP_SELF - адресою виконуваного в даний момент скрипта. ">

Введіть Ваш рік народження: ">

Справа в тому, що, якщо ці POST -змінного не визначені - а так і буде, якщо форму ще не заповнювали, - PHP видасть попередження про використання неініціалізованих змінних (причому, цілком обгрунтовано: таке повідомлення дозволяє швидко знаходити труднообнаружімие помилки в іменах змінних, а також попереджає про можливі "дірках" на сайті). Можна, звичайно, помістити код з isset прямо в форму, але вийде занадто громіздко.

Розібралися? А тепер спробуйте знайти помилку в наведеному коді. Ну, не зовсім помилку, - але недолік.

htmlspecialchars ()

Не знайшли? Я підкажу. Введіть, наприклад, в поле "ім'я" подвійні лапки і який-небудь текст, наприклад, Ва "ся. Надішліть форму, і погляньте на вихідний код отриманої сторінки. У четвертому рядку буде щось на зразок:

Форма, наведена в рядках 8-12, містить два елементи: name і okbutton. Атрибут method вказує метод відправки форми POST, атрибут ж action, який вказує URL, на який відправляється форма, заповнюється значенням серверної змінної PHP_SELF - адресою виконуваного в даний момент скрипта.

Тобто - нічого хорошого. А якби хитрий користувач ввів JavaScript-код?

Для вирішення цієї проблеми необхідно скористатися функцією htmlspecialchars (), яка замінить службові символи на їх HTML-уявлення (наприклад, лапки - на "):



$ Name \u003d isset ($ _ POST [ "name"])? htmlspecialchars ($ _POST [ "name"]): "";
$ Year \u003d isset ($ _ POST [ "year"])? htmlspecialchars ($ _POST [ "year"]): "";

If (isset ($ _ POST [ "name"], $ _POST [ "year"])) (
if ($ _POST [ "name"] \u003d\u003d "") (
echo "Вкажіть ім'я!
" ;
) Else if ($ _POST [ "year"]< 1900 || $_POST [ "year" ] > 2004 ) {
echo "Вкажіть рік народження! Допустимий діапазон значень: 1900..2004
"
;
) Else (
echo "Привіт,". $ Name. "!
" ;
$ Age \u003d 2004 - $ _POST [ "year"];
echo "Вам". $ Age. "років
" ;
}
Привіт,


" ;
}
?>
">
Форма, наведена в рядках 8-12, містить два елементи: name і okbutton. Атрибут method вказує метод відправки форми POST, атрибут ж action, який вказує URL, на який відправляється форма, заповнюється значенням серверної змінної PHP_SELF - адресою виконуваного в даний момент скрипта.


Введіть Ваш рік народження:







Повторіть досвід і переконайтеся, що тепер HTML-код коректний.

Запам'ятайте - функцію htmlspecialchars () необхідно використовувати завжди, коли виводиться вміст змінної, в якій можуть бути присутніми спецсимволи HTML.

phpinfo ()

Функція phpinfo () - одна з найважливіших в PHP. Вона виводить інформацію про налаштування PHP, значення всіляких конфігураційних змінних ...

Чому я згадую про неї в статті, присвяченій формам? phpinfo () - зручне засіб налагодження. phpinfo (), крім іншого, виводить значення всіх $ _GET, $ _POST і $ _SERVER змінних. Так що, якщо змінна форми "загубилася", найпростіший спосіб виявити, в чому справа - скористатися функцією phpinfo (). Для того, щоб функція виводила тільки значення змінних (і вам не довелося прокручувати десяток сторінок), її слід викликати наступним чином: phpinfo (INFO_VARIABLES); , Або - що абсолютно те ж саме - phpinfo (32);.



">
Форма, наведена в рядках 8-12, містить два елементи: name і okbutton. Атрибут method вказує метод відправки форми POST, атрибут ж action, який вказує URL, на який відправляється форма, заповнюється значенням серверної змінної PHP_SELF - адресою виконуваного в даний момент скрипта.


phpinfo (32);
?>



Або, наприклад, така ситуація: ви хочете дізнатися IP-адреса відвідувача. Ви пам'ятаєте, що відповідна змінна зберігається в масиві $ _SERVER, але - ось невдача - забули, як саме змінна називається. Знову ж, викликаємо phpinfo (32); , Шукаємо в табличці свій IP-адресу і знаходимо його - в рядку $ _SERVER [ "REMOTE_ADDR"].



Сподобалася стаття? поділіться їй