0Pricing
Lua Academy · บทเรียน

คำขอ HTTP

ดึงทรัพยากรจากเว็บ

คำขอ HTTP เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

โมดูล socket.http

LuaSocket มาพร้อมไคลเอ็นต์ HTTP ระดับสูงใน socket.http โมดูลนี้ต่อยอดจาก TCP แบบดิบ แต่จัดการการจัดรูปแบบคำขอ ส่วนหัว และการถอดรหัสข้อมูลแบบแบ่งชิ้นให้คุณ

โมดูลนี้รองรับ HTTP/1.1 ผ่าน TCP แบบไม่เข้ารหัส หากต้องการใช้ HTTPS คุณต้องใช้โมดูลเสริม ssl.https จาก LuaSec

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

GET แบบง่าย

รูปแบบที่ง่ายที่สุดรับที่อยู่ URL แล้วคืนเนื้อหา รหัสสถานะ ส่วนหัวการตอบกลับ และบรรทัดสถานะ

รหัสสถานะ 200 หมายถึงสำเร็จ หากเนื้อหาเป็น nil แสดงว่าเกิดความล้มเหลวในระดับการรับส่งข้อมูล ไม่ใช่ข้อผิดพลาดของ HTTP

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

การอ่านสถานะ

ตรวจสอบ code ที่เป็นตัวเลขก่อนเชื่อถือเนื้อหาเสมอ รหัส 404 ยังคงคืนเนื้อหาได้ ซึ่งก็คือหน้าข้อผิดพลาด ดังนั้นการเรียกใช้จึงสำเร็จในระดับ TCP

ค่าที่คืนค่าลำดับที่สี่คือสตริงบรรทัดสถานะ เช่น "HTTP/1.1 200 OK" ซึ่งมีประโยชน์สำหรับการบันทึกข้อมูล

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

การตรวจสอบส่วนหัว

table headers ที่คืนค่ามาจะมีคีย์เป็นตัวพิมพ์เล็กทั้งหมด ดังนั้นคุณจึงอ่าน headers["content-type"] ได้ ไม่ว่าเซิร์ฟเวอร์จะใช้ตัวพิมพ์เล็กใหญ่แบบใด

ฟิลด์ที่พบบ่อย ได้แก่ content-length, content-type และ location สำหรับการเปลี่ยนเส้นทาง

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

รูปแบบคำขอทั่วไป

การส่ง table ให้ http.request ทำให้ควบคุมได้อย่างเต็มรูปแบบ ทั้งวิธีการ ส่วนหัวกำหนดเอง แหล่งข้อมูลเนื้อหาคำขอ และตัวรับการตอบกลับ

รูปแบบนี้คืนค่า 1 (ไม่ใช่เนื้อหา) พร้อมรหัส ส่วนหัว และสถานะ คุณจะเก็บเนื้อหาด้วยตนเองผ่านตัวรับข้อมูล

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

การส่ง POST

สำหรับ POST ให้ตั้งค่า method = "POST" ระบุ source ที่มีเนื้อหา และตั้งค่า content-length ตัวช่วย ltn12.source.string จะห่อสตริง Lua ให้เป็นแหล่งข้อมูล

ตั้งค่า content-type ให้ตรงกับข้อมูลที่ส่ง เช่น 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)
  }
}

การรวบรวมเนื้อหาด้วย ltn12

LuaSocket ส่งข้อมูลเป็นกระแสผ่านตัวกรอง ltn12 ตัวรับข้อมูลจะรับข้อมูลเป็นชิ้น ๆ ส่วน ltn12.sink.table(t) จะต่อท้ายชิ้นข้อมูลลงใน table ซึ่งจากนั้นคุณใช้ table.concat

รูปแบบการส่งข้อมูลนี้ช่วยลดการใช้หน่วยความจำสำหรับการดาวน์โหลดขนาดใหญ่ แทนการเก็บทุกอย่างไว้ในบัฟเฟอร์ครั้งเดียว

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

ส่วนหัวคำขอกำหนดเอง

เพิ่มข้อมูลยืนยันตัวตน ตัวระบุโปรแกรมผู้ใช้ หรือคุกกี้ผ่าน table headers คีย์ควรเป็นตัวพิมพ์เล็กเพื่อให้ตรงกับรูปแบบที่ LuaSocket ต้องการ

ตัวอย่างเช่น ส่งโทเค็นผู้ถือหรือ user-agent ที่กำหนดเอง เพื่อให้เซิร์ฟเวอร์ระบุไคลเอ็นต์ของคุณได้อย่างถูกต้อง

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

การติดตามการเปลี่ยนเส้นทาง

โดยค่าเริ่มต้น socket.http จะติดตามการเปลี่ยนเส้นทางโดยอัตโนมัติสำหรับ GET คุณสามารถปิดใช้งานได้ด้วย redirect = false ใน table คำขอ เพื่อดูการตอบกลับ 3xx ด้วยตนเอง

เมื่อปิดการติดตาม ให้อ่าน headers["location"] เพื่อค้นหาที่อยู่ถัดไป

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

ระยะหมดเวลาและ HTTPS

ตั้งค่าระยะหมดเวลาทั่วไปสำหรับการเรียก HTTP ด้วย http.TIMEOUT = 10 เนื่องจากการดาวน์โหลดที่ค้างอยู่อาจบล็อกตลอดไปหากไม่ตั้งค่า

เนื่องจาก socket.http รองรับเฉพาะการสื่อสารแบบไม่เข้ารหัส ให้ใช้ require("ssl.https") จาก LuaSec สำหรับที่อยู่ https:// โดยส่วนติดต่อการใช้งานจะเหมือนกับ 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/")

การจัดการข้อผิดพลาด

แยกความล้มเหลวออกเป็นสองระดับ ความล้มเหลวของการรับส่งข้อมูลจะคืนค่า nil และสตริงข้อผิดพลาด เช่น "connection refused" หรือ "timeout"

ความล้มเหลวของแอปพลิเคชันจะคืนเนื้อหาพร้อมรหัส 4xx หรือ 5xx โค้ดที่รัดกุมจะตรวจสอบกรณี nil ก่อน แล้วจึงเลือกการทำงานตามรหัสสถานะ

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

ตรวจสอบความเข้าใจ

โปรดทบทวนว่า URL รูปแบบอย่างง่ายของ http.request ส่งคืนอะไร

ทบทวน

คุณได้เรียนรู้โมดูล socket.http ซึ่งรองรับการร้องขอ GET อย่างง่ายที่ส่งคืนเนื้อหา/รหัส/ส่วนหัว รูปแบบตารางทั่วไปที่ใช้แหล่งรับและแหล่งส่งของ ltn12 เนื้อหา POST ส่วนหัวแบบกำหนดเอง การเปลี่ยนเส้นทาง และระยะหมดเวลา

คุณยังได้แยกข้อผิดพลาดในการส่งข้อมูล (nil) ออกจากข้อผิดพลาดสถานะ HTTP และได้เห็นว่า HTTPS ต้องใช้ ssl.https ของ LuaSec นี่เป็นการเดินทางด้านเครือข่ายตั้งแต่ TCP ดิบไปจนถึง HTTP ที่เสร็จสมบูรณ์

คำถามที่พบบ่อย

บทเรียน “คำขอ HTTP” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “คำขอ HTTP” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “คำขอ HTTP”

ดึงทรัพยากรจากเว็บ คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “คำขอ HTTP” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม

ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐาน TCP
  2. สร้างไคลเอนต์
  3. สร้างเซิร์ฟเวอร์
  4. คำขอ HTTP
← กลับไปที่ Lua Academy