Форма в HTML — это способ передать данные от пользователя на сервер. Чтобы она работала, у тега <form> есть три ключевых атрибута: method, action и enctype. Разберём каждый на простых примерах.
action: куда улетают данные
Атрибут action задаёт адрес, на который браузер отправит данные формы. Это URL — страница или API-эндпоинт, который их примет.
<form action="/submit-order"> <!-- поля формы --> </form>
Здесь при отправке браузер сделает запрос на /submit-order (относительный путь). Можно указать и полный адрес:
<form action="https://api.example.com/orders">
На практике: если забыть action, форма попытается отправить данные на текущую страницу. Иногда это удобно, но чаще лучше явно указать, куда должны попасть данные.
method: каким способом отправить
Атрибут method говорит браузеру, какой HTTP-метод использовать. Чаще всего это GET или POST.
GET
Данные попадают в URL как параметры:
<form action="/search" method="GET"> <input type="text" name="q" placeholder="Что ищем?"> <button type="submit">Найти</button> </form>
Пользователь вводит «котики» и нажимает кнопку — браузер переходит на:
https://site.com/search?q=котики
Когда это уместно:
- поиск, фильтры, пагинация — действия, которые не меняют состояние на сервере;
- результат можно сохранить в закладках или отправить ссылкой.
Ограничения: длина URL ограничена (обычно несколько килобайт), поэтому большие объёмы данных так не передают. Также не стоит передавать чувствительные данные (пароли, токены) в GET — они остаются в истории браузера и логах сервера.
POST
Данные уходят в теле запроса, а не в URL:
<form action="/login" method="POST"> <input type="email" name="email"> <input type="password" name="password"> <button type="submit">Войти</button> </form>
Браузер отправляет POST-запрос на /login, а логин и пароль — внутри запроса.
Когда это уместно:
- регистрация, вход, отправка комментариев, оформление заказа — действия, меняющие состояние;
- передача больших данных;
- работа с конфиденциальной информацией.
На практике: для большинства форм, где пользователь что-то создаёт или меняет, выбирают method="POST".
enctype: как упаковать данные
Атрибут enctype задаёт тип кодирования данных формы при отправке. Он особенно важен, когда нужно загружать файлы.
application/x-www-form-urlencoded (по умолчанию)
Это стандартное кодирование: данные превращаются в строку вида name=value&name2=value2, спецсимволы экранируются. Подходит для текста и чисел.
<form action="/profile" method="POST" enctype="application/x-www-form-urlencoded"> <input name="username"> <input name="age"> </form>
Если не указать enctype, браузер использует именно его.
multipart/form-data
Нужен, когда в форме есть файлы:
<form action="/upload" method="POST" enctype="multipart/form-data"> <input type="file" name="avatar"> <input name="bio"> <button type="submit">Сохранить</button> </form>
В этом режиме данные разбиваются на части (multipart), и файлы передаются как отдельные части запроса. Без enctype="multipart/form-data" файл не уйдёт на сервер.
Нюанс: даже если в форме только текст, но вы указали multipart/form-data, она всё равно будет работать — просто с чуть большей служебной нагрузкой. Но для форм без файлов это избыточно.
text/plain
Редкий вариант: данные отправляются почти «как есть», без кодирования. Почти не используется на практике, потому что серверу сложно разобрать такой формат.
Частые ошибки и как их избежать
- Забыли
method. По умолчанию будетGET. Если форма должна менять данные на сервере, это ошибка. - Загружаете файл без
enctype="multipart/form-data". Сервер не получит файл. - Передаёте пароли через
GET. Они окажутся в URL, логах и истории браузера. - Слишком длинные данные в
GET. Могут обрезаться или вызвать ошибку.
Практический пример: форма заказа с файлом
Допустим, пользователь оформляет заказ и прикладывает скан документа:
<form action="/orders" method="POST" enctype="multipart/form-data" > <label> Имя: <input type="text" name="customer_name" required> </label> <label> Телефон: <input type="tel" name="phone" required> </label> <label> Комментарий: <textarea name="comment"></textarea> </label> <label> Скан документа: <input type="file" name="document" accept=".pdf,.jpg"> </label> <button type="submit">Оформить заказ</button> </form>
Что здесь происходит:
action="/orders"— данные уйдут на обработку заказов.method="POST"— это действие, меняющее состояние, и могут быть большие данные.enctype="multipart/form-data"— чтобы вместе с текстом ушёл и файл.
Как проверить, что всё работает
- Откройте форму в браузере.
- В инструментах разработчика (F12 → вкладка Network) отправьте форму.
- Найдите запрос к нужному URL и посмотрите:
- метод (GET/POST);
- заголовки (в том числе
Content-Type); - тело запроса или параметры в URL.
Так сразу видно, как именно браузер отправил данные и нет ли ошибок.
