1. التحليل الافتتاحي
بادئ ذي بدء ، يجب أن يكون الجميع على دراية بمفهوم "HTTP". لا يعتمد على لغة معينة ، ولكنه هو بروتوكول طبقة تطبيق عامة. اللغات المختلفة لها تفاصيل تنفيذ مختلفة ، لكنها تتفق مع مبادئها والأفكار هي نفسها.
كبيئة تشغيل مضيف ، تستخدم NodeJS JavaScript كلغة المضيف ولديها أيضًا مجموعة من المعايير الخاصة بها. في هذه المقالة ، دعنا نتعرف على "وحدة HTTP" معًا. ولكن كقرض ،
آمل أن تتمكن من قراءة واجهة برمجة التطبيقات التي يوفرها الموقع الرسمي أولاً وأن يكون لديك فهم أولي ، مما سيجعله أكثر ملاءمة. فيما يلي نظرة عامة على واجهة برمجة التطبيقات في جزء HTTP:
نسخة الكود كما يلي:
http
http.status_codes
http.createserver ([requestListener])
http.createclient ([Port] ، [Host])
الفصل: http.server
الحدث: "طلب"
الحدث: "الاتصال"
الحدث: "إغلاق"
الحدث: "CheckContinue"
الحدث: "الاتصال"
الحدث: "الترقية"
الحدث: 'clienterror'
Server.Listen (Port ، [HostName] ، [Backlog] ، [Callback])
Server.Listen (Path ، [Callback])
server.listen (مقبض ، [رد فعل])
server.close ([رد الاتصال])
server.maxheaderscount
server.settimeout (MSECs ، رد الاتصال)
server.timeout
الفصل: http.serverresponse
الحدث: "إغلاق"
استجابة. writeContinue ()
استجابة. writehead (statuscode ، [quientphrase] ، [headers])
استجابة.
استجابة. statuscode
استجابة.
استجابة. Beaderssent
استجابة
استجابة. getheader (الاسم)
استجابة. removeheader (الاسم)
استجابة. write (قطعة ، [تشفير])
استجابة. addtrailers (الرؤوس)
استجابة. ([البيانات] ، [الترميز])
http.request (الخيارات ، رد الاتصال)
http.get (الخيارات ، رد الاتصال)
الفصل: http.agent
وكيل جديد ([خيارات])
Agent.MaxSockets
Agent.Maxfreesockets
وكيل
Agent.Freesockets
وكيل
Agent.Destroy ()
Agent.getName (خيارات)
http.globalagent
الفصل: http.clientrequest
حدث "الاستجابة"
الحدث: "المقبس"
الحدث: "الاتصال"
الحدث: "الترقية"
الحدث: "متابعة"
request.write (قطعة ، [تشفير])
request.end ([Data] ، [الترميز])
request.abort ()
طلب.
request.setnodelay ([nodelay])
request.SetSocketKeepalive ([Enable] ، [initialDelay])
http.incomingmessage
الحدث: "إغلاق"
message.httpversion
message.headers
message.RawHeaders
message.trailers
message.Rawtrailers
message.SettImeout (MSECs ، رد الاتصال)
message.method
message.url
message.statuscode
message.socket
لنبدأ بمثال بسيط ، قم بإنشاء ملف يسمى server.js ، واكتب الرمز التالي:
نسخة الكود كما يلي:
var http = require ('http') ؛
var server = http.createserver (function (req ، res) {
Res.WriteHeader (200 ، {
"نوع المحتوى": "النص/عادي ؛ charset = utf-8 '// إضافة charset = utf-8
}) ؛
res.end ("مرحبًا ، Big Bear!") ؛
}) ؛
server.listen (8888) ؛
console.log ("HTTP Server قيد التشغيل على المنفذ 8888 ...") ؛
(Node Server.js) فيما يلي نتيجة التشغيل:
2. أمثلة تحليل مفصلة
دعونا نلقي نظرة على هذا المثال الصغير:
(السطر 1): تقديم وحدة "HTTP" التي تأتي مع NodeJs من خلال "المتطلبات" وتعيينها إلى متغير HTTP.
(سطران): اتصل بالوظيفة التي توفرها وحدة HTTP: "CreateServer". تقوم هذه الوظيفة بإرجاع كائن خادم ويب جديد.
المعلمة "requestListener" هي وظيفة سيتم إضافتها تلقائيًا إلى قائمة انتظار الاستماع لحدث "الطلب".
عند وصول الطلب ، سيضع حلقة الحدث وظيفة رد اتصال المستمع في قائمة انتظار التنفيذ ، ويتم تنفيذ جميع الكود في العقدة واحدة تلو الأخرى من قائمة انتظار التنفيذ.
كل عمليات الإعدام هذه موجودة على مؤشر ترابط العمال (يمكن اعتبار حلقة الحدث نفسها في مؤشر ترابط مستقل. نحن عمومًا لا نذكر هذا الموضوع ، ولكن استدعاء عقدة تنفيذ واحدة).
يتم تشغيل جميع عمليات الاسترجاعات على موضوع عامل.
دعنا نلقي نظرة على وظيفة رد الاتصال "requestListener" ، والتي توفر معلمتين (طلب ، استجابة).
يتم تشغيله في كل مرة يتم استلام الطلب. لاحظ أن كل اتصال قد يكون له طلبات متعددة (في اتصالات الاحتفاظ).
"طلب" هو مثيل لـ http.incomingmessage. "الاستجابة" هي مثيل لـ HTTP.ServerResponse.
كائن طلب HTTP هو دفق قابل للقراءة ، في حين أن كائن استجابة HTTP هو دفق قابل للكتابة.
يتم إنشاء كائن "incomingmessage" بواسطة http.server أو http.clientrequest.
وتمرير كمعلمة الأولى إلى أحداث "الطلب" و "الاستجابة" على التوالي.
يمكن أيضًا استخدامه للوصول إلى الحالة وملفات الرأس وبيانات الاستجابة.
يقوم بتنفيذ واجهة "الدفق" وكذلك الأحداث والأساليب والخصائص الإضافية التالية. (ارجع إلى API للحصول على التفاصيل).
(3 أسطر): "Writeheader" ، استخدم الدالة "reponse.writehead ()" لإرسال حالة HTTP 200 ونوع المحتوى لرأس HTTP (نوع المحتوى).
الرد على رأس الطلب. "statusCode" هو رمز حالة HTTP ثلاثي بتات ، مثل 404. المعلمة الأخيرة ، "الرؤوس" ، هو محتوى رأس الاستجابة.
خذ كستناء:
نسخة الكود كما يلي:
var body = 'hello world' ؛
review.writehead (200 ، {
"طول المحتوى": body.length ،
"نوع المحتوى": "نص/عادي"
}) ؛
ملاحظة: يتم حساب طول المحتوى بالبايت ، وليس في الأحرف.
سبب المثال السابق هو أن السلسلة "Hello World!" يحتوي على أحرف بايت واحدة فقط.
إذا كان الجسم يحتوي على أحرف مشفرة متعددة ، فيجب استخدام buffer.bytelength () لتحديد عدد بايت السلسلة في حالة تشفير أحرف multibyte.
يجب أن يوضح كذلك أن العقدة لا تتحقق مما إذا كانت السمة الوضعية للمحتوى تتطابق مع طول الجسم المرسل.
STATUCTCODE هو رمز حالة HTTP بثلاثة بت ، على سبيل المثال: "404". ما أريد أن أتحدث عنه هنا هو "http.status_codes" ، يتم تضمين جميع المجموعات والأوصاف القصيرة لرموز حالة الاستجابة القياسية "HTTP".
فيما يلي مرجع رمز المصدر:
نسخة الكود كما يلي:
var status_codes = exports.status_codes = {
100: "متابعة" ،
101: "تبديل البروتوكولات" ،
102: "المعالجة" ، // RFC 2518 ، أوقضت بواسطة RFC 4918
200: "حسنًا" ،
201: "تم إنشاؤه" ،
202: "مقبول" ،
203: "المعلومات غير المسلحة" ،
204: "لا محتوى" ،
205: "إعادة ضبط المحتوى" ،
206: "المحتوى الجزئي" ،
207: 'multi-status' ، // RFC 4918
300: "خيارات متعددة" ،
301: "انتقل بشكل دائم" ،
302: "انتقل مؤقتًا" ،
303: "انظر الآخر" ،
304: "غير تعديل" ،
305: "استخدم الوكيل" ،
307: "إعادة التوجيه المؤقت" ،
400: "طلب سيء" ،
401: "غير مصرح به" ،
402: "الدفع المطلوب" ،
403: "محظور" ،
404: "لم يتم العثور عليها" ،
405: "الطريقة غير مسموح بها" ،
406: "غير مقبول" ،
407: "مصادقة الوكيل المطلوبة" ،
408: "طلب مهلة" ،
409: "الصراع" ،
410: "ذهب" ،
411: "الطول المطلوب" ،
412: "فشل الشرط المسبق" ،
413: "طلب كيان كبير جدًا" ،
414: 'request-uri كبير جدًا' ،
415: "نوع الوسائط غير المدعوم" ،
416: "النطاق المطلوب غير مرضي" ،
417: "فشل التوقع" ،
418: 'i/' ma teapot '، // RFC 2324
422: "كيان غير قابل للمعالجة" ، // RFC 4918
423: "Locked" ، // RFC 4918
424: "التبعية الفاشلة" ، // RFC 4918
425: "مجموعة غير مرتبة" ، // RFC 4918
426: "الترقية المطلوبة" ، // RFC 2817
500: "خطأ الخادم الداخلي" ،
501: "لم ينفذ" ،
502 مدخل غير صالح'،
503: "الخدمة غير متوفرة" ،
504: 'Gateway Time-out' ،
505: "إصدار HTTP غير مدعوم" ،
506: "البديل يتفاوض أيضًا" ، // RFC 2295
507: "التخزين غير الرسمي" ، // RFC 4918
509: "الحد الأقصى للنطاق الترددي تجاوز" ،
510: "لم يتم تمديده" // RFC 2774
} ؛
يبدأ مقتطف من رمز مصدر NodeJS "http.js" مع السطر 143.
في الواقع ، ليس من الصعب رؤيتها من نتيجة استجابة العميل:
(6 خطوط): "reponse.end" ------ عند إرسال جميع رؤوس الاستجابة والرسائل ، ترسل هذه الطريقة الإشارة إلى الخادم. سوف يعتقد الخادم أن الرسالة قد اكتملت.
يجب استدعاء هذه الطريقة بعد اكتمال كل استجابة. إذا تم تحديد المعلمة "بيانات" ، فهذا يعادل استدعاء "الاستجابة. الكتابة (البيانات ، الترميز)" أولاً ثم استدعاء "reponse.end ()".
(8 أسطر): "Server.Listen (8888)" ----- يقبل الخادم الاتصالات مع المقبض المحدد ويرتبط بمنفذ معين.
ما سبق هو عملية تحليل أكثر تفصيلاً ، على أمل المساعدة في تعميق الفهم. على الرغم من عدم وجود الكثير من التعليمات البرمجية ، فإن التركيز على فهم بعض الآليات التفصيلية بحيث يمكن تطوير تطبيقات NodeJS بكفاءة في المستقبل.
ثلاثة ، أمثلة
بالإضافة إلى استخدام كائن "الطلب" للوصول إلى بيانات رأس الطلب ، يمكن أيضًا استخدام كائن "الطلب" كدفق بيانات للقراءة فقط للوصول إلى بيانات جسم الطلب.
فيما يلي مثال على طلب "نشر":
نسخة الكود كما يلي:
http.createserver (وظيفة (طلب ، استجابة) {
var body = [] ؛
console.log (request.method) ؛
console.log (request.headers) ؛
request.on ('data' ، function (chunk) {
body.push (قطعة) ؛
}) ؛
request.on ('end' ، function () {
الجسم = buffer.concat (الجسم) ؛
console.log (body.toString ()) ؛
}) ؛
}). الاستماع (8888) ؛
فيما يلي محتوى بيانات الطلب "HTTP".
نسخة الكود كما يلي:
post/http/1.1
عامل المستخدم: Curl/7.26.0
المضيف: LocalHost
يقبل: */*
طول المحتوى: 11
نوع المحتوى: التطبيق/x-www-form-urlencoded
مرحبا بالعالم
أربعة ، دعونا نلخص
(1) فهم مفهوم "HTTP".
(2) كفاءة في استخدام واجهات برمجة التطبيقات ذات الصلة "HTTP".
(3) انتبه إلى التحكم في التفاصيل ، مثل: تفاصيل المعالجة بين "post ، get".
(4) ، فهم "requestListener".
(5) ، التأكيد على مفهوم: كائن طلب HTTP هو دفق قابل للقراءة ، في حين أن كائن استجابة HTTP هو دفق قابل للكتابة.