Методы HTTP запроса
HTTP определяет множество методов запроса, которые указывают, какое желаемое действие выполнится для данного ресурса. Несмотря на то, что их названия могут быть существительными, эти методы запроса иногда называются HTTP глаголами. Каждый реализует свою семантику, но каждая группа команд разделяет общие свойства: так, методы могут быть безопасными, идемпотентными или кешируемыми.
Метод GET запрашивает представление ресурса. Запросы с использованием этого метода могут только извлекать данные.
HEAD запрашивает ресурс так же, как и метод GET, но без тела ответа.
POST используется для отправки сущностей к определённому ресурсу. Часто вызывает изменение состояния или какие-то побочные эффекты на сервере.
PUT заменяет все текущие представления ресурса данными запроса.
DELETE удаляет указанный ресурс.
CONNECT устанавливает «туннель» к серверу, определённому по ресурсу.
OPTIONS используется для описания параметров соединения с ресурсом.
TRACE выполняет вызов возвращаемого тестового сообщения с ресурса.
PATCH используется для частичного изменения ресурса.
Спецификации
| Спецификация | Название | Комментарий |
|---|---|---|
| RFC 7231, раздел 4: Request methods | Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content | Определение GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE. |
| RFC 5789, раздел 2: Patch method | PATCH метод для HTTP | Определение PATCH. |
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
Found a content problem with this page?
- Edit the page on GitHub.
- Report the content issue.
- View the source on GitHub.
This page was last modified on 7 авг. 2023 г. by MDN contributors.
Your blueprint for a better internet.
MDN
Support
- Product help
- Report an issue
Our communities
Developers
- Web Technologies
- Learn Web Development
- MDN Plus
- Hacks Blog
- Website Privacy Notice
- Cookies
- Legal
- Community Participation Guidelines
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998– 2024 by individual mozilla.org contributors. Content available under a Creative Commons license.
CRUD — HTTP API
В программировании часто используется аббревиатура CRUD . Она обозначает четыре базовых операции над информацией:
- Создание
- Чтение
- Обновление
- Удаление
CRUD строят вокруг пользователя или какой-то другой сущности. Для этого создают либо интерфейс с формами, либо HTTP API эндпоинты. В этом уроке мы научимся проводить все эти операции на примере сервиса DummyJSON .
В целях безопасности этот сервис не выполняет реальных изменений на сервере. Все операции выглядят так, как будто они вносят изменения, но изменения на самом деле не происходят.
Посмотрим на пример данных:
| Метод | URL | Операция |
|---|---|---|
| GET | /users | Список пользователей |
| GET | /users/1 | Информация о пользователе |
| POST | /users/add | Добавление пользователя |
| PATCH | /users/1 | Обновление пользователя |
| DELETE | /users/1 | Удаление пользователя |
Как видите, в URL постоянно повторяется 1 — это идентификатор конкретного пользователя. Он будет меняться в зависимости от того, с каким пользователем мы работаем прямо сейчас.
Кстати, идентификатор необязательно должен быть числом. Здесь все зависит от того, что бэкенд считает идентификатором и как идентификаторы создаются в базе данных. Например, в MongoDB идентификатор состоит из чисел и букв.
Давайте вернемся к примеру выше и обратим внимание на использование методов HTTP. У методов есть определенный смысл:
- GET нужен для извлечения данных
- POST — для создания и отправки форм
- PATCH — для обновления
- DELETE — для удаления
При этом URL часто остается одним и тем же.
В API важно использовать подходящие методы. Любые HTTP-запросы обрабатываются веб-серверами и промежуточными прокси, которые могут находиться на пути к веб-серверу. И веб-сервер, и прокси знают про особенности HTTP. В зависимости от параметров запроса они могут делать различные оптимизации и кешировать результат.
Кеширование — это такая техника, которая позволяет веб-серверу или прокси сохранить ответ от сервера и отдавать его при следующих запросах без обращения к самому серверу.
Кеширование ускоряет доступ к ресурсам и разгружает серверы. Запрос GET можно кешировать для ускорения доступа, потому что GET никогда не меняет данные.
Методы POST, PATCH и DELETE кешировать нельзя — они должны постоянно приходить на сервер, так как они вносят изменения.
Добавление пользователя
Попробуем добавить пользователя. Для этого по документации Dummy JSON нам нужно отправить POST-запрос на эндпоинт https://dummyjson.com/users/add .
Данные можно отправлять в разных форматах, HTML-формой или JSON-файлом. Чтобы использовать JSON, во время подготовки запроса нужно выполнить два шага:
- Указать заголовок Content-Type со значением application/json
- Преобразовать данные в JSON
В итоге запрос будет выглядеть так:
Есть несколько возможных вариантов ответа от сервера:
- Код 201 — ресурс успешно создан
- Код 422 — ошибка валидации
- Код 406 — некорректные данные или неверный формат
Подробнее можно прочитать в гайде по HTTP-кодам . Большая часть из них может встречаться с любым HTTP-методом.
Обновление пользователя
Для обновления пользователя мы должны отправить PATCH-запрос на эндпоинт https://dummyjson.com/users/ . Обновлять можно любой набор параметров, не обязательно сразу все:
Если все прошло успешно, то возможны два варианта ответа:
- Код 200 с какими-то данными — например, JSON с обновленными данными ресурса
- Код 204 — нет тела ответа
Удаление пользователя
Для удаления пользователя мы должны отправить DELETE-запрос на эндпоинт https://dummyjson.com/users/ . Тела запроса в таком случае нет, потому что все понятно из адреса запроса:
Если все прошло успешно, то возможны два варианта ответа:
- Код 200 и какие-то данные
- Код 204 и пустое тело ответа
Идемпотентность
Когда мы работаем с API, очень важна идемпотентность запросов. Это свойство указывает, насколько безопасно выполнять HTTP-вызов повторно. Идемпотентный запрос приводит к одному и тому же результату независимо от количества сделанных вызовов.
Для примера возьмем эндпоинт /users. Он возвращает список пользователей и ничего не меняет на сервере. Каждый новый вызов этого эндпоинта возвращает идентичный список пользователей — значит, это идемпотентный запрос.
Список пользователей может поменяться, если его меняют где-то в другом месте. Но даже это не поменяет идемпотентность GET-запроса на /users, ведь он сам ничего не меняет.
А вот POST-запрос — точно не идемпотентный. Каждый вызов /users/add имеет два исхода:
- Добавляет нового пользователя, хотя и с теми же самыми данными
- Возвращает ошибку, если на сервере добавлена проверка на уникальность каких-то данных
Именно поэтому при отправке форм после обновления страницы браузер всегда спрашивает, точно ли мы хотим выполнить этот запрос повторно.
По стандарту PATCH тоже не идемпотентный, хотя на практике чаще его делают идемпотентным. Но на это уже не могут рассчитывать браузеры или веб-серверы, потому что они не знают про специфику конкретных приложений.
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях:
Http methods
Метод HTTP является безопасным, если он не меняет состояние сервера. Другими словами, безопасный метод проводит операции “только чтение” (read-only). Несколько следующих методов HTTP безопасные: GET, HEAD или OPTIONS. Все безопасные методы являются также идемпотентными, как и некоторые другие, но при этом небезопасные, такие как PUT или DELETE.
Даже если безопасные методы являются по существу “только для чтения”, сервер всё равно может сменить своё состояние: например, он может сохранять статистику. Что существенно, так то, когда клиент вызывает безопасный метод, то он не запрашивает никаких изменений на сервере, и поэтому не создаёт дополнительную нагрузку на сервер. Браузеры могут вызывать безопасные методы, не опасаясь причинить вред серверу: это позволяет им выполнять некоторые действия, например, предварительная загрузка без риска. Поисковые роботы также полагаются на вызовы безопасных методов.
Безопасные методы не обязательно должны обрабатывать только статичные файлы; сервер может генерировать ответ “на-лету”, пока скрипт, генерирующий ответ, гарантирует безопасность: он не должен вызывать внешних эффектов, таких как формирование заказов, отправка писем и др..
Правильная реализация безопасного метода — это ответственность серверного приложения, потому что сам веб-сервер, будь то Apache, nginx, IIS это соблюсти не сможет. В частности, приложение не должно разрешать изменение состояния сервера запросами GET.
Идемпотентный метод
Метод HTTP является идемпотентным, если повторный идентичный запрос, сделанный один или несколько раз подряд, имеет один и тот же эффект, не изменяющий состояние сервера. Другими словами, идемпотентный метод не должен иметь никаких побочных эффектов (side-effects), кроме сбора статистики или подобных операций. Корректно реализованные методы GET, HEAD, PUT и DELETE идемпотентны, но не метод POST. Также все безопасные методы являются идемпотентными.
Для идемпотентности нужно рассматривать только изменение фактического внутреннего состояния сервера, а возвращаемые запросами коды статуса могут отличаться: первый вызов DELETE вернёт код 200, в то время как последующие вызовы вернут код 404. Из идемпотентности DELETE неявно следует, что разработчики не должны использовать метод DELETE при реализации RESTful API с функциональностью удалить последнюю запись.
Обратите внимание, что идемпотентность метода не гарантируется сервером, и некоторые приложения могут нарушать ограничение идемпотентности.
Кешируемые методы
Кешируемые ответы — это HTTP-ответы, которые могут быть закешированы, то есть сохранены для дальнейшего восстановления и использования позже, тем самым снижая число запросов к серверу. Не все HTTP-ответы могут быть закешированы. Вот несколько ограничений:
- Метод, используемый в запросе, кешируемый, если это GET или HEAD. Ответ для POST или PATCH запросов может также быть закеширован, если указан признак “свежести” данных и установлен заголовок Content-Location (en-US), но это редко реализуется. Например, Firefox не поддерживает это согласно. Другие методы, такие как PUT и DELETE не кешируемые, и результат их выполнения не кешируется
- Коды ответа, известные системе кеширования, которые рассматриваются как кешируемые: 200, 203, 204, 206, 300, 301, 404, 405, 410, 414, 501.
- Отсутствуют специальные заголовки в ответе, которые предотвращают кеширование: например, Cache-Control.
Обратите внимание, что некоторые некешируемые запросы-ответы к определённым URI могут сделать недействительным (инвалидируют) предыдущие закешированные ответы на тех же URI. Например, PUT к странице pageX.html инвалидируют все закешированные ответы GET или HEAD запросов к этой странице.
Методы, используемые в html-формах
Таблица методов
| GET | POST | DELETE | HEAD | PUT | PATCH | |
|---|---|---|---|---|---|---|
| Запрос имеет тело | нет | да | ** | нет | да | да |
| Успешный ответ имеет тело | да | да | ** | нет | нет | да |
| Безопасный | да | нет | нет | да | нет | нет |
| Идемпотентный | да | нет | да | да | да | нет |
| Кешируемый | да | * | нет | да | нет | нет |
| Допускается в HTML-формах | да | да | нет | нет | нет | нет |
* Только если включена информация о свежести сообщения ** Может
HTTP-метод POST предназначен для отправки данных на сервер. Тип тела запроса указывается в [http-заголовки] Content-Type.
Разница между PUT и POST состоит в том, что PUT является идемпотентным: повторное его применение даёт тот же результат, что и при первом применении (то есть у метода нет побочных эффектов), тогда как повторный вызов одного и того же метода POST может иметь такие эффекты, как например, оформление одного и того же заказа несколько раз.
Запрос POST обычно отправляется через форму HTML и приводит к изменению на сервере. В этом случае тип содержимого выбирается путём размещения соответствующей строки в атрибуте enctype элемента или formenctype атрибута элементов или :
Когда запрос POST отправляется с помощью метода, отличного от HTML-формы, — например, через XMLHttpRequest — тело может принимать любой тип. Как описано в спецификации HTTP 1.1, POST предназначен для обеспечения единообразного метода для покрытия следующих функций:
- Аннотация существующих ресурсов
- Публикация сообщения на доске объявлений, в новостной группе, в списке рассылки или в аналогичной группе статей;
- Добавление нового пользователя посредством модальности регистрации;
- Предоставление блока данных, например, результата отправки формы, процессу обработки данных;
- Расширение базы данных с помощью операции добавления.
Метод запроса [http] PATCH частично изменяет ресурс.
В какой-то степени PATCH можно назвать аналогом концепта «обновить» (update) из CRUD (en-US) (но не стоит путать HTTP и CRUD (en-US) — это две разные вещи).
PATCH может как быть идемпотентным, так и не быть, в отличие от PUT , который всегда идемпотентен. Операция считается идемпотентной, если её многократное выполнение приводит к тому же результату, что и однократное выполнение. Например, если автоинкрементное поле является важной частью ресурса, то PUT перезапишет его (т.к. он перезаписывает всё), но PATCH может и не перезаписать.
PATCH (как и PUT ) может иметь побочные эффекты на другие ресурсы.
Чтобы обозначить, что сервер поддерживает PATCH , можно добавить этот метод в список заголовков ответа Allow (en-US) или Access-Control-Allow-Methods (для CORS).
Другой (неявный) индикатор, что PATCH разрешён, является наличие заголовка Accept-Patch, где описано, в каком формате сервер принимает изменённые документы.
Метод запроса HTTP PUT создаёт новый ресурс или заменяет представление целевого ресурса, данными представленными в теле запроса.
Разница между PUT и POST в том, что PUT является идемпотентным, т.е. единичный и множественные вызовы этого метода, с идентичным набором данных, будут иметь тот же результат выполнения (без сторонних эффектов), в случае с POST , множественный вызов с идентичным набором данных может повлечь за собой сторонние эффекты.
HTTP-метод HEAD запрашивает заголовки, идентичные тем, что возвращаются, если указанный ресурс будет запрошен с помощью HTTP-метода GET . Такой запрос может быть выполнен перед загрузкой большого ресурса, например, для экономии пропускной способности.
Ответ на метод HEAD не должен содержать тело. Если это не так, то его следует игнорировать. Но даже в этом случае заголовки сущности, описывающие содержимое тела, например Content-Length, должны быть включены в ответ. Они не относятся к телу ответа на запрос HEAD , которое должно быть пустым, они относятся к телу ответа, полученный на аналогичный запрос с помощью метода GET .
Если результат запроса HEAD показывает, что кешированный после запроса GET ресурс устарел, то кеш становится недействительным, даже если запрос GET не был сделан.
Patch html что это
В проектах с открытым исходным кодом (подобных этому) у всех есть права доступа для чтения в хранилище, и любой может внести свой вклад в проект. А как контролируются все эти вклады? Если каждый может вносить изменения, проект постоянно будет нестабильным и, возможно, постоянно неработоспособным. В этой ситуации управление изменениями осуществляется через отправку файла заплатки команде разработчиков, у которых есть доступ для записи. Они могут сначала отрецензировать заплатку, и затем или принять и отправить её в хранилище, или отклонить и вернуть автору обратно.
Файл заплатки — это просто файл объединённых различий, показывающий различия между вашей рабочей копией и базовой ревизией.
Создание файла заплатки
Сначала вы должны сделать и проверить ваши изменения. Затем, вместо использования на родительской папке TortoiseSVN → Фиксировать. , выберите TortoiseSVN → Создать заплатку.
Рисунок 4.62. Диалог создания заплатки

теперь вы можете выбрать файлы, которые вы желаете включить в заплатку, точно также, как вы это делаете при полной фиксации. Будет создан один файл, содержащий сводку всех изменений, сделанных вами в выбранных файлах с момента последнего обновления из хранилища.
Столбцы в этом диалоге могут настраиваться таким же образом, как и столбцы в диалоге Проверка на наличие изменений . Прочтите «Локальный и удалённый статус» если вам необходима дополнительная информация.
Нажимая на кнопку Параметры вы можете указать как создать заплатку. Например, вы можете указать, что изменения в окончаниях строк или пробельных символах не входят в окончательный файл заплатки.
Вы можете создать несколько заплаток, содержащих изменения в различных наборах файлов. Конечно, если вы создадите файл заплатки, произведёте ещё какие-либо изменения в тех же файлах, и после этого создадите другую заплатку, этот второй файл заплатки будет включать оба набора изменений.
Просто сохраните файл, назвав его по собственному выбору. У файлов заплаток может быть любое понравившееся вам расширение, но по соглашению должно использоваться расширение .patch или .diff . Теперь вы готовы отправить ваш файл заплатки.
Подсказка
Не сохраняйте файл заплатки с расширением .txt если вы планируете его послать по e-mail кому-то другому. Обычные текстовые файлы часто повреждаются e-mail программами и часто случается, что пробельные символы и символы новых строк автоматически конвертируются и сжимаются. Если такое происходит, то заплатка не будет применена корректно. Поэтому используйте .patch или .diff в качестве расширения при сохранении файла заплатки.
Вы можете также сохранить заплатку в буфер обмена вместо файла. Это может понадобиться для того, чтобы вставить её в сообщение электропочты для отправки на рецензирование. Или, если у вас есть две рабочие копии на одном компьютере, и вы желаете перенести изменения из одной в другую, заплатка в буфере обмена — удобный способ это сделать.
Если вам нравится, то можете создать заплатку из диалога Фиксация или Проверить на наличие изменений . Просто выберите файлы и используя контекстное меню создайте заплатку из этих файлов. Если вы хотите увидеть диалог Параметры вы должны удерживать нажатой клавишу shift при правом клике .
Применение файла заплатки
Файлы заплаток применяются к вашей рабочей копии. Применение должно производиться на том же уровне папок, который был использован для создания заплатки. Если вы этот уровень не знаете точно, просто посмотрите на первую строку файла заплатки. Например, если первый обрабатываемый файл был doc/source/english/chapter1.xml и первая строка в файле заплатки выглядит как Index: english/chapter1.xml , то вам необходимо применить заплатку к папке doc/source/ . Однако, в том случае, если вы пытаетесь применить заплатку в надлежащей рабочей копии, и вы указали неверный уровень папки, TortoiseSVN это заметит и предложит правильный уровень.
Для того, чтобы применить файл заплатки к вашей рабочей копии, вы должны иметь как минимум доступ для чтения в хранилище. Причина этого в том, что программа слияния должна соотнести изменения с той прошлой ревизией, относительно которой они были сделаны удалённым разработчиком.
Из контекстного меню этой папки выберите TortoiseSVN → Применить заплатку. Появится диалог открытия файла, позволяющий выбрать файл заплатки для применения. По умолчанию отображаются только файлы с расширением .patch или .diff , но вы можете выбрать для показа и « Все файлы » . Если вы до этого сохранили заплатку в буфере обмена, можно воспользоваться кнопкой Открыть из буфера обмена в диалоге открытия файла. Имейте ввиду, эта опция появляется только если вы сохранили заплатку в буфер обмена при помощи TortoiseSVN → Создать заплатку. . Копирование заплатки в буфер обмена из другого приложения не приведёт к появлению кнопки.
Или, если файл заплатки имеет расширение .patch или .diff , вы можете щёлкнуть на нём правой клавишей мыши и выбрать TortoiseSVN → Применить заплатку. . В этом случае у вас будет запрошено расположение рабочей копии.
Эти два метода — просто два различных способа сделать одно и то же. В первом методе вы выбираете рабочую копию и указываете файл заплатки, во втором — выбираете файл заплатки и указываете рабочую копию.
Как только вы выбрали файл заплатки и расположение рабочей копии, запускается TortoiseMerge для слияния изменений из файла заплатки с вашей рабочей копией. В небольшом окне перечислены файлы, которые были изменены. Выполните двойной щелчок на каждом файле по очереди, просмотрите изменения, и сохраните слитые файлы.
Теперь, когда заплатка удалённого разработчика была применена к вашей рабочей копии, вам надо зафиксировать результат, чтобы все остальные смогли получить эти изменения из хранилища.
| Пред. | Наверх | След. |
| Блокирование | Начало | Кто какую строку изменил? |