HTTP-запросы: GET, POST и другие

Рассказываем, как работать с HTTP-запросами в веб-разработке на Node.js, Python и PHP, и приводим примеры на JavaScript с использованием fetch и axios.

216 открытий1К показов
HTTP-запросы: GET, POST и другие

HTTP-запросы — основа взаимодействия между клиентской и серверной частями веб-приложений. Методы GET и POST используются для передачи данных и выполнения операций на сервере.

В статье детально разобрали подходы к реализации HTTP-запросов на практике.

Общие понятия HTTP-запросов

HTTP (HyperText Transfer Protocol) определяет правила обмена данными между клиентом и сервером. Клиент, браузер или приложение отправляют запрос серверу, который обрабатывает его и возвращает ответ.

HTTP-запрос состоит из нескольких компонентов:

Метод

Обозначает действие, которое клиент хочет выполнить. Например, метод GET используется для запроса данных с сервера, а POST — для отправки данных на сервер.

URL

Определяет адрес ресурса, к которому обращается клиент. Он включает в себя доменное имя и путь к конкретному ресурсу на сервере.

Заголовки

Содержат дополнительную информацию о запросе. Могут включать данные о типе контента, формате принятого ответа и других параметрах, необходимых для обработки запроса.

Тело

Используется при отправке сведений на сервер. В методе POST тело содержит данные формы или другие данные, которые необходимо передать. При методе GET тело обычно отсутствует, так как данные передаются в URL.

Статус-коды ответа

После обработки запроса сервер возвращает ответ со статус-кодом. Он сообщает клиенту о результате обработки запроса.

Категории статус-кодов:

  • Информационные 1xx: указывают, что запрос принят и продолжается обработка;
  • Успешно 2xx: подтверждают успешную обработку запроса;
  • Перенаправления 3xx: информируют о совершении редиректа;
  • Ошибки клиента 4xx: указывают на проблемы со стороны клиента;
  • Ошибки сервера 5xx: указывают на проблемы со стороны сервера.

Статус-коды помогают клиенту понять результат запроса и, при необходимости, предпринять действия — обновить страницу, согласиться на перенаправление и т. д.

Основные методы HTTP-запросов

GET и POST используются для получения и отправки данных соответственно. Каждый метод имеет свои особенности.

GET — получение данных

Метод предназначен для запроса данных с сервера. Он используется, когда клиенту необходимо получить ресурс без внесения изменений.

При использовании GET-запроса параметры передаются через строку запроса в URL: можно закэшировать запросы и делать их повторно без отправки данных.

Повторное выполнение запроса не изменит состояние сервера. Это важно для безопасности и эффективности в сетевых операциях. Например, при обновлении страницы браузер отправляет GET-запрос, чтобы загрузить актуальное содержимое.

HTTP-запросы: GET, POST и другие 1
Пример GET-запроса

Ограничения метода GET связаны с объемом передаваемых данных. Поскольку параметры передаются в URL, есть ограничение на длину строки. Поэтому метод GET не подходит для передачи больших объемов данных или конфиденциальной информации, т. к. содержимое отображается в адресной строке.

POST — отправка данных

Метод используется для отправки данных на сервер, чтобы создать или обновить ресурсы. В отличие от GET, данные передаются в теле запроса. Можно передавать большие объемы информации и делать это более безопасно, потому что данные не отображаются в URL.

HTTP-запросы: GET, POST и другие 2
Пример POST-запроса

Повторная отправка POST-запроса может привести к созданию нескольких одинаковых ресурсов или повторному выполнению операции. Обрабатывать такие запросы нужно с особой осторожностью.

POST используется при отправке форм на веб-сайтах, загрузке файлов, в API-запросах. Он поддерживает передачу сложных структур данных, включая JSON или XML.

Другие методы HTTP-запросов

Помимо GET и POST есть дополнительные методы для гибкого управления ресурсами. К ним относятся PUT, DELETE, PATCH, HEAD и OPTIONS.

PUT — обновление данных

Применяется для создания нового ресурса или полного обновления существующего на сервере по указанному URI.

Клиент отправляет запрос с полным представлением ресурса, которое сервер должен сохранить. Если ресурс по указанному URI не существует, сервер создаст его.

DELETE — удаление данных

Используется для удаления ресурса по URI. При успешной обработке запроса веб-страница становится недоступной.

Как и PUT, метод DELETE идемпотентный: повторные запросы удаления не приведут к ошибке, хотя сервер может сообщить, что ресурс уже недоступен.

PATCH — частичное обновление

Предназначен для частичного изменения ресурса.

Вместо отправки полного представления, как в случае с PUT, клиент отправляет только те данные, которые необходимо обновить.

HEAD — запрос заголовков без тела

Необходим для получения метаданных без передачи содержимого.

Онлайн-курс «JAVA-разработчик» от EdMe.pro
  • бесплатно
  • набор еще идет
  • онлайн
tproger.ru

Применяется для проверки ресурса, определения его размера или времени последнего изменения без необходимости загружать весь ресурс.

OPTIONS — получение информации о поддерживаемых методах

Используется для выявления возможностей сервера или проверки поддерживаемых методов.

Клиент может узнать, какие HTTP-методы доступны для данного URI, а также получить информацию о поддерживаемых заголовках и других параметрах.

Различия между GET и POST

Несмотря на то, что оба метода используются для отправки запросов, они имеют существенные различия в способах передачи данных, кэшировании и безопасности.

URL vs. тело запроса

GET передает данные через строку URL, добавляя параметры запроса после знака вопроса “?”. Параметры представляют собой пары «ключ=значение», разделенные амперсандом “&”.

HTTP-запросы: GET, POST и другие 3
Пример URL GET-запроса

POST передает данные в теле запроса, отделенном от заголовков пустой строкой. В ней можно передавать больше данных и использовать форматы типа application/x-www-form-urlencoded или multipart/form-data.

Кэширование и безопасность

GET подвержен кэшированию браузерами и промежуточными серверами. Он снижает нагрузку на сервер и ускоряет загрузку страниц, повторно используя ранее полученные ответы. Однако кэширование становится причиной тогда, когда клиент получает устаревшие данные, если ресурс на сервере уже был обновлен.

POST обычно не кэшируется, поскольку предполагается, что каждый запрос может изменять состояние сервера или создавать новые данные. Браузеры и прокси-серверы по умолчанию не сохраняют ответы на POST-запросы в кэше.

С точки зрения безопасности, GET менее предпочтителен для передачи конфиденциальной информации. Данные, переданные через URL, открыты для посторонних лиц, сохраняются в истории браузера и логах сервера.

POST дает большую конфиденциальность, так как данные передаются в теле запроса и не отображаются в адресной строке.

Сами по себе методы GET и POST не спасают сообщение от кражи. При передаче чувствительной информации необходимо использовать соединение HTTPS, которое шифрует данные и защищает от перехвата злоумышленниками.

Оба метода уязвимы к атаке CSRF. Поскольку GET-запросы можно совершать простым переходом по ссылке или загрузкой изображения, атаки через GET встречаются чаще. Для защиты от CSRF рекомендуется использовать уникальные токены и проверять происхождение запросов на сервере.

Работа с HTTP-запросами на практике

Рассмотрим реализацию HTTP-запросов в JavaScript с использованием fetch и axios, тестирование запросов через Postman и применение HTTP в бекенд-разработке на примерах Node.js, Python и PHP.

JavaScript (fetch, axios)

Fetch — встроенная функция JS. Она отправляет HTTP-запросы и обрабатывает ответы.

Пример выполнения GET-запроса:

			fetch('https://api.example.com/data')
  .then(response => response.json())
  .then(data => {
    console.log('Полученные данные:', data);
  })
  .catch(error => {
    console.error('Ошибка при выполнении запроса:', error);
  });
		

Здесь выполняется запрос к URL, затем ответ преобразуется в формат JSON.

Для отправки POST-запроса с передачей данных в теле используется следующий синтаксис:

			fetch('https://api.example.com/data', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({ name: 'Вадим', age: 21 })
})
.then(response => response.json())
.then(data => {
  console.log('Ответ сервера:', data);
})
.catch(error => {
  console.error('Ошибка при выполнении запроса:', error);
});
		

В теле запроса передаются данные в формате JSON, а заголовок Content-Type сообщает серверу о типе данных.

Использование axios

Axios — популярная библиотека для выполнения HTTP-запросов, поддерживающая как браузерную, так и серверную среду.

Пример выполнения GET-запроса:

			axios.get('https://api.example.com/data')
  .then(response => {
    console.log('Полученные данные:', response.data);
  })
  .catch(error => {
    console.error('Ошибка при выполнении запроса:', error);
  });
		

Для отправки POST-запроса с данными:

			axios.post('https://api.example.com/data', {
  name: 'Вадим',
  age: 21
})
.then(response => {
  console.log('Ответ сервера:', response.data);
})
.catch(error => {
  console.error('Ошибка при выполнении запроса:', error);
});
		

Axios автоматически преобразует объекты JavaScript в JSON и устанавливает заголовки, что упрощает работу с запросами.

Тестирование через Postman

Postman — инструмент для разработки и тестирования API. Для его использования необходимо установить приложение, создать новый запрос, указать метод и URL.

При тестировании GET-запроса в Postman вводится URL и при необходимости добавляются параметры. После отправки запроса интерфейс показывает заголовки и тело ответа, что помогает в отладке и анализе данных.

Для POST-запросов в Postman можно указать тело запроса в форматах form-data, x-www-form-urlencoded, raw и других. Это позволяет отправлять сложные структуры данных и файлы, имитируя работу реальных приложений.

Postman также поддерживает сохранение коллекций запросов, управление переменными среды и написание скриптов для автоматизации тестирования.

Использование HTTP в backend

В Node.js для создания веб-серверов и обработки HTTP-запросов обычно используется фреймворк Express:

			const express = require('express');
const app = express();

app.use(express.json());

app.get('/users', (req, res) => {
  res.json([{ id: 12, name: 'Григорий' }, { id: 13, name: 'Максим' }]);
});

app.post('/users', (req, res) => {
  const user = req.body;
  // Логика сохранения пользователя в базе данных
  res.status(201).json(user);
});

app.listen(3000, () => {
  console.log('Сервер запущен на порту 3000');
});
		

Этот сервер обрабатывает GET и POST-запросы по пути /users. Можно получать список пользователей и создавать новых.

Python

В Python популярным фреймворком для веб-разработки выступает Flask:

			from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/users', methods=['GET'])
def get_users():
    users = [{'id': 12, 'name': 'Григорий'}, {'id': 13, 'name': 'Максим'}]
    return jsonify(users)

@app.route('/users', methods=['POST'])
def create_user():
    user = request.get_json()
    # Логика сохранения пользователя в базе данных
    return jsonify(user), 201

if __name__ == '__main__':
    app.run(port=3000)
		

С помощью Flask создается сервер, обрабатывающий HTTP-запросы и возвращающий данные в формате JSON.

PHP

В PHP с фреймворком Laravel можно реализовать обработку HTTP-запросов следующим образом:

			Route::get('/users', function () {
    $users = [['id' => 12, 'name' => 'Григорий'], ['id' => 13, 'name' => 'Максим']];
    return response()->json($users);
});

Route::post('/users', function (Illuminate\Http\Request $request) {
    $user = $request->all();
    // Логика сохранения пользователя в базе данных
    return response()->json($user, 201);
});
		

Работа с HTTP в backend-приложениях состоит не только в приеме запросов, но и в отправке их к другим сервисам. В языках для веб-разработки есть библиотеки для выполнения исходящих HTTP-запросов:

  • axios для Node.js,
  • requests для Python, 
  • Guzzle для PHP.
Теперь ваша очередь! Попробуйте применить полученные знания на практике. Создайте простое приложение, использующее HTTP-запросы, или протестируйте API с помощью Postman.
Следите за новыми постами
Следите за новыми постами по любимым темам
216 открытий1К показов