Lua Academy · Pelajaran

Permintaan HTTP

Dapatkan sumber web.

Pelajaran 4 daripada 413 langkah

Permintaan HTTP ialah pelajaran Lua Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Lua Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Lua Academy merangkumi sejumlah 4 pelajaran.

Modul socket.http

LuaSocket disertakan dengan klien HTTP aras tinggi dalam socket.http. Klien ini dibina berasaskan TCP mentah, tetapi mengendalikan pemformatan permintaan, pengepala dan penyahkodan berpecah-pecah untuk Anda.

Klien ini menggunakan HTTP/1.1 melalui TCP biasa. Untuk HTTPS, Anda memerlukan modul pendamping ssl.https daripada LuaSec.

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

GET Ringkas

Bentuk paling ringkas menerima URL dan mengembalikan badan, kod status, pengepala respons serta baris status.

Kod status 200 bermaksud berjaya. Sebarang badan nil menunjukkan kegagalan pada peringkat pengangkutan, bukannya ralat HTTP.

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

Membaca Status

Sentiasa periksa code berangka sebelum mempercayai badan respons. Kod 404 masih mengembalikan badan, iaitu halaman ralat, jadi panggilan tersebut berjaya pada peringkat TCP.

Nilai pulangan keempat ialah rentetan baris status seperti "HTTP/1.1 200 OK", yang berguna untuk pengelogan.

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

Memeriksa Pengepala

Table headers yang dikembalikan mempunyai kunci dalam huruf kecil, jadi Anda membaca headers["content-type"] tanpa mengira penggunaan huruf besar atau kecil oleh pelayan.

Medan biasa termasuk content-length, content-type dan location untuk lencongan.

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

Bentuk Permintaan Umum

Dengan memberikan table kepada http.request, Anda mendapat kawalan penuh: kaedah, pengepala tersuai, sumber badan permintaan dan penyerap respons.

Bentuk ini mengembalikan 1, bukannya badan, bersama-sama kod, pengepala dan status. Anda mengumpulkan badan itu sendiri melalui penyerap.

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

Menghantar POST

Untuk POST, tetapkan method = "POST", sediakan source dengan badan dan tetapkan content-length. Fungsi pembantu ltn12.source.string membungkus rentetan Lua sebagai sumber.

Tetapkan content-type agar sepadan dengan muatan Anda, seperti 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)
  }
}

Mengumpulkan Badan dengan ltn12

LuaSocket menstrimkan data melalui penapis ltn12. Penyerap menggunakan cebisan data; ltn12.sink.table(t) menambahkannya pada table yang kemudiannya Anda gabungkan dengan table.concat.

Model penstriman ini mengurangkan penggunaan memori untuk muat turun besar, berbanding menyimpan semuanya dalam penimbal pada satu-satu masa.

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

Pengepala Permintaan Tersuai

Tambahkan pengesahan, ejen pengguna atau kuki melalui table headers. Kunci hendaklah ditulis dalam huruf kecil agar sepadan dengan cara LuaSocket menjangkakannya.

Contohnya, hantar token pembawa atau user-agent tersuai supaya pelayan mengenal pasti klien Anda dengan betul.

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

Mengikuti Lencongan

Secara lalai, socket.http mengikuti lencongan secara automatik untuk GET. Anda boleh menyahdayakan ciri ini dengan redirect = false dalam table permintaan untuk memeriksa respons 3xx sendiri.

Apabila ciri ini dimatikan, baca headers["location"] untuk mencari URL seterusnya.

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

Masa Tamat dan HTTPS

Tetapkan masa tamat global untuk panggilan HTTP dengan http.TIMEOUT = 10, kerana muat turun yang tergantung sebaliknya akan menyekat program selama-lamanya.

Oleh sebab socket.http hanya menggunakan teks biasa, gunakan require("ssl.https") daripada LuaSec untuk URL https://; API-nya sepadan dengan 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/")

Pengendalian Ralat

Bezakan dua lapisan kegagalan. Kegagalan pengangkutan mengembalikan nil dan rentetan ralat seperti "connection refused" atau "timeout".

Kegagalan aplikasi mengembalikan badan bersama-sama kod 4xx atau 5xx. Kod yang teguh akan memeriksa keadaan nil terlebih dahulu, kemudian bercabang berdasarkan kod status.

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

Semakan Ringkas

Ingat kembali nilai yang dikembalikan oleh bentuk URL ringkas http.request.

Imbas Kembali

Anda telah mempelajari modul socket.http: permintaan ringkas yang mengembalikan isi, kod dan pengepala, bentuk jadual umum dengan saluran penerima dan sumber ltn12, isi POST, pengepala tersuai, ubah hala dan had masa.

Anda juga telah membezakan ralat pengangkutan (nil) daripada ralat status HTTP, serta melihat bahawa HTTPS memerlukan ssl.https daripada LuaSec. Ini melengkapkan perjalanan rangkaian daripada TCP mentah hingga HTTP.

Percuma untuk bermula

Pelajari Lua dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
40
Pelajaran
159

Soalan Lazim

Adakah pelajaran “Permintaan HTTP” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Lua Academy, termasuk “Permintaan HTTP”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Lua Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Permintaan HTTP”?

Dapatkan sumber web. Anda berlatih Lua Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Lua Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Lua Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Permintaan HTTP” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Lua Academy ini?

Ya. Setiap pelajaran Lua Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Asas TCP
  2. Membina Klien
  3. Membina Pelayan
  4. Permintaan HTTP
← Kembali ke Lua Academy