0Pricing
Lua Academy · درس

طلبات HTTP

اجلب موارد الويب

طلبات HTTP درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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

فحص الترويسات

يحتوي جدول headers المعاد على مفاتيح بأحرف صغيرة، لذا تقرأ headers["content-type"] بغض النظر عن حالة الأحرف التي استخدمها الخادم.

تشمل الحقول الشائعة content-length وcontent-type وlocation لعمليات إعادة التوجيه.

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

صيغة الطلب العامة

يتيح تمرير جدول إلى 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.concat لضمّها.

يحافظ نموذج البث هذا على انخفاض استهلاك الذاكرة عند تنزيل ملفات كبيرة، بدل تخزين كل شيء مؤقتًا دفعة واحدة.

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

ترويسات الطلب المخصصة

أضف المصادقة أو وكلاء المستخدم أو ملفات تعريف الارتباط عبر جدول headers. وينبغي أن تكون المفاتيح بأحرف صغيرة لتطابق الطريقة التي يتوقعها LuaSocket.

على سبيل المثال، أرسل رمز bearer أو user-agent مخصصًا حتى يتعرّف الخادم إلى عميلك بطريقة صحيحة.

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

اتباع عمليات إعادة التوجيه

يتبع socket.http عمليات إعادة التوجيه تلقائيًا لطلبات GET افتراضيًا. ويمكنك تعطيل ذلك باستخدام redirect = false في جدول الطلب لفحص استجابة 3xx بنفسك.

عند تعطيل الاتباع، اقرأ headers["location"] للعثور على عنوان URL التالي.

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

اختبار سريع

تذكّروا ما تُعيده الصيغة البسيطة لـ http.request الخاصة بعنوان URL.

خلاصة

تعلّمتم وحدة socket.http: طلبات GET البسيطة التي تُعيد body/code/headers، والصيغة العامة للجدول مع sinks وsources الخاصة بـ ltn12، وأجسام POST، والرؤوس المخصصة، وعمليات إعادة التوجيه، والمهلات الزمنية.

كما ميّزتم بين أخطاء النقل (nil) وأخطاء حالة HTTP، ورأيتم أن HTTPS يتطلب LuaSec's ssl.https. وبهذا تكتمل رحلة الشبكات من TCP الخام إلى HTTP.

الأسئلة الشائعة

هل درس «طلبات HTTP» مجاني؟

نعم — نص درس «طلبات HTTP» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.

ماذا ستتعلم في «طلبات HTTP»؟

اجلب موارد الويب تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟

لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «طلبات HTTP»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟

نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أساسيات TCP
  2. إنشاء عميل
  3. إنشاء خادم
  4. طلبات HTTP
← العودة إلى Lua Academy