0Pricing
Lua Academy · Урок

HTTP-запросы

Получайте веб-ресурсы.

«HTTP-запросы» — бесплатный урок Lua Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.

Модуль socket.http

LuaSocket поставляется с высокоуровневым HTTP-клиентом в socket.http. Он построен поверх TCP, но самостоятельно обрабатывает форматирование запросов, заголовки и декодирование фрагментированных данных.

Он поддерживает HTTP/1.1 поверх обычного TCP. Для HTTPS нужен дополнительный модуль ssl.https из LuaSec.

local http = require("socket.http")
print(http.PORT)

Простой GET

Простейшая форма принимает URL и возвращает тело ответа, код состояния, заголовки ответа и строку состояния.

Код состояния 200 означает успех. Любое тело со значением nil указывает на сбой на уровне передачи данных, а не на ошибку HTTP.

local http = require("socket.http")
local body, code, headers = http.request("http://example.com/")
print(code, #body)

Проверка статуса

Всегда проверяйте числовой code, прежде чем доверять телу ответа. Ответ с кодом 404 всё равно содержит тело — страницу ошибки, поэтому вызов успешно выполнен на уровне TCP.

Четвёртое возвращаемое значение — это строка состояния, например "HTTP/1.1 200 OK"; она полезна для записи в журнал.

local body, code, headers, status = http.request(url)
if code == 200 then
  process(body)
else
  print("unexpected:", status)
end

Проверка заголовков

Возвращаемая таблица headers содержит ключи в нижнем регистре, поэтому Вы читаете headers["content-type"] независимо от регистра, использованного сервером.

К распространённым полям относятся content-length, content-type и location для перенаправлений.

local body, code, headers = http.request(url)
print(headers["content-type"])
print(headers["content-length"])

Универсальная форма запроса

Передача таблицы в http.request открывает полный контроль: метод, пользовательские заголовки, источник тела запроса и приёмник ответа.

Эта форма возвращает 1, а не тело, а также код, заголовки и статус. Тело Вы собираете самостоятельно с помощью приёмника.

local http = require("socket.http")
local ltn12 = require("ltn12")
local chunks = {}
http.request{
  url = "http://example.com/",
  sink = ltn12.sink.table(chunks)
}

Отправка POST

Для POST задайте method = "POST", укажите source с телом и задайте content-length. Вспомогательная функция ltn12.source.string оборачивает строку Lua в источник данных.

Задайте content-type в соответствии с содержимым данных, например application/json.

local body = "{\"name\":\"Lua\"}"
http.request{
  url = url,
  method = "POST",
  source = ltn12.source.string(body),
  headers = {
    ["content-type"] = "application/json",
    ["content-length"] = tostring(#body)
  }
}

Сбор тела с помощью ltn12

LuaSocket передаёт данные через фильтры ltn12. Приёмник потребляет фрагменты; ltn12.sink.table(t) добавляет их в таблицу, которую затем объединяют с помощью table.concat.

Такая модель потоковой передачи уменьшает потребление памяти при больших загрузках, поскольку не буферизует всё содержимое сразу.

local ltn12 = require("ltn12")
local t = {}
http.request{ url = url, sink = ltn12.sink.table(t) }
local full = table.concat(t)

Пользовательские заголовки запроса

Добавляйте аутентификацию, данные агента пользователя или файлы cookie через таблицу headers. Ключи следует задавать в нижнем регистре, чтобы они соответствовали ожиданиям LuaSocket.

Например, передайте токен доступа или задайте пользовательский user-agent, чтобы сервер правильно распознал Ваш клиент.

http.request{
  url = url,
  headers = {
    ["authorization"] = "Bearer " .. token,
    ["user-agent"] = "lua-client/1.0"
  }
}

Переход по перенаправлениям

По умолчанию socket.http автоматически обрабатывает перенаправления для GET. Вы можете отключить это с помощью redirect = false в таблице запроса, чтобы самостоятельно изучить ответ 3xx.

Если автоматическая обработка отключена, прочитайте headers["location"], чтобы найти следующий URL.

local body, code, headers = http.request{
  url = url,
  redirect = false
}
if code == 301 then print("moved to", headers["location"]) end

Тайм-ауты и HTTPS

Задайте глобальный тайм-аут для вызовов HTTP с помощью http.TIMEOUT = 10, поскольку в противном случае зависшие загрузки будут блокировать выполнение навсегда.

Поскольку socket.http работает только с незашифрованными данными, используйте require("ssl.https") из LuaSec для URL, начинающихся с https://; его API соответствует API socket.http.

local http = require("socket.http")
http.TIMEOUT = 10
-- for TLS:
local https = require("ssl.https")
local body, code = https.request("https://example.com/")

Обработка ошибок

Различайте два уровня сбоев. Сбой передачи данных возвращает nil и строку ошибки, например "connection refused" или "timeout".

Сбой приложения возвращает тело с кодом 4xx или 5xx. Надёжный код сначала проверяет случай с nil, а затем выбирает ветвь по коду состояния.

local body, code = http.request(url)
if not body then
  print("transport error:", code)
elseif code >= 400 then
  print("http error:", code)
end

Быстрая проверка

Вспомните, что возвращает простая форма URL-вызова http.request.

Повторение

Вы изучили модуль socket.http: простые запросы на получение данных, возвращающие тело, код и заголовки; универсальную табличную форму с приёмниками и источниками ltn12; тела запросов POST, пользовательские заголовки, перенаправления и тайм-ауты.

Вы также научились отличать ошибки передачи данных (nil) от ошибок со статусом HTTP и увидели, что для HTTPS нужен ssl.https из LuaSec. На этом завершается путь в изучении сетевого взаимодействия — от необработанного TCP до HTTP.

Часто задаваемые вопросы

Урок «HTTP-запросы» бесплатный?

Да — полный текст урока «HTTP-запросы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.

Чему я научусь в уроке «HTTP-запросы»?

Получайте веб-ресурсы. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Lua Academy?

Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «HTTP-запросы»?

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

Можно ли писать и запускать код в этом уроке Lua Academy?

Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы TCP
  2. Создание клиента
  3. Создание сервера
  4. HTTP-запросы
← Назад к Lua Academy