0Pricing
Lua Academy · Lekcja

Żą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)
end

Sprawdzanie 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"]) end

Limity 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)
end

Szybkie 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

  1. Podstawy TCP
  2. Budowanie klienta
  3. Budowanie serwera
  4. Żądania HTTP
← Powrót do Lua Academy