Lua Academy · Oppitunti

HTTP-pyynnöt

Noutakaa web-resursseja.

Oppitunti 4/413 vaihetta

HTTP-pyynnöt on ilmainen Lua Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Lua Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Lua Academy-kurssilla on yhteensä 4 oppituntia.

socket.http-moduuli

LuaSocket sisältää korkean tason HTTP-asiakkaan moduulissa socket.http. Se perustuu suoraan TCP:hen, mutta hoitaa pyyntöjen muotoilun, headerit ja chunked-koodauksen purkamisen puolestanne.

Se käyttää HTTP/1.1-protokollaa salaamattoman TCP:n päällä. HTTPS-yhteyksiä varten tarvitsette LuaSecin mukana tulevan ssl.https-moduulin.

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

Yksinkertainen GET

Yksinkertaisimmassa muodossa annetaan URL-osoite, ja kutsu palauttaa rungon, statuskoodin, vastausheaderit ja statusrivin.

Statuskoodi 200 tarkoittaa onnistumista. Arvoa nil vastaava runko tarkoittaa siirtotason virhettä, ei HTTP-virhettä.

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

Tilan lukeminen

Tarkistakaa aina numeerinen code ennen kuin luotatte runkoon. Myös 404 palauttaa rungon eli virhesivun, joten kutsu onnistui TCP-tasolla.

Neljäs palautusarvo on statusrivi merkkijonona, esimerkiksi "HTTP/1.1 200 OK", ja siitä on hyötyä lokituksessa.

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

Headerien tarkasteleminen

Palautettu headers-taulukko sisältää pienaakkosiksi muunnetut avaimet, joten luette arvon headers["content-type"] riippumatta siitä, miten palvelin kirjoitti kirjainkoon.

Yleisiä kenttiä ovat content-length, content-type ja uudelleenohjauksissa käytettävä location.

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

Yleiskäyttöinen pyyntömuoto

Taulukon välittäminen kutsulle http.request antaa täyden hallinnan: method-asetuksen, mukautetut headerit, request body source -lähteen ja response sink -kohteen.

Tämä muoto palauttaa arvon 1 (ei runkoa) sekä coden, headers-taulukon ja statuksen. Keräätte rungon itse sink-kohteen avulla.

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

POST-pyynnön lähettäminen

POST-pyyntöä varten asettakaa method = "POST", antakaa runko source-lähteenä ja määrittäkää content-length. Apufunktio ltn12.source.string paketoi Lua-merkkijonon lähteeksi.

Asettakaa content-type vastaamaan hyötykuormaa, esimerkiksi arvoksi 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)
  }
}

Rungon kerääminen ltn12:lla

LuaSocket välittää tietoja ltn12-suodattimien kautta. Sink kuluttaa palasia; ltn12.sink.table(t) lisää ne taulukkoon, jonka yhdistätte sitten kutsulla table.concat.

Tämä suoratoistomalli pitää suurten latausten muistinkulutuksen pienenä sen sijaan, että kaikki tiedot puskuroitaisiin kerralla.

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

Mukautetut pyyntöheaderit

Lisätkää todennus, user agent tai evästeet headers-taulukon kautta. Avainten on oltava pienaakkosilla, jotta ne vastaavat LuaSocketin odottamaa muotoa.

Voitte esimerkiksi lähettää bearer-tokenin tai mukautetun user-agent-arvon, jotta palvelin tunnistaa asiakkaanne oikein.

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

Uudelleenohjausten seuraaminen

Oletusarvoisesti socket.http seuraa GET-pyyntöjen uudelleenohjauksia automaattisesti. Voitte poistaa tämän käytöstä pyynnön taulukossa asetuksella redirect = false ja tarkastella 3xx-vastausta itse.

Kun seuraaminen on poistettu käytöstä, lukekaa headers["location"] löytääksenne seuraavan URL-osoitteen.

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

Aikakatkaisut ja HTTPS

Asettakaa HTTP-kutsujen yleinen aikakatkaisu arvolla http.TIMEOUT = 10, sillä muuten jumiutuneet lataukset estävät ohjelman toiminnan ikuisesti.

Koska socket.http käyttää vain salaamatonta yhteyttä, käyttäkää LuaSecin moduulia require("ssl.https") https://-osoitteissa. Sen rajapinta vastaa socket.http-moduulin rajapintaa.

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

Virheiden käsittely

Erottakaa toisistaan kaksi virhetasoa. Siirtovirhe palauttaa arvon nil ja virhemerkkijonon, kuten "connection refused" tai "timeout".

Sovellusvirhe palauttaa rungon sekä 4xx- tai 5xx-koodin. Luotettava koodi tarkistaa ensin nil-tilanteen ja haarautuu sen jälkeen statuskoodin perusteella.

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

Pikatarkistus

Palauttakaa mieleenne, mitä http.request-funktion yksinkertainen URL-muoto palauttaa.

Kertaus

Opitte socket.http-moduulin käytön: yksinkertaiset GET-pyynnöt, jotka palauttavat rungon, tilakoodin ja otsakkeet, yleisen taulukkomuodon ltn12-nieluineen ja -lähteineen, POST-rungot, mukautetut otsakkeet, uudelleenohjaukset ja aikakatkaisut.

Opitte myös erottamaan siirtovirheet (nil) HTTP-tilakoodivirheistä ja näitte, että HTTPS vaatii LuaSecin ssl.https-moduulin. Näin verkkoyhteyksien käsittely raakatason TCP:stä HTTP:hen tulee päätökseen.

Aloita maksutta

Opi Lua tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
40
Oppitunnit
159

Usein kysytyt kysymykset

Onko oppitunti ”HTTP-pyynnöt” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Lua Academy-oppimispolun 3 oppituntia, myös oppitunnin “HTTP-pyynnöt”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Lua Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”HTTP-pyynnöt”?

Noutakaa web-resursseja. Harjoittelet Lua Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Lua Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Lua Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”HTTP-pyynnöt”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Lua Academy-oppitunnilla?

Kyllä. Jokainen Lua Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. TCP:n perusteet
  2. Asiakkaan rakentaminen
  3. Palvelimen rakentaminen
  4. HTTP-pyynnöt
← Takaisin: Lua Academy