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 — локальная установка не требуется.
Все уроки этого курса
- Основы TCP
- Создание клиента
- Создание сервера
- HTTP-запросы