Żądania HTTP
Pobierze Pan/Pani zasoby internetowe.
Żądania HTTP to bezpłatna lekcja Lua Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Lua Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Lua Academy zawiera 4 lekcji w sumie.
Moduł socket.http
LuaSocket zawiera wysokopoziomowego klienta HTTP w module socket.http. Jest on oparty na surowym TCP, ale automatycznie obsługuje formatowanie żądań, nagłówki i dekodowanie danych chunked.
Obsługuje HTTP/1.1 przez zwykłe TCP. Do obsługi HTTPS potrzebny jest towarzyszący moduł ssl.https z LuaSec.
local http = require("socket.http")
print(http.PORT)Proste żądanie GET
Najprostsza forma przyjmuje URL i zwraca treść, kod statusu, nagłówki odpowiedzi oraz wiersz statusu.
Kod statusu 200 oznacza powodzenie. Wartość nil w miejscu treści wskazuje na błąd na poziomie transportu, a nie na błąd HTTP.
local http = require("socket.http")
local body, code, headers = http.request("http://example.com/")
print(code, #body)Odczytywanie statusu
Przed uznaniem treści za wiarygodną należy zawsze sprawdzić liczbowy code. Kod 404 również zwraca treść — stronę błędu — dlatego wywołanie zakończyło się powodzeniem na poziomie TCP.
Czwarta zwracana wartość to tekst wiersza statusu, na przykład "HTTP/1.1 200 OK", przydatny podczas rejestrowania zdarzeń.
local body, code, headers, status = http.request(url)
if code == 200 then
process(body)
else
print("unexpected:", status)
endSprawdzanie nagłówków
Zwracana tabela headers zawiera klucze zapisane małymi literami, dlatego odczytuje się headers["content-type"] niezależnie od wielkości liter użytej przez serwer.
Do typowych pól należą content-length, content-type oraz location używane przy przekierowaniach.
local body, code, headers = http.request(url)
print(headers["content-type"])
print(headers["content-length"])Ogólna forma żądania
Przekazanie tabeli do http.request zapewnia pełną kontrolę: nad metodą, niestandardowymi nagłówkami, źródłem treści żądania oraz ujściem dla odpowiedzi.
Ta forma zwraca 1 — a nie treść — oraz kod, nagłówki i status. Treść należy zebrać samodzielnie za pomocą ujścia.
local http = require("socket.http")
local ltn12 = require("ltn12")
local chunks = {}
http.request{
url = "http://example.com/",
sink = ltn12.sink.table(chunks)
}Wysyłanie żądania POST
W przypadku POST należy ustawić method = "POST", dostarczyć source z treścią oraz ustawić content-length. Pomocnicza funkcja ltn12.source.string opakowuje ciąg Lua jako źródło.
Wartość content-type należy dopasować do przesyłanych danych, na przykład ustawić 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)
}
}Zbieranie treści za pomocą ltn12
LuaSocket przesyła dane przez filtry ltn12. Ujście zużywa fragmenty danych, a ltn12.sink.table(t) dołącza je do tabeli, którą następnie można przekazać do table.concat.
Ten model strumieniowy ogranicza zużycie pamięci przy dużych pobraniach, ponieważ nie buforuje wszystkiego naraz.
local ltn12 = require("ltn12")
local t = {}
http.request{ url = url, sink = ltn12.sink.table(t) }
local full = table.concat(t)Niestandardowe nagłówki żądania
Uwierzytelnianie, identyfikatory klientów lub pliki cookie można dodawać za pomocą tabeli headers. Klucze powinny być zapisane małymi literami, zgodnie z oczekiwaniami LuaSocket.
Można na przykład wysłać token Bearer lub niestandardowy user-agent, aby serwer prawidłowo rozpoznał klienta.
http.request{
url = url,
headers = {
["authorization"] = "Bearer " .. token,
["user-agent"] = "lua-client/1.0"
}
}Obsługa przekierowań
Domyślnie socket.http automatycznie podąża za przekierowaniami dla GET. Można to wyłączyć za pomocą redirect = false w tabeli żądania, aby samodzielnie sprawdzić odpowiedź 3xx.
Gdy obsługa przekierowań jest wyłączona, należy odczytać headers["location"], aby znaleźć następny URL.
local body, code, headers = http.request{
url = url,
redirect = false
}
if code == 301 then print("moved to", headers["location"]) endLimity czasu i HTTPS
Limit czasu dla wywołań HTTP należy ustawić globalnie za pomocą http.TIMEOUT = 10, ponieważ w przeciwnym razie zawieszone pobieranie będzie blokować działanie bez końca.
Ponieważ socket.http obsługuje wyłącznie jawny tekst, dla adresów https:// należy użyć require("ssl.https") z LuaSec; jego API odzwierciedla 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/")Obsługa błędów
Należy rozróżnić dwie warstwy błędów. Błąd transportu zwraca nil oraz tekst błędu, na przykład "connection refused" lub "timeout".
Błąd aplikacji zwraca treść wraz z kodem 4xx lub 5xx. Solidny kod najpierw sprawdza przypadek nil, a następnie rozgałęzia działanie na podstawie kodu statusu.
local body, code = http.request(url)
if not body then
print("transport error:", code)
elseif code >= 400 then
print("http error:", code)
endSzybkie sprawdzenie
Proszę przypomnieć sobie, co zwraca uproszczona postać adresu URL funkcji http.request.
Podsumowanie
Poznali Państwo moduł socket.http: proste żądania GET zwracające treść, kod i nagłówki, ogólną postać tabeli z ujściami i źródłami ltn12, treści żądań POST, niestandardowe nagłówki, przekierowania oraz limity czasu.
Nauczyli się Państwo także rozróżniać błędy transportu (nil) od błędów statusu HTTP oraz dowiedzieli się, że HTTPS wymaga modułu ssl.https z biblioteki LuaSec. To kończy drogę przez programowanie sieciowe — od surowego TCP do HTTP.
Często zadawane pytania
Czy lekcja „Żądania HTTP” jest bezpłatna?
Tak — pełny tekst „Żądania HTTP” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Lua Academy, przejdź na CoddyKit PRO. Kurs Lua Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Żądania HTTP”?
Pobierze Pan/Pani zasoby internetowe. Ćwiczysz Lua Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Lua Academy?
Nie wymagamy żadnego doświadczenia. Lua Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Żądania HTTP”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Lua Academy?
Tak. Każda lekcja Lua Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Podstawy TCP
- Budowanie klienta
- Budowanie serwera
- Żądania HTTP