0Pricing
Lua Academy · Lezione

Richieste HTTP

Recuperi risorse web.

Richieste HTTP è una lezione Lua Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Lua Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Lua Academy include 4 lezioni in totale.

Il modulo socket.http

LuaSocket include un client HTTP di alto livello in socket.http. Si basa sul TCP grezzo, ma gestisce automaticamente la formattazione delle richieste, le intestazioni e la decodifica chunked.

Comunica tramite HTTP/1.1 su TCP non cifrato. Per HTTPS è necessario il modulo complementare ssl.https di LuaSec.

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

Una semplice GET

La forma più semplice accetta un URL e restituisce il corpo, il codice di stato, le intestazioni della risposta e la riga di stato.

Un codice di stato 200 indica il successo. Un corpo nil indica un errore a livello di trasporto, non un errore HTTP.

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

Leggere lo stato

Controlli sempre il valore numerico di code prima di considerare attendibile il corpo. Un 404 restituisce comunque un corpo, cioè la pagina di errore, quindi la chiamata è riuscita a livello TCP.

Il quarto valore restituito è la stringa della riga di stato, come "HTTP/1.1 200 OK", utile per la registrazione.

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

Ispezionare le intestazioni

La tabella headers restituita contiene chiavi in minuscolo, quindi si legge headers["content-type"] indipendentemente dall'uso delle maiuscole e minuscole da parte del server.

I campi comuni includono content-length, content-type e location per i reindirizzamenti.

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

La forma generica della richiesta

Passare una tabella a http.request offre il controllo completo: metodo, intestazioni personalizzate, sorgente del corpo della richiesta e sink per la risposta.

Questa forma restituisce 1, non il corpo, oltre a codice, intestazioni e stato. Il corpo viene raccolto autonomamente tramite il sink.

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

Inviare una POST

Per una POST, imposti method = "POST", fornisca una source con il corpo e imposti content-length. L'helper ltn12.source.string avvolge una stringa Lua trasformandola in una sorgente.

Imposti content-type in modo che corrisponda al payload, ad esempio 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)
  }
}

Raccogliere il corpo con ltn12

LuaSocket trasmette i dati tramite i filtri ltn12. Un sink consuma i chunk; ltn12.sink.table(t) li aggiunge a una tabella che poi si passa a table.concat.

Questo modello di streaming riduce l'uso della memoria per i download di grandi dimensioni, invece di memorizzare tutto in un unico buffer.

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

Intestazioni personalizzate della richiesta

Aggiunga autenticazione, user agent o cookie tramite la tabella headers. Le chiavi devono essere in minuscolo, in linea con le aspettative di LuaSocket.

Ad esempio, invii un token bearer o un user-agent personalizzato, così il server identifica correttamente il client.

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

Seguire i reindirizzamenti

Per impostazione predefinita, socket.http segue automaticamente i reindirizzamenti per le GET. Può disattivare questo comportamento con redirect = false nella tabella della richiesta, per esaminare direttamente la risposta 3xx.

Quando il comportamento è disattivato, legga headers["location"] per trovare l'URL successivo.

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

Timeout e HTTPS

Imposti un timeout globale per le chiamate HTTP con http.TIMEOUT = 10, perché altrimenti i download bloccati possono arrestare il programma per sempre.

Poiché socket.http funziona solo con testo non cifrato, usi require("ssl.https") di LuaSec per gli URL https://; la relativa API ricalca quella di 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/")

Gestione degli errori

Distingua due livelli di errore. Un errore di trasporto restituisce nil e una stringa di errore come "connection refused" o "timeout".

Un errore a livello applicativo restituisce un corpo con un codice 4xx o 5xx. Il codice robusto controlla prima il caso nil, poi dirama in base al codice di stato.

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

Verifica rapida

Ricordi che cosa restituisce la forma semplice dell'URL di http.request.

Riepilogo

Ha imparato a usare il modulo socket.http: semplici richieste GET che restituiscono corpo, codice e intestazioni, la forma generica basata su tabelle con sink e source ltn12, i corpi delle richieste POST, le intestazioni personalizzate, i reindirizzamenti e i timeout.

Ha inoltre distinto gli errori di trasporto (nil) dagli errori relativi allo stato HTTP e ha visto che HTTPS richiede ssl.https di LuaSec. In questo modo ha completato il percorso nel networking, dal TCP grezzo fino a HTTP.

Domande Frequenti

La lezione «Richieste HTTP» è gratuita?

Sì — il testo completo di «Richieste HTTP» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Lua Academy, passa a CoddyKit PRO. Il corso Lua Academy include 4 lezioni in totale.

Cosa imparerò in «Richieste HTTP»?

Recuperi risorse web. Eserciti Lua Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Lua Academy?

Non è richiesta alcuna esperienza precedente. Lua Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Richieste HTTP»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Lua Academy?

Sì. Ogni lezione Lua Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Fondamenti di TCP
  2. Costruire un client
  3. Costruire un server
  4. Richieste HTTP
← Torna a Lua Academy