الفرق بين المراجعتين لصفحة: «Node.js/http»
Khaled-yassin (نقاش | مساهمات) لا ملخص تعديل |
ط استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}' |
||
(مراجعتان متوسطتان بواسطة مستخدمين اثنين آخرين غير معروضتين) | |||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE: الوحدة | <noinclude>{{DISPLAYTITLE:الوحدة HTTP في Node.js}}</noinclude> | ||
مؤشر الاستقرار: 2 - مستقر | مؤشر الاستقرار: 2 - مستقر | ||
سطر 70: | سطر 70: | ||
http.request(options, onResponseCallback); | http.request(options, onResponseCallback); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===<code>agent.createConnection(options[, callback])</code>=== | |||
=== <code>agent.createConnection(options[, callback])</code> === | |||
أُضيف مع الإصدار: v0.11.4. | أُضيف مع الإصدار: v0.11.4. | ||
*<code>options</code> من النوع [[JavaScript/Object|<Object>]]: وهي خيارات تحتوي على تفاصيل الاتصال. راجع <code>[[Node.js/net|net.createConnection()]]</code> لتنسيق الخيارات. | *<code>options</code> من النوع [[JavaScript/Object|<Object>]]: وهي خيارات تحتوي على تفاصيل الاتصال. راجع <code>[[Node.js/net|net.createConnection()]]</code> لتنسيق الخيارات. | ||
سطر 297: | سطر 296: | ||
}); | }); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===<code>request.abort()</code>=== | |||
=== <code>request.abort()</code> === | |||
أُضيفت مع الإصدار: v0.3.8. | أُضيفت مع الإصدار: v0.3.8. | ||
سطر 607: | سطر 605: | ||
|أُضيف مع الإصدار: v0.1.90. | |أُضيف مع الإصدار: v0.1.90. | ||
|} | |} | ||
* <code>data</code> من النوع [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]]. | *<code>data</code> من النوع [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]]. | ||
*<code>encoding</code> من النوع [[JavaScript/String|<string>]]. | *<code>encoding</code> من النوع [[JavaScript/String|<string>]]. | ||
سطر 638: | سطر 636: | ||
// setCookie من النوع string[] | // setCookie من النوع string[] | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===<code>response.getHeaderNames()</code>=== | ===<code>response.getHeaderNames()</code>=== | ||
أُضيفت مع الإصدار: v7.7.0. | أُضيفت مع الإصدار: v7.7.0. | ||
سطر 651: | سطر 648: | ||
// headerNames === ['foo', 'set-cookie'] | // headerNames === ['foo', 'set-cookie'] | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===<code>response.getHeaders()</code>=== | ===<code>response.getHeaders()</code>=== | ||
أُضيفت مع الإصدار: v7.7.0. | أُضيفت مع الإصدار: v7.7.0. | ||
سطر 666: | سطر 662: | ||
// headers === { foo: 'bar', 'set-cookie': ['foo=bar', 'bar=baz'] } | // headers === { foo: 'bar', 'set-cookie': ['foo=bar', 'bar=baz'] } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===<code>response.hasHeader(name)</code>=== | ===<code>response.hasHeader(name)</code>=== | ||
أُضيفت مع الإصدار: v7.7.0. | أُضيفت مع الإصدار: v7.7.0. | ||
سطر 676: | سطر 671: | ||
const hasContentType = response.hasHeader('content-type'); | const hasContentType = response.hasHeader('content-type'); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===<code>response.headersSent</code>=== | ===<code>response.headersSent</code>=== | ||
أُضيفت مع الإصدار: v0.9.3. | أُضيفت مع الإصدار: v0.9.3. | ||
سطر 689: | سطر 683: | ||
response.removeHeader('Content-Encoding'); | response.removeHeader('Content-Encoding'); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===<code>response.sendDate</code>=== | ===<code>response.sendDate</code>=== | ||
أُضيفت مع الإصدار: v0.7.5. | أُضيفت مع الإصدار: v0.7.5. | ||
سطر 717: | سطر 710: | ||
}); | }); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===<code>response.setTimeout(msecs[, callback])</code>=== | ===<code>response.setTimeout(msecs[, callback])</code>=== | ||
أُضيفت مع الإصدار: v0.9.12. | أُضيفت مع الإصدار: v0.9.12. | ||
*msecs من النوع <number>. | *<code>msecs</code> من النوع [[JavaScript/Number|<number>]]. | ||
*callback من النوع <Function>. | *<code>callback</code> من النوع [[JavaScript/Function|<Function>]]. | ||
*القيمة المُعادة: <http.ServerResponse>. | *القيمة المُعادة: <code><http.ServerResponse>.</code> | ||
ضبط msecs بقيمة مهلة المقبس. إذا توفَّرت دالة رد النداء، فسيُضاف كمستمع في الحدث 'timeout' على كائن الاستجابة. | ضبط <code>msecs</code> بقيمة مهلة المقبس. إذا توفَّرت دالة رد النداء، فسيُضاف كمستمع في الحدث <code>'timeout'</code> على كائن الاستجابة. | ||
إذا لم يُضاف أي مستمع 'timeout' إلى الطلب أو الاستجابة أو الخادم، فستُهدم المقابس عند إنتهاء المهلة. إذا عُيّن معالج إلى أحداث 'timeout' الخاصة بالطلب، أو بالإستجابة أو بالخادم، يجب معالجة المقابس المنتهية مهلتها بشكل صريح. | إذا لم يُضاف أي مستمع <code>'timeout'</code> إلى الطلب أو الاستجابة أو الخادم، فستُهدم المقابس عند إنتهاء المهلة. إذا عُيّن معالج إلى أحداث <code>'timeout'</code> الخاصة بالطلب، أو بالإستجابة أو بالخادم، يجب معالجة المقابس المنتهية مهلتها بشكل صريح. | ||
===response.socket=== | ===<code>response.socket</code>=== | ||
أُضيفت مع الإصدار: v0.3.0. | أُضيفت مع الإصدار: v0.3.0. | ||
*<net.Socket>. | *[[Node.js/net|<net.Socket>]]. | ||
الإشارة إلى المقبس الأساسي. عادة لا يرغب المستخدمون في الاقتراب من هذه الخاصية. على وجه الخصوص، لن يُصدر المقبس أحداث 'readable' بسبب كيفية توصيل مُحلل البروتوكول بالمقبس. بعد response.end()، تُلغى الخاصية. يمكن الوصول إلى socket أيضًا عبر response.connection. | الإشارة إلى المقبس الأساسي. عادة لا يرغب المستخدمون في الاقتراب من هذه الخاصية. على وجه الخصوص، لن يُصدر المقبس أحداث <code>'readable'</code> بسبب كيفية توصيل مُحلل البروتوكول بالمقبس. بعد response.end()، تُلغى الخاصية. يمكن الوصول إلى <code>socket</code> أيضًا عبر <code>response.connection</code>. | ||
أمثلة<syntaxhighlight lang="javascript"> | |||
const http = require('http'); | const http = require('http'); | ||
const server = http.createServer((req, res) => { | |||
const server = http.createServer((req, res) => { const ip = res.socket.remoteAddress; const port = res.socket.remotePort; res.end(`Your IP address is ${ip} and your source port is ${port}.`); | const ip = res.socket.remoteAddress; | ||
const port = res.socket.remotePort; | |||
res.end(`Your IP address is ${ip} and your source port is ${port}.`); | |||
}).listen(3000); | }).listen(3000); | ||
===response.statusCode=== | </syntaxhighlight> | ||
===<code>response.statusCode</code>=== | |||
أُضيفت مع الإصدار: v0.4.0. | أُضيفت مع الإصدار: v0.4.0. | ||
*<number>. | *[[JavaScript/Number|<number>]]. | ||
عند استخدام الترويسات الضمنية (عدم استدعاء response.writeHead() بشكل صريح)، تتحكم هذه الخاصية في رمز الحالة الذي سيُرسَل إلى العميل عند دفع الترويسات. | عند استخدام الترويسات الضمنية (عدم استدعاء <code>response.writeHead()</code> بشكل صريح)، تتحكم هذه الخاصية في رمز الحالة الذي سيُرسَل إلى العميل عند دفع الترويسات. | ||
أمثلة<syntaxhighlight lang="javascript"> | |||
response.statusCode = 404; | response.statusCode = 404; | ||
</syntaxhighlight>بعد إرسال ترويسة الاستجابة إلى العميل، تشير هذه الخاصية إلى رمز الحالة الذي أُرسِل. | |||
بعد إرسال ترويسة الاستجابة إلى العميل، تشير هذه الخاصية إلى رمز الحالة الذي أُرسِل. | ===<code>response.statusMessage</code>=== | ||
===response.statusMessage=== | |||
أُضيفت مع الإصدار: v0.11.8. | أُضيفت مع الإصدار: v0.11.8. | ||
*<string>. | *[[JavaScript/String|<string>]]. | ||
عند استخدام الترويسات الضمنية (عدم استدعاء response.writeHead() بشكل صريح)، تتحكم هذه الخاصية في رسالة الحالة التي ستُرسل إلى العميل عند دفع الترويسات. إذا تُرِكت على أنها undefined فستُستخدم الرسالة القياسية لرمز الحالة. | عند استخدام الترويسات الضمنية (عدم استدعاء <code>response.writeHead()</code> بشكل صريح)، تتحكم هذه الخاصية في رسالة الحالة التي ستُرسل إلى العميل عند دفع الترويسات. إذا تُرِكت على أنها <code>undefined</code> فستُستخدم الرسالة القياسية لرمز الحالة. | ||
أمثلة<syntaxhighlight lang="javascript"> | |||
response.statusMessage = 'Not found'; | response.statusMessage = 'Not found'; | ||
</syntaxhighlight>بعد إرسال ترويسة الاستجابة إلى العميل، تشير هذه الخاصية إلى رسالة الحالة التي أُرسِلت. | |||
بعد إرسال ترويسة الاستجابة إلى العميل، تشير هذه الخاصية إلى رسالة الحالة التي أُرسِلت. | ===<code>response.write(chunk[, encoding][, callback])</code>=== | ||
===response.write(chunk[, encoding][, callback])=== | |||
أُضيفت مع الإصدار: v0.1.29. | أُضيفت مع الإصدار: v0.1.29. | ||
*chunk من النوع <string> | <Buffer>. | *<code>chunk</code> من النوع [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]]. | ||
*Encoding من النوع <string>، وقيمته الإفتراضية: 'utf8'. | *<code>Encoding</code> من النوع <string>، وقيمته الإفتراضية: <code>'utf8'</code>. | ||
*callback من النوع <Function>. | *<code>callback</code> من النوع [[JavaScript/Function|<Function>]]. | ||
*القيمة المعادة: <boolean>. | *القيمة المعادة: [[JavaScript/Boolean|<boolean>]]. | ||
عند استدعاء هذه الدالة وعدم استدعاء response.writeHead() مسبقًا، فستنتقل إلى وضع الترويسة الضمنية وتدفع الترويسات الضمنية. | عند استدعاء هذه الدالة وعدم استدعاء <code>response.writeHead()</code> مسبقًا، فستنتقل إلى وضع الترويسة الضمنية وتدفع الترويسات الضمنية. | ||
يرسل هذا جزءًا من متن الاستجابة. يمكن استدعاء هذه الدالة عدة مرات للإمداد بأجزاء متتالية من المتن. | يرسل هذا جزءًا من متن الاستجابة. يمكن استدعاء هذه الدالة عدة مرات للإمداد بأجزاء متتالية من المتن. | ||
لاحظ أنه في وحدة | لاحظ أنه في وحدة <code>http</code>، يُحذف نص الاستجابة عندما يكون الطلب هو طلب للترويسة HEAD. وبالمثل، يجب ألا تتضمن الاستجابات <code>204</code> و <code>304</code> متنَ رسالة. | ||
يمكن أن يكون chunk سلسلة نصية أو مخزن مؤقت. إذا كان chunk سلسلة نصية، يحدد الوسيط الثاني كيفية ترميزه في دفق ثنائي. شتُستدعى دالة callback عند دفع جزء البيانات هذا. | يمكن أن يكون chunk سلسلة نصية أو مخزن مؤقت. إذا كان <code>chunk</code> سلسلة نصية، يحدد الوسيط الثاني كيفية ترميزه في دفق ثنائي. شتُستدعى دالة <code>callback</code> عند دفع جزء البيانات هذا. | ||
وهو متن HTTP الأولي ولا علاقة له بترميزات المتن متعدد الأجزاء ذي المستوى الأعلى التي يمكن استخدامها. | وهو متن HTTP الأولي ولا علاقة له بترميزات المتن متعدد الأجزاء ذي المستوى الأعلى التي يمكن استخدامها. | ||
عند استدعاء response.write() لأول مرة، يُرسل معلومات ترويسة الموجودة في المخزن المؤقت والجزء الأول من المتن إلى العميل. وعند استدعاء response.write() للمرة الثانية، يفترض Node.js تدفق البيانات وإرسال البيانات الجديدة بشكل منفصل. بمعنى، تُخزَّن الاستجابة حتى الجزء الأول من المتن. | عند استدعاء <code>response.write()</code> لأول مرة، يُرسل معلومات ترويسة الموجودة في المخزن المؤقت والجزء الأول من المتن إلى العميل. وعند استدعاء <code>response.write()</code> للمرة الثانية، يفترض Node.js تدفق البيانات وإرسال البيانات الجديدة بشكل منفصل. بمعنى، تُخزَّن الاستجابة حتى الجزء الأول من المتن. | ||
تُعيد true إذا دُفِعت البيانات بالكامل بنجاح إلى مخزن kernel المؤقت. وتُعيد false إذا وضعت كل البيانات أو جزء منها في قائمة انتظار ذاكرة المستخدم. سوف يُطلق 'drain' عندما يكون المخزن المؤقت متاحًا مرة أخرى. | تُعيد <code>true</code> إذا دُفِعت البيانات بالكامل بنجاح إلى مخزن kernel المؤقت. وتُعيد <code>false</code> إذا وضعت كل البيانات أو جزء منها في قائمة انتظار ذاكرة المستخدم. سوف يُطلق <code>'drain'</code> عندما يكون المخزن المؤقت متاحًا مرة أخرى. | ||
===response.writeContinue()=== | ===<code>response.writeContinue()</code>=== | ||
أُضيف مع الإصدار: v0.3.0. | أُضيف مع الإصدار: v0.3.0. | ||
إرسال رسالة HTTP/1.1 100 Continue إلى العميل، مشيرا إلى أنه يجب إرسال متن الطلب. راجع حدث 'checkContinue' على Server. | إرسال رسالة HTTP/1.1 <code>100 Continue</code> إلى العميل، مشيرا إلى أنه يجب إرسال متن الطلب. راجع حدث <code>'checkContinue'</code> على <code>Server</code>. | ||
===response.writeHead(statusCode[, statusMessage][, headers])=== | ===<code>response.writeHead(statusCode[, statusMessage][, headers])</code>=== | ||
سجل التغييرات | سجل التغييرات | ||
{| class="wikitable" | {| class="wikitable" | ||
!الإصدار | |||
!التغييرات | |||
|- | |- | ||
|v5.11.0 و 4.4.4 | |v5.11.0 و 4.4.4 | ||
|يُطرح RangeError إذا كانت statusCode ليست عددًا ضمن النطاق [100, 999]. | |يُطرح <code>RangeError</code> إذا كانت <code>statusCode</code> ليست عددًا ضمن النطاق [<code>100</code>, <code>999</code>]. | ||
|- | |- | ||
|v0.1.30 | |v0.1.30 | ||
|أُضيف مع الإصدار: v0.1.30 | |أُضيف مع الإصدار: v0.1.30. | ||
|} | |} | ||
*statusCode من النوع <number>. | *<code>statusCode</code> من النوع [[JavaScript/Number|<number>]]. | ||
*statusMessage من النوع <string>. | *<code>statusMessage</code> من النوع [[JavaScript/String|<string>]]. | ||
*headers من النوع <Object>. | *<code>headers</code> من النوع [[JavaScript/Object|<Object>]]. | ||
إرسال ترويسة استجابة إلى الطلب. رمز الحالة هو رمز حالة HTTP مكون من 3 أرقام، مثل 404. الوسيط الأخير headers هو ترويسات الاستجابة. يمكن إعطاء رسالة حالة statusMessage مقروءة كوسيط ثاني. | إرسال ترويسة استجابة إلى الطلب. رمز الحالة هو رمز حالة HTTP مكون من 3 أرقام، مثل <code>404</code>. الوسيط الأخير headers هو ترويسات الاستجابة. يمكن إعطاء رسالة حالة <code>statusMessage</code> مقروءة كوسيط ثاني. | ||
أمثلة | أمثلة<syntaxhighlight lang="javascript"> | ||
const body = 'مرحبًا أيها العالم'; | |||
response.writeHead(200, { | |||
'Content-Length': Buffer.byteLength(body), | |||
'Content-Type': 'text/plain' }); | |||
</syntaxhighlight>يجب استدعاء هذه الدالة مرة واحدة فقط في كل رسالة ويجب أن يكون ذلك قبل استدعاء <code>response.end()</code>. | |||
إذا أستُدعي أيًا من <code>response.write()</code> أو <code>response.end()</code> قبل استدعاء هذا التابع، فستُحسب الترويسات الضمنية أو القابلة للتغيير وتستدعي هذا التابع. | |||
إذا أستُدعي أيًا من response.write() أو response.end() قبل استدعاء هذا التابع، فستُحسب الترويسات الضمنية أو القابلة للتغيير وتستدعي هذا التابع. | |||
عند ضبط الترويسات باستخدام <code>response.setHeader()</code>، ستُدمج مع أي ترويسات تُمرر إلى <code>response.writeHead()</code>، مع أسبقية الترويسات المُمررة إلى <code>response.writeHead()</code>.<syntaxhighlight lang="javascript"> | |||
// إعادة content-type = text/plain | |||
const server = http.createServer((req, res) => { | |||
res.setHeader('Content-Type', 'text/html'); | |||
res.setHeader('X-Foo', 'bar'); | |||
res.writeHead(200, { 'Content-Type': 'text/plain' }); | |||
res.end('ok'); | |||
}); | }); | ||
</syntaxhighlight>لاحظ أن طول المحتوى Content-Length مُعطى بالبايت وليس بالأحرف. فيعمل المثال أعلاه لأن السلسلة النصية 'مرحبًا أيها العالم' تحتوي على حروف مكونة من بايت واحدة فقط. إذا احتوى المتن على أحرف من ترميز أعلى، فيجب استخدام <code>Buffer.byteLength()</code> لتحديد عدد وحدات البايت في ترميز معين. ولا يتحقق Node.js ما إذا كان Content-Length وطول المتن المُرسل متساويين أم لا. | |||
ستؤدي محاولة ضبط اسم حقل ترويسة أو قيمته والتي يحتويان على أحرف غير صالحة إلى ظهور <code>[[Node.js/error|TypeError]]</code>. | |||
===<code>response.writeProcessing()</code>=== | |||
ستؤدي محاولة ضبط اسم حقل ترويسة أو قيمته والتي يحتويان على أحرف غير صالحة إلى ظهور TypeError. | |||
===response.writeProcessing()=== | |||
أُضيفت مع الإصدار: v10.0.0. | أُضيفت مع الإصدار: v10.0.0. | ||
يرسل رسالة | يرسل رسالة HTTP / 1.1 <code>102 Processing</code> إلى العميل، مُشيرةً إلى أنه يجب إرسال متن الطلب. | ||
==الصنف http.IncomingMessage== | ==الصنف <code>http.IncomingMessage</code>== | ||
أُضيف مع الإصدار: v0.1.17. | أُضيف مع الإصدار: v0.1.17. | ||
إنشاء كائن IncomingMessage بواسطة http. | إنشاء كائن <code>IncomingMessage</code> بواسطة <code>http.Server</code> أو <code>http.ClientRequest</code> وتمريرها كوسيط أول لحدثي <code>'request'</code> و <code>'response'</code> على التوالي. يمكن استخدام هذا الصنف للوصول إلى حالة الاستجابة والترويسات والبيانات. | ||
فهي تطبق واجهة Readable | فهي تطبق واجهة [[Node.js/stream|Readable Stream]]، بالإضافة إلى الأحداث والدوال والخصائص الإضافية التالية: | ||
===الحدث 'aborted'=== | ===الحدث <code>'aborted'</code>=== | ||
أُضيف مع الإصدار: v0.3.8. | أُضيف مع الإصدار: v0.3.8. | ||
يُطلَق عند إلغاء الطلب. | يُطلَق عند إلغاء الطلب. | ||
===الحدث 'close'=== | ===الحدث <code>'close'</code>=== | ||
أُضيف مع الإصدار: v0.4.2. | أُضيف مع الإصدار: v0.4.2. | ||
يشير إلى أن الاتصال الأساسي قد أُغلِق. تمامًا مثلما في حالة الحدث 'end'، يحدث هذا الحدث مرة واحدة فقط لكل استجابة. | يشير إلى أن الاتصال الأساسي قد أُغلِق. تمامًا مثلما في حالة الحدث 'end'، يحدث هذا الحدث مرة واحدة فقط لكل استجابة. | ||
===message.aborted=== | ===<code>message.aborted</code>=== | ||
أُضيفت مع الإصدار: v10.1.0. | أُضيفت مع الإصدار: v10.1.0. | ||
*<boolean>. | *[[JavaScript/Boolean|<boolean>]]. | ||
ستصبح الخاصية message.aborted بالقيمة true إذا أُلغي الطلب. | ستصبح الخاصية message.aborted بالقيمة true إذا أُلغي الطلب. | ||
===message.destroy([error])=== | ===message.destroy([error])=== | ||
أُضيفت مع الإصدار: v0.3.0. | أُضيفت مع الإصدار: v0.3.0. | ||
*error من النوع <Error>. | *<code>error</code> من النوع [[Node.js/error|<Error>]]. | ||
استدعاء الدالة destroy() على المقبس الذي تلقى IncomingMessage. إذا مُرِر | استدعاء الدالة <code>destroy()</code> على المقبس الذي تلقى <code>IncomingMessage</code>. إذا مُرِر <code>error</code>، يُطلَق حدث <code>'error'</code> ويُمرر <code>error</code> كوسيط لأي مستمع في الحدث. | ||
===message.headers=== | ===<code>message.headers</code>=== | ||
أُضيفت مع الإصدار: v0.1.5. | أُضيفت مع الإصدار: v0.1.5. | ||
*<Object>. | *[[JavaScript/Object|<Object>]]. | ||
كائن ترويسات الطلب أو الاستجابة. | كائن ترويسات الطلب أو الاستجابة. | ||
أزواج القيمة الرئيسية لأسماء الترويسات وقيمها. تكون أسماء الترويسات من الأحرف الصغيرة. | أزواج القيمة الرئيسية لأسماء الترويسات وقيمها. تكون أسماء الترويسات من الأحرف الصغيرة. على سبيل المثال:<syntaxhighlight lang="javascript"> | ||
// طباعة شيئًا مثل: | |||
// | |||
// | // | ||
// { 'user-agent': 'curl/7.22.0', | // { 'user-agent': 'curl/7.22.0', | ||
// host: '127.0.0.1:8000', | |||
// host: '127.0.0.1:8000', | // accept: '*/*' } | ||
// accept: '*/*' } | |||
console.log(request.headers); | console.log(request.headers); | ||
</syntaxhighlight>تُعالج التكرارات في الترويسات الأولية بالطرق التالية، اعتمادًا على اسم الترويسة: | |||
تُعالج التكرارات في الترويسات الأولية بالطرق التالية، اعتمادًا على اسم الترويسة: | *تُتجاهَل تكرارات كل من <code>age</code> <code>وauthorization</code> و <code>content-length</code> و <code>content-type</code> و <code>etag</code> و <code>expires</code> و <code>from</code> و <code>host</code> و <code>if-modified-since</code> و <code>if-unmodified-since</code> و <code>last-modified</code> و <code>location</code> و <code>max-forwards</code> و <code>proxy-authorization</code> و <code>referer</code> و <code>retry-after</code> و <code>user-agent</code>. | ||
*تُتجاهَل تكرارات كل من age وauthorization و content-length و content-type و etag و expires و from و host و if-modified-since | *<code>set-cookie</code> هي دائما مصفوفة. ويضاف إليها هذه المكررات. | ||
*set-cookie هي دائما مصفوفة. ويضاف إليها هذه المكررات. | *بالنسبة إلى جميع الترويسات الأخرى، تُضم القيم مع <code>', '</code>. | ||
*بالنسبة إلى جميع الترويسات الأخرى، تُضم القيم مع | ===<code>message.httpVersion</code>=== | ||
===message.httpVersion=== | |||
أُضيفت مع الإصدار: v0.1.1. | أُضيفت مع الإصدار: v0.1.1. | ||
*<string>. | *[[JavaScript/String|<string>]]. | ||
في حالة طلب الخادم، يرسل العميل رقم إصدار HTTP. في حالة استجابة العميل، يرسل إصدار HTTP الخاص بالخادم المتصل. على الأغلب إما '1.1' أو'1.0'. | في حالة طلب الخادم، يرسل العميل رقم إصدار HTTP. في حالة استجابة العميل، يرسل إصدار HTTP الخاص بالخادم المتصل. على الأغلب إما <code>'1.1'</code> أو <code>'1.0'</code>. | ||
أيضا message.httpVersionMajor تعيد أول عدد صحيح و message.httpVersionMinor تعيد الثاني. | أيضا <code>message.httpVersionMajor</code> تعيد أول عدد صحيح و <code>message.httpVersionMinor</code> تعيد الثاني. | ||
===message.method=== | ===<code>message.method</code>=== | ||
أُضيفت مع الإصدار: v0.1.1. | أُضيفت مع الإصدار: v0.1.1. | ||
*<string>. | *[[JavaScript/String|<string>]]. | ||
صالحة فقط للطلب المُعاد من http.Server. | صالحة فقط للطلب المُعاد من <code>http.Server</code>. | ||
إعادة طريقة الطلب كسلسلة نصية. يُقرأ فقط. مثال: 'GET' و 'DELETE'. | إعادة طريقة الطلب كسلسلة نصية. يُقرأ فقط. مثال: <code>'GET'</code> و <code>'DELETE'</code>. | ||
===message.rawHeaders=== | ===<code>message.rawHeaders</code>=== | ||
أُضيفت مع الإصدار: v0.11.6. | أُضيفت مع الإصدار: v0.11.6. | ||
*<string[]>. | *[[JavaScript/String|<string[]>]]. | ||
قائمة ترويسات الطلبات والاستجابات الأولية تمامًا كما تَرِد. | قائمة ترويسات الطلبات والاستجابات الأولية تمامًا كما تَرِد. | ||
لاحظ أن المفاتيح والقيم موجودة في نفس القائمة. وهي ليست قائمة من صفوف. لذا، فإن العناصر ذات الأرقام الزوجية هي قيم المفاتيح، والعناصر ذات الأرقام الفردية هي القيم المرتبطة بها. | لاحظ أن المفاتيح والقيم موجودة في نفس القائمة. وهي ليست قائمة من صفوف. لذا، فإن العناصر ذات الأرقام الزوجية هي قيم المفاتيح، والعناصر ذات الأرقام الفردية هي القيم المرتبطة بها. | ||
لا تكون الترويسات مكتوبة بأحرف صغيرة ولا تُدمَج التكرارات. | لا تكون الترويسات مكتوبة بأحرف صغيرة ولا تُدمَج التكرارات.<syntaxhighlight lang="javascript"> | ||
// طباعة شيئًا مثل: | |||
// | |||
// | // | ||
// [ 'user-agent', | // [ 'user-agent', | ||
// 'لا يصلح هذا لأنه لا يمكن أن يكون هناك سوى واحد', | |||
// ' | // 'User-Agent', | ||
// 'curl/7.22.0', | |||
// 'User-Agent', | // 'Host', | ||
// '127.0.0.1:8000', | |||
// 'curl/7.22.0', | // 'ACCEPT', | ||
// '*/*' ] | |||
// 'Host', | |||
// '127.0.0.1:8000', | |||
// 'ACCEPT', | |||
// '*/*' ] | |||
console.log(request.rawHeaders); | console.log(request.rawHeaders); | ||
===message.rawTrailers=== | </syntaxhighlight> | ||
===<code>message.rawTrailers</code>=== | |||
أُضيفت مع الإصدار: v0.11.6. | أُضيفت مع الإصدار: v0.11.6. | ||
*<string[]>. | *[[JavaScript/String|<string[]>]]. | ||
تحتوي مفاتيح وقيم الطلب والاستجابة الأولية المُلحقة كما ترِد تمامًا. تُرسل فقط عند الحدث 'end'. | تحتوي مفاتيح وقيم الطلب والاستجابة الأولية المُلحقة كما ترِد تمامًا. تُرسل فقط عند الحدث <code>'end'</code>. | ||
===message.setTimeout(msecs, callback)=== | ===<code>message.setTimeout(msecs, callback)</code>=== | ||
أُضيف مع الإصدار: v0.5.9. | أُضيف مع الإصدار: v0.5.9. | ||
*msecs من النوع <number>. | *<code>msecs</code> من النوع [[JavaScript/Number|<number>]]. | ||
*callback من النوع <Function>. | *<code>callback</code> من النوع [[JavaScript/Function|<Function>]]. | ||
*القيمة المُعادة: <http.IncomingMessage> | *القيمة المُعادة: <http.IncomingMessage> | ||
تستدعي الدالة message.connection.setTimeout(msecs, callback). | تستدعي الدالة <code>message.connection.setTimeout(msecs, callback).</code> | ||
===message.socket=== | ===<code>message.socket</code>=== | ||
أُضيفت مع الإصدار: v0.3.0. | أُضيفت مع الإصدار: v0.3.0. | ||
*<net.Socket>. | *[[Node.js/net|<net.Socket>]]. | ||
كائن <net.Socket> المرتبط بالاتصال. | كائن [[Node.js/net|<net.Socket>]] المرتبط بالاتصال. | ||
مع دعم HTTPS، تستخدم request.socket.getPeerCertificate() للحصول على تفاصيل المصادقة الخاصة بالعميل. | مع دعم HTTPS، تستخدم <code>[[Node.js/tls|request.socket.getPeerCertificate()]]</code> للحصول على تفاصيل المصادقة الخاصة بالعميل. | ||
===message.statusCode=== | ===<code>message.statusCode</code>=== | ||
أُضيفت مع الإصدار: v0.1.1. | أُضيفت مع الإصدار: v0.1.1. | ||
*<number>. | *[[JavaScript/Number|<number>]]. | ||
صالحة فقط للاستجابة المُعادة من http.ClientRequest. | صالحة فقط للاستجابة المُعادة من <code>http.ClientRequest</code>. | ||
رمز حالة استجابة HTTP المكون من 3 أرقام. على سبيل المثال 404. | رمز حالة استجابة HTTP المكون من 3 أرقام. على سبيل المثال <code>404</code>. | ||
===message.statusMessage=== | ===<code>message.statusMessage</code>=== | ||
أُضيفت مع الإصدار: v0.11.10. | أُضيفت مع الإصدار: v0.11.10. | ||
*<string>. | *[[JavaScript/String|<string>]]. | ||
صالحة فقط للاستجابة المُعادة من http.ClientRequest. | صالحة فقط للاستجابة المُعادة من <code>http.ClientRequest</code>. | ||
رسالة حالة استجابة HTTP (عبارة سببية). على سبيل المثال، OK أو Internal Server Error. | رسالة حالة استجابة HTTP (عبارة سببية). على سبيل المثال، <code>OK</code> أو <code>Internal Server Error</code>. | ||
===message.trailers=== | ===<code>message.trailers</code>=== | ||
أُضيفت مع الإصدار: v0.3.0. | أُضيفت مع الإصدار: v0.3.0. | ||
*<Object>. | *[[JavaScript/Object|<Object>]]. | ||
كائن ملحقات الطلب والرد. تُرسل فقط عند الحدث 'end'. | كائن ملحقات الطلب والرد. تُرسل فقط عند الحدث <code>'end'</code>. | ||
===message.url=== | ===<code>message.url</code>=== | ||
أُضيفت مع الإصدار: v0.1.90. | أُضيفت مع الإصدار: v0.1.90. | ||
*<string>. | *[[JavaScript/String|<string>]]. | ||
صالحة فقط للطلب المُعاد من http.Server. | صالحة فقط للطلب المُعاد من <code>http.Server</code>. | ||
طلب سلسلة العنوان URL النصية. وتحتوي فقط على عنوان URL الموجود في طلب HTTP الفعلي. إذا كان الطلب هو:<syntaxhighlight lang="javascript"> | |||
GET /status?name=ryan HTTP/1.1\r\n | GET /status?name=ryan HTTP/1.1\r\n | ||
Accept: text/plain\r\n | Accept: text/plain\r\n | ||
\r\n | \r\n | ||
</syntaxhighlight>حينئذ يكون <code>request.url</code>:<syntaxhighlight lang="javascript"> | |||
حينئذ يكون request.url: | |||
'/status?name=ryan' | '/status?name=ryan' | ||
</syntaxhighlight>تحليل عنوان url إلى أجزائه يمكن استخدام <code>require('url').parse(request.url)</code>. مثال على ذلك:<syntaxhighlight lang="javascript"> | |||
تحليل عنوان url إلى أجزائه يمكن استخدام require('url').parse(request.url). مثال على ذلك: | |||
$ node | $ node | ||
> require('url').parse('/status?name=ryan') | > require('url').parse('/status?name=ryan') | ||
Url { | |||
Url { protocol: null, slashes: null, auth: null, host: null, port: null, hostname: null, hash: null, search: '?name=ryan', query: 'name=ryan', pathname: '/status', path: '/status?name=ryan', href: '/status?name=ryan' } | protocol: null, | ||
slashes: null, | |||
auth: null, | |||
host: null, | |||
port: null, | |||
hostname: null, | |||
> | hash: null, | ||
search: '?name=ryan', | |||
query: 'name=ryan', | |||
==http.METHODS== | pathname: '/status', | ||
path: '/status?name=ryan', | |||
href: '/status?name=ryan' } | |||
</syntaxhighlight> | |||
==<code>http.METHODS</code>== | |||
أُضيفت مع الإصدار: v0.11.8. | أُضيفت مع الإصدار: v0.11.8. | ||
*<string[]>. | *[[JavaScript/String|<string[]>]]. | ||
قائمة بدوال HTTP المُدعومة بواسطة المحلل. | قائمة بدوال HTTP المُدعومة بواسطة المحلل. | ||
==http.STATUS_CODES== | ==<code>http.STATUS_CODES</code>== | ||
أُضيفت مع الإصدار: v0.1.22. | أُضيفت مع الإصدار: v0.1.22. | ||
*<Object>. | *[[JavaScript/Object|<Object>]]. | ||
مجموعة من جميع رموز حالة استجابة HTTP القياسية، والوصف الموجز لكل منها. على سبيل المثال، http.STATUS_CODES[404] === 'Not Found'. | مجموعة من جميع رموز حالة استجابة HTTP القياسية، والوصف الموجز لكل منها. على سبيل المثال، <code>http.STATUS_CODES[404] === 'Not Found'</code>. | ||
==http.createServer([options][, requestListener])== | ==<code>http.createServer([options][, requestListener])</code>== | ||
سجل التغييرات | سجل التغييرات | ||
{| class="wikitable" | {| class="wikitable" | ||
سطر 989: | سطر 956: | ||
|- | |- | ||
|v9.6.0 | |v9.6.0 | ||
|أصبح وسيط options مدعومًا الآن. | |أصبح وسيط <code>options</code> مدعومًا الآن. | ||
|- | |- | ||
|v0.1.13 | |v0.1.13 | ||
|أُضيف مع الإصدار: v0.1.13. | |أُضيف مع الإصدار: v0.1.13. | ||
|} | |} | ||
*options من النوع <Object>. | *<code>options</code> من النوع [[JavaScript/Object|<Object>]]. | ||
**IncomingMessage من النوع :<http.IncomingMessage> لتحديد صنف IncomingMessage المستخدم. مفيدة لتمديد IncomingMessage الأصلي. القيمة الإفتراضية: IncomingMessage. | **<code>IncomingMessage</code> من النوع :<http.IncomingMessage> لتحديد صنف <code>IncomingMessage</code> المستخدم. مفيدة لتمديد <code>IncomingMessage</code> الأصلي. القيمة الإفتراضية: <code>IncomingMessage</code>. | ||
**ServerResponse من النوع <http.ServerResponse>: لتحديد صنف ServerResponse المُستخدم. مفيدة لتمديد ServerResponse الأصلي. القيمة الإفتراضية: ServerResponse. | **<code>ServerResponse</code> من النوع <http.ServerResponse>: لتحديد صنف <code>ServerResponse</code> المُستخدم. مفيدة لتمديد <code>ServerResponse</code> الأصلي. القيمة الإفتراضية: <code>ServerResponse</code>. | ||
*requestListener من النوع <Function> | *<code>requestListener</code> من النوع [[JavaScript/Function|<Function>]] | ||
*القيمة المُعادة: <http.Server> | *القيمة المُعادة: <http.Server> | ||
لعرض نسخة جديدة من http.Server. | لعرض نسخة جديدة من <code>http.Server</code>. | ||
تُعد requestListener دالة تُضاف تلقائيًا إلى حدث 'request'. | تُعد <code>requestListener</code> دالة تُضاف تلقائيًا إلى حدث <code>'request'</code>. | ||
==http.get(options[, callback])== | ==<code>http.get(options[, callback])</code>== | ||
سجل التغييرات | سجل التغييرات | ||
{| class="wikitable" | {| class="wikitable" | ||
سطر 1٬009: | سطر 976: | ||
|- | |- | ||
|v7.5.0 | |v7.5.0 | ||
|يمكن أن يكون المعامل options كائن عنوان URL WHATWG. | |يمكن أن يكون المعامل <code>options</code> كائن عنوان URL WHATWG. | ||
|- | |- | ||
|v0.3.6 | |v0.3.6 | ||
|أُضيف مع الإصدار: v0.3.6. | |أُضيف مع الإصدار: v0.3.6. | ||
|} | |} | ||
*options من النوع <Object> | <String> | <URL> تقبل نفس options مثل http.request() | *<code>options</code> من النوع [[Node.js/url|<Object>]] | [[JavaScript/String|<String>]] | [[Node.js/url|<URL>]] تقبل نفس <code>options</code> مثل <code>http.request()</code>، مع تعيين <code>method</code> دائمًا على <code>GET</code>. تُتجاهل الخصائص الموروثة من سلسلة prototype. | ||
*callback من النوع <Function>. | *<code>callback</code> من النوع [[JavaScript/Function|<Function>]]. | ||
*القيمة المُعادة: <http.ClientRequest>. | *القيمة المُعادة: <http.ClientRequest>. | ||
نظرًا لأن معظم الطلبات هي طلبات GET بدون متون، فإن Node.js يوفر هذه الدالة المناسبة. الاختلاف الوحيد بين هذه الدالة ودالة http.request() هو أنها تضبط الدالة على GET وتستدعي req.end() تلقائيًا. لاحظ أن دالة رد النداء يجب أن تهتم باستهلاك بيانات الاستجابة للأسباب المذكورة في قسم http.ClientRequest. | نظرًا لأن معظم الطلبات هي طلبات GET بدون متون، فإن Node.js يوفر هذه الدالة المناسبة. الاختلاف الوحيد بين هذه الدالة ودالة <code>http.request()</code> هو أنها تضبط الدالة على GET وتستدعي <code>req.end()</code> تلقائيًا. لاحظ أن دالة رد النداء يجب أن تهتم باستهلاك بيانات الاستجابة للأسباب المذكورة في قسم http.ClientRequest. | ||
تُستدعى callback مع وسيط واحد يمثل نسخة من http.IncomingMessage. | تُستدعى callback مع وسيط واحد يمثل نسخة من <code>http.IncomingMessage</code>. | ||
أمثلة عن جلب JSON: | أمثلة عن جلب JSON:<syntaxhighlight lang="javascript"> | ||
http.get('http://nodejs.org/dist/index.json', (res) => { | |||
const { statusCode } = res; | |||
const contentType = res.headers['content-type']; | |||
let error; | |||
if (statusCode !== 200) { | |||
error = new Error('Request Failed.\n' + | |||
`Status Code: ${statusCode}`); | |||
} else if (!/^application\/json/.test(contentType)) { | |||
error = new Error('Invalid content-type.\n' + | |||
`Expected application/json but received ${contentType}`); | |||
} | |||
if (error) { | |||
console.error(error.message); | |||
// استهلاك بيانات الاستجابة لتفريغ الذاكرة | |||
res.resume(); | |||
return; | |||
} | |||
res.setEncoding('utf8'); | |||
let rawData = ''; | |||
res.on('data', (chunk) => { rawData += chunk; }); | |||
res.on('end', () => { | |||
try { | |||
const parsedData = JSON.parse(rawData); | |||
console.log(parsedData); | |||
} catch (e) { | |||
console.error(e.message); | |||
} | |||
}); | |||
}).on('error', (e) => { | |||
console.error(`Got error: ${e.message}`); | |||
}); | }); | ||
==http.globalAgent== | </syntaxhighlight> | ||
==<code>http.globalAgent</code>== | |||
أُضيفت مع الإصدار: v0.5.9. | أُضيفت مع الإصدار: v0.5.9. | ||
*<http.Agent> | *<http.Agent> | ||
المثيل العام للوكيل Agent الذي يُستخدم كإعداد افتراضي لجميع طلبات عميل HTTP. | المثيل العام للوكيل <code>Agent</code> الذي يُستخدم كإعداد افتراضي لجميع طلبات عميل HTTP. | ||
==http.request(options[, callback])== | ==<code>http.request(options[, callback])</code>== | ||
سجل التغييرات | سجل التغييرات | ||
{| class="wikitable" | {| class="wikitable" | ||
!الإصدار | |||
!التغييرات | !التغييرات | ||
|- | |- | ||
|v7.5.0 | |v7.5.0 | ||
|يمكن أن يكون معامل options عبارة عن كائن URL WHATWG. | |يمكن أن يكون معامل <code>options</code> عبارة عن كائن <code>URL</code> WHATWG. | ||
|- | |- | ||
|v0.3.6 | |v0.3.6 | ||
|أُضيف مع الإصدار: v0.3.6. | |أُضيف مع الإصدار: v0.3.6. | ||
|} | |} | ||
*options من النوع <Object> | < | *options من النوع [[JavaScript/Object|<Object>]] | [[JavaScript/String|<string>]] | [[Node.js/url|<URL>]]. | ||
**protocol من النوع <string> وهو البروتوكول المراد استخدامه. القيمة الإفتراضية: 'http:'. | **<code>protocol</code> من النوع [[JavaScript/String|<string>]] وهو البروتوكول المراد استخدامه. القيمة الإفتراضية: <code>'http:'</code>. | ||
**host من النوع <string> وهو اسم المجال أو عنوان IP الخاص بالخادم المُصدَر إليه الطلب. القيمة الإفتراضية: 'localhost'. | **<code>host</code> من النوع [[JavaScript/String|<string>]] وهو اسم المجال أو عنوان IP الخاص بالخادم المُصدَر إليه الطلب. القيمة الإفتراضية: <code>'localhost'</code>. | ||
**hostname من النوع <string> وهو اسم مستعار للمضيف host. لدعم url.parse() | **<code>hostname</code> من النوع [[JavaScript/String|<string>]] وهو اسم مستعار للمضيف <code>host</code>. لدعم <code>[[Node.js/url|url.parse()]]</code>، يفضل استخدام <code>hostname</code> على <code>host</code>. | ||
**family من النوع <number> وهي عائلة عنوان IP لاستخدامها عند حل host و hostname. القيم الممكنة هي 4 أو 6. عندما يكون غير محدد، يستخدم كل من IP v4 و v6. | **<code>family</code> من النوع [[JavaScript/Number|<number>]] وهي عائلة عنوان IP لاستخدامها عند حل <code>host</code> و <code>hostname</code>. القيم الممكنة هي <code>4</code> أو <code>6</code>. عندما يكون غير محدد، يستخدم كل من IP v4 و v6. | ||
** | **<code>port</code> من النوع [[JavaScript/Number|<number>]] وهو منفذ الخادم البعيد. القيمة الإفتراضية: <code>80</code>. | ||
**localAddress من النوع <string> وهو واجهة محلية لربط اتصالات الشبكة. | **<code>localAddress</code> من النوع [[JavaScript/String|<string>]] وهو واجهة محلية لربط اتصالات الشبكة. | ||
**socketPath من النوع <string> وهو Unix Domain Socket (ويستخدم host:port أو socketPath). | **<code>socketPath</code> من النوع [[JavaScript/String|<string>]] وهو Unix Domain Socket (ويستخدم <code>host:port</code> أو <code>socketPath</code>). | ||
**method من النوع <string> وهي سلسلة نصية تحدد طريقة طلب HTTP. القيمة الإفتراضية: 'GET'. | **<code>method</code> من النوع [[JavaScript/String|<string>]] وهي سلسلة نصية تحدد طريقة طلب HTTP. القيمة الإفتراضية: <code>'GET'</code>. | ||
**path من النوع <string> وهو مسار الطلب. يجب تضمين سلسلة الاستعلام النصية إذا كانت موجودة. على سبيل المثال '/index.html?page=12'. يرمى استثناء عندما يحتوي مسار الطلب على أحرف غير صالحة. حاليًا، يُرفض المسافات فقط ولكن هذا قد يتغير في المستقبل. القيمة الافتراضية: '/'. | **<code>path</code> من النوع [[JavaScript/String|<string>]] وهو مسار الطلب. يجب تضمين سلسلة الاستعلام النصية إذا كانت موجودة. على سبيل المثال <code>'/index.html?page=12'</code>. يرمى استثناء عندما يحتوي مسار الطلب على أحرف غير صالحة. حاليًا، يُرفض المسافات فقط ولكن هذا قد يتغير في المستقبل. القيمة الافتراضية: <code>'/'</code>. | ||
**headers من النوع <Object> كائن يحتوي على ترويسات الطلبات. | **<code>headers</code> من النوع [[JavaScript/Object|<Object>]] كائن يحتوي على ترويسات الطلبات. | ||
**auth من النوع <string> وهي المصادقة الأساسية بمعنى 'user:password' لحساب ترويسة المصادقة. | **<code>auth</code> من النوع [[JavaScript/String|<string>]] وهي المصادقة الأساسية بمعنى <code>'user:password'</code> لحساب ترويسة المصادقة. | ||
**agent من النوع <http.Agent> | <boolean> وهو يتحكم في سلوك الوكيل Agent. القيم المُمكنة: | **<code>agent</code> من النوع <http.Agent> | [[JavaScript/Boolean|<boolean>]] وهو يتحكم في سلوك الوكيل <code>Agent</code>. القيم المُمكنة: | ||
***undefined (القيمة الافتراضية): استخدم http.globalAgent لهذا المضيف والمنفذ. | ***<code>undefined</code> (القيمة الافتراضية): استخدم <code>http.globalAgent</code> لهذا المضيف والمنفذ. | ||
***كائن Agent: استخدام Agent المُمرر بشكل صريح. | ***كائن <code>Agent</code>: استخدام <code>Agent</code> المُمرر بشكل صريح. | ||
***false: يتسبب في استخدام Agent جديد بقيم افتراضية. | ***<code>false</code>: يتسبب في استخدام <code>Agent</code> جديد بقيم افتراضية. | ||
**createConnection من النوع <Function> وهي دالة تنتج مقبس ودفق لاستخدامهما عند عدم استخدام خيار agent. يمكن استخدام هذا لتجنب إنشاء فئة Agent مخصص فقط لتجاوز الدالة createConnection الافتراضية. راجع agent.createConnection() لمزيد من التفاصيل. أي دفق مزدوج Duplex هو قيمة مُعادة صالحة. | **<code>createConnection</code> من النوع [[JavaScript/Function|<Function>]] وهي دالة تنتج مقبس ودفق لاستخدامهما عند عدم استخدام خيار <code>agent</code>. يمكن استخدام هذا لتجنب إنشاء فئة <code>Agent</code> مخصص فقط لتجاوز الدالة <code>createConnection</code> الافتراضية. راجع <code>agent.createConnection()</code> لمزيد من التفاصيل. أي دفق مزدوج <code>[[Node.js/stream|Duplex]]</code> هو قيمة مُعادة صالحة. | ||
**timeout من النوع <number> وهو رقم يُحدد مهلة المقبس بالمللي ثانية. سيضبط هذا الخيار المهلة قبل توصيل المقبس. | **<code>timeout</code> من النوع [[JavaScript/Number|<number>]] وهو رقم يُحدد مهلة المقبس بالمللي ثانية. سيضبط هذا الخيار المهلة قبل توصيل المقبس. | ||
**setHost من النوع <boolean> وهو يستخدم لتحديد ما إذا كانت ترويسة المضيف Host ستُضاف تلقائيًا أم لا. القيمة الافتراضية true. | **<code>setHost</code> من النوع [[JavaScript/Boolean|<boolean>]] وهو يستخدم لتحديد ما إذا كانت ترويسة المضيف Host ستُضاف تلقائيًا أم لا. القيمة الافتراضية <code>true</code>. | ||
*callback من النوع <Function>. | *<code>callback</code> من النوع [[JavaScript/Function|<Function>]]. | ||
*القيمة المُعادة: <http.ClientRequest> | *القيمة المُعادة: <http.ClientRequest> | ||
يحافظ Node.js على عدة اتصالات لكل خادم لإجراء طلبات HTTP. تسمح هذه الدالة لإحداها بإصدار الطلبات بشفافية. | يحافظ Node.js على عدة اتصالات لكل خادم لإجراء طلبات HTTP. تسمح هذه الدالة لإحداها بإصدار الطلبات بشفافية. | ||
يمكن أن تكون options كائنًا أو سلسلة أو كائن URL. إذا كانت options سلسلة نصية، ستُحلل تلقائيًا بواسطة url.parse(). إذا كان كائن URL، فسيتحول تلقائيًا إلى كائن options عادي. | يمكن أن تكون options كائنًا أو سلسلة أو كائن <code>[[Node.js/url|URL]]</code>. إذا كانت <code>options</code> سلسلة نصية، ستُحلل تلقائيًا بواسطة <code>[[Node.js/url|url.parse()]]</code>. إذا كان كائن URL، فسيتحول تلقائيًا إلى كائن <code>options</code> عادي. | ||
سيُضاف معامل callback الاختياري كمستمع لمرة واحدة للحدث 'response'. | سيُضاف معامل <code>callback</code> الاختياري كمستمع لمرة واحدة للحدث <code>'response'</code>. | ||
وتُعيد الدالة http.request() نسخة من الصنف http.ClientRequest. ويُعد المثيل ClientRequest دفقًا قابلًا للكتابة. في حالة الحاجة إلى تحميل ملف له طلب من النوع POST، يجب الكتابة إلى كائن ClientRequest. | وتُعيد الدالة <code>http.request()</code> نسخة من الصنف <code>http.ClientRequest</code>. ويُعد المثيل <code>ClientRequest</code> دفقًا قابلًا للكتابة. في حالة الحاجة إلى تحميل ملف له طلب من النوع POST، يجب الكتابة إلى كائن <code>ClientRequest</code>. | ||
أمثلة | أمثلة<syntaxhighlight lang="javascript"> | ||
const postData = querystring.stringify({ | |||
'msg': 'مرحبًا أيها العالم!' | |||
}); | |||
const | const options = { | ||
hostname: 'www.google.com', | |||
port: 80, | |||
path: '/upload', | |||
method: 'POST', | |||
headers: { | |||
'Content-Type': 'application/x-www-form-urlencoded', | |||
'Content-Length': Buffer.byteLength(postData) | |||
} | |||
}; | |||
const req = http.request(options, (res) => { | |||
console.log(`STATUS: ${res.statusCode}`); | |||
console.log(`HEADERS: ${JSON.stringify(res.headers)}`); | |||
res.setEncoding('utf8'); | |||
res.on('data', (chunk) => { | |||
console.log(`BODY: ${chunk}`); | |||
}); | |||
res.on('end', () => { | |||
console.log('No more data in response.'); | |||
}); | |||
}); | |||
req.on('error', (e) => { | |||
console.error(`problem with request: ${e.message}`); | |||
}); | |||
}); | |||
// كتابة البيانات لطلب المتن | |||
req.write(postData); | req.write(postData); | ||
req.end(); | |||
</syntaxhighlight>لاحظ أنه في هذا المثال قد أُستُدعي <code>req.end()</code>. يجب دائمًا استدعاء <code>req.end()</code> مع <code>http.request()</code> للدلالة على نهاية الطلب - حتى إذا لم تكن هناك بيانات تُكتب إلى متن الطلب. | |||
إذا صادف حدوث أي خطأ أثناء الطلب (سواء كان ذلك أثناء حل DNS، أو أخطاء في مستوى TCP، أو أخطاء تحليل HTTP الفعلية) يُطلَق حدث <code>'error'</code> على كائن الطلب المُعاد. كما هو الحال مع جميع أحداث 'error'، إذا لم تُسجَّل أي مستمعات، فسيُطرح الخطأ. | |||
إذا صادف حدوث أي خطأ أثناء الطلب (سواء كان ذلك أثناء حل DNS، أو أخطاء في مستوى TCP، أو أخطاء تحليل HTTP الفعلية) يُطلَق حدث 'error' على كائن الطلب المُعاد. كما هو الحال مع جميع أحداث 'error'، إذا لم تُسجَّل أي مستمعات، فسيُطرح الخطأ. | |||
هناك بعض الترويسات الخاصة التي يجب ملاحظتها. | هناك بعض الترويسات الخاصة التي يجب ملاحظتها. | ||
*سيؤدي إرسال 'Connection: keep-alive' إلى إخطار Node.js بأن الاتصال بالخادم يجب أن يستمر حتى الطلب التالي. | *سيؤدي إرسال 'Connection: keep-alive' إلى إخطار Node.js بأن الاتصال بالخادم يجب أن يستمر حتى الطلب التالي. | ||
*سيؤدي إرسال ترويسة | *سيؤدي إرسال ترويسة 'Content-Length' إلى تعطيل الترميز الافتراضي المُجزَّأ. | ||
*سيؤدي إرسال ترويسة | *سيؤدي إرسال ترويسة 'Expect' إلى إرسال ترويسات الطلبات على الفور. عادة، عند إرسال <code>'Expect: 100-continue'</code>، يجب ضبط كل من المهلة ومستمع للحدث <code>'continue'</code>. لمزيد من المعلومات، راجع RFC2616 القسم 8.2.3. | ||
*سيؤدي إرسال ترويسة المُصادقة إلى إلغاء استخدام خيار auth لحساب المصادقة الأساسية. | *سيؤدي إرسال ترويسة المُصادقة إلى إلغاء استخدام خيار <code>auth</code> لحساب المصادقة الأساسية. | ||
مثال باستخدام URL كخيار options: | مثال باستخدام <code>[[Node.js/url|URL]]</code> كخيار options:<syntaxhighlight lang="javascript"> | ||
const options = new URL('http://abc:xyz@example.com'); | |||
const options = new URL(' | |||
const req = http.request(options, (res) => { | |||
// ... | |||
}); | }); | ||
</syntaxhighlight>في طلب ناجح، ستُرسل الأحداث التالية بالترتيب التالي: | |||
في طلب ناجح، ستُرسل الأحداث التالية بالترتيب التالي: | *<code>'socket'</code> | ||
*'socket' | *<code>'response'</code> | ||
*'response' | **<code>'data'</code> أي عدد من المرات، على كائن <code>res</code> (لن يُطلَق الحدث <code>'data'</code> على الإطلاق إذا كان متن الاستجابة فارغًا، على سبيل المثال، في معظم عمليات إعادة التوجيه). | ||
**'data' أي عدد من المرات، على كائن res (لن يُطلَق الحدث 'data' على الإطلاق إذا كان متن الاستجابة فارغًا، على سبيل المثال، في معظم عمليات إعادة التوجيه). | **<code>'end'</code> على كائن <code>res</code> | ||
**'end' على كائن res | *<code>'close'</code> | ||
*'close' | |||
في حالة حدوث خطأ في الاتصال، ستُطلق الأحداث التالية: | في حالة حدوث خطأ في الاتصال، ستُطلق الأحداث التالية: | ||
*'socket' | *<code>'socket'</code> | ||
*'error' | *<code>'error'</code> | ||
*'close' | *<code>'close'</code> | ||
إذا أستُدعيت الدالة req.abort() قبل نجاح الاتصال، فستُطلق الأحداث التالية بالترتيب التالي: | إذا أستُدعيت الدالة <code>req.abort()</code> قبل نجاح الاتصال، فستُطلق الأحداث التالية بالترتيب التالي: | ||
*'socket' | *<code>'socket'</code> | ||
*(تُستدعى الدالة req.abort() هنا) | *(تُستدعى الدالة <code>req.abort()</code> هنا) | ||
*'abort' | *<code>'abort'</code> | ||
*'close' | *<code>'close'</code> | ||
*'error' مع الخطأ مع رسالة 'Error: socket hang up' ورمز 'ECONNRESET' | *<code>'error'</code> مع الخطأ مع رسالة <code>'Error: socket hang up'</code> ورمز <code>'ECONNRESET'</code> | ||
إذا أستُدعيت الدالة req.abort() بعد تلقي الاستجابة، فستُطلق الأحداث التالية بالترتيب التالي: | إذا أستُدعيت الدالة <code>req.abort()</code> بعد تلقي الاستجابة، فستُطلق الأحداث التالية بالترتيب التالي: | ||
*'socket' | *<code>'socket'</code> | ||
*'response' | *<code>'response'</code> | ||
**'data' أي عدد من المرات، على كائن res. | **<code>'data'</code> أي عدد من المرات، على كائن res. | ||
*(تُستدعى req.abort() هنا) | *(تُستدعى <code>req.abort()</code> هنا) | ||
*'abort' | *<code>'abort'</code> | ||
*'close' | *<code>'close'</code> | ||
**'aborted' على كائن res | **<code>'aborted'</code> على كائن <code>res</code> | ||
**'end' على كائن res | **<code>'end'</code> على كائن <code>res</code> | ||
**'close' على كائن res | **<code>'close'</code> على كائن <code>res</code> | ||
لاحظ أن ضبط خيار timeout أو استخدام الدالة setTimeout() لن يؤدي إلى إلغاء الطلب أو القيام بأي شيء بجانب إضافة حدث 'timeout'. | لاحظ أن ضبط خيار <code>timeout</code> أو استخدام الدالة <code>setTimeout()</code> لن يؤدي إلى إلغاء الطلب أو القيام بأي شيء بجانب إضافة حدث <code>'timeout'</code>. | ||
=مصادر= | =مصادر= | ||
<span> </span><span> </span>[https://nodejs.org/dist/latest-v10.x/docs/api/http.html#http_class_http_clientrequest صفحةHTTP في توثيق Node.js الرسمي]. | |||
[[تصنيف:Node.js]] | [[تصنيف:Node.js|{{SUBPAGENAME}}]] |
المراجعة الحالية بتاريخ 11:17، 23 أكتوبر 2018
مؤشر الاستقرار: 2 - مستقر
لاستخدام خادم وعميل HTTP يجب استدعاء require('http')
.
صُمِمت واجهات HTTP في Node.js لدعم العديد من ميزات البروتوكول التي كانت صعبة الاستخدام تقليديًا. على وجه الخصوص، الرسائل الكبيرة، التي قد تكون مرمّزة كقطع ضخمة. وتكون الواجهة حريصة على عدم تخزين الطلبات أو الاستجابات بأكملها مؤقتًا، بحيث يكون المستخدم قادرًا على دفق البيانات (stream data).
تُمثَّل ترويسات رسائل HTTP بواسطة كائن مثل التالي:
{ 'content-length': '123',
'content-type': 'text/plain',
'connection': 'keep-alive',
'host': 'mysite.com',
'accept': '*/*' }
تُكتب المفاتيح بحروف صغيرة. ولا تُعدَّل القيم.
من أجل دعم الطيف الكامل لتطبيقات HTTP الممكنة، تُعد واجهة تطبيقات HTTP الخاصة ببيئة Node.js منخفضة المستوى. فهي تتعامل مع معالجة التدفق وتحليل الرسائل فقط. وتوزع رسالة في الترويسات والمتن ولكنها لا تحلل الترويسات والمتن الفعليين.
راجع message.headers
للحصول على تفاصيل حول كيفية معالجة الترويسات المتكررة.
تُحفظ الترويسات الأولية عند استلامها في خاصية rawHeaders
، وهي عبارة عن مصفوفة على الشكل [key, value, key2, value2,...]
. على سبيل المثال، قد يحتوي كائن ترويسة الرسالة السابق على rawHeaders
على الشكل التالي:
[ 'ConTent-Length', '123456',
'content-LENGTH', '123',
'content-type', 'text/plain',
'CONNECTION', 'keep-alive',
'Host', 'mysite.com',
'accepT', '*/*' ]
الصنف http.Agent
أُضيف مع الإصدار: v0.3.4.
يكون الوكيل Agent
مسؤولاً عن إدارة استمرارية الاتصال وإعادة استخدامه لعملاء HTTP. وهو يحافظ على قائمة انتظار الطلبات المعلقة لمضيف ومنفذ معين، مُعيدًا استخدام توصيل مقبس واحد لكل منها حتى تصبح قائمة الانتظار فارغة، وعند ذلك، إما يُدمَّر المقبس (socket) أو يوضع في مُجمِّع حيث سيُحتفظ به لاستخدامه مرة أخرى لطلبات نفس المضيف والمنفذ. يعتمد تدمير المقبس أو تخزينه على الخيار keepAlive
.
تكون خاصية TCP Keep-Alive مفعلة بالنسبة للاتصالات المُجمَّعة، لكن قد تغلق الخوادم الاتصالات الخاملة، وفي هذه الحالة ستُزال من المُجمَّع وسيُجرى اتصال جديد عند إجراء طلب HTTP جديد لهذا المضيف والمنفذ. قد ترفض الخوادم أيضًا السماح بطلبات متعددة عبر نفس الاتصال، وفي هذه الحالة يجب إعادة إجراء الاتصال لكل طلب ولا يمكن تجميعه. وسيستمر Agent
في تقديم الطلبات إلى ذلك الخادم، ولكن سيحدث كلٌ منها عبر اتصال جديد.
عند إغلاق اتصال من قبل العميل أو الخادم، يتم إزالته من التجمع. سيُلغى أي مقبس غير مستخدم في التجمع حتى لا تُشغل عملية Node.js عند عدم وجود طلبات معلقة. (راجع socket.unref()
).
من الممارسات الجيدة، استخدام destroy()
لهدم مثيل الوكيل Agent
عند الانتهاء من استخدامه، لأن المقابس غير المستخدمة تستهلك موارد نظام التشغيل.
تُزال المقابس من الوكيل عندما يصدر المقبس إما حدث 'close'
أو حدث 'agentRemove'
. عند الرغبة في الاحتفاظ بطلب HTTP واحد مفتوح لفترة طويلة دون حفظه في الوكيل، يمكن تنفيذ ما يلي:
http.get(options, (res) => {
// أداء شيئًا ما
}).on('socket', (socket) => {
socket.emit('agentRemove');
});
يمكن استخدام الوكيل أيضًا لطلب فردي. وذلك بتمرير {agent: false}
كخيار للدالة http.get()
أو الدالة http.request()
، يستخدم Agent
الاستخدام لمرة واحدة مع الخيارات الافتراضية لاتصال العميل.
agent:false
:
http.get({
hostname: 'localhost',
port: 80,
path: '/',
agent: false // إنشاء وكيل جديد فقط لهذا الطلب
}, (res) => {
// أداء اشياء مع الاستجابة
});
new Agent([options])
أُضيف مع الإصدار: v0.3.4.
options
من النوع <Object>: وهي مجموعة من الخيارات القابلة للتهيئة لضبط الوكيل. يمكن أن يكون لها الحقول التالية:keepAlive
: من النوع <boolean> ويحفظ المقابس حتى عندما لا تكون هناك طلبات معلقة، بحيث يمكن استخدامها للطلبات المستقبلية دون الحاجة إلى إعادة تأسيس اتصال TCP. القيمة الافتراضية:false
.keepAliveMsecs
: من النوع <number> عند استخدام الخيارkeepAlive
، يحدد التأخير الأولي لحِزم TCP Keep-Alive. وتُهمل عندما يكون الخيارkeepAlive
ليسfalse
أوundefined
. القيمة الافتراضية:1000
.maxSockets
من النوع <number> وهو العدد الأقصى من المقابس المسموح بها لكل مضيف. القيمة الإفتراضية:Infinity
.maxFreeSockets
من النوع <number> وهو الحد الأقصى لعدد المقابس المتروكة في حالة حرة. ويكون ذو صلة فقط إذا ضُبطتkeepAlive
بالقيمةtrue
. القيمة الإفتراضية:256
.
الوكيل http.globalAgent
الافتراضي المُستخدم بواسطة http.request()
له جميع هذه القيم المضبوطة لإعداداتها الافتراضية.
لتهيئة أي منها يجب إنشاء http.Agent
مخصص.
const http = require('http');
const keepAliveAgent = new http.Agent({ keepAlive: true });
options.agent = keepAliveAgent;
http.request(options, onResponseCallback);
agent.createConnection(options[, callback])
أُضيف مع الإصدار: v0.11.4.
options
من النوع <Object>: وهي خيارات تحتوي على تفاصيل الاتصال. راجعnet.createConnection()
لتنسيق الخيارات.callback
من النوع <Function>: وهي دالة رد النداء التي تستقبل المقبس المُنشأ.- القيمة المعادة: <net.Socket>
ينتج مقبس ودفق لاستخدامهما لطلبات HTTP.
بشكل افتراضي، هذه الدالة هي نفسها net.createConnection()
. ومع ذلك، قد تتجاوز الوكلاء المخصصين (custom agents) هذه الطريقة في حالة الرغبة في المزيد من المرونة.
يمكن تمرير المقبس/الدفق بإحدى الطريقتين التاليتين: بإعادة المقبس/الدفق من هذه الدالة، أو عن طريق تمرير المقبس/الدفق إلى callback
.
وتكون callback
على الشكل (err, stream)
.
agent.keepSocketAlive(socket)
أُضيف مع الإصدار: v8.1.0.
socket
من النوع <net.Socket>
يستدعى عند فصل socket
عن الطلب ويمكن أن يستمر من خلال Agent
. ويكون السلوك الافتراضي كالتالي:
socket.setKeepAlive(true, this.keepAliveMsecs);
socket.unref();
return true;
يمكن تجاوز هذا التابع بواسطة صنف فرعي معين للوكيل Agent
. إذا أعاد هذا التابع قيمة false
أو مثيلاتها، سيُتلف المقبس بدلاً من استمرار استخدامه مع الطلب التالي.
agent.reuseSocket(socket, request)
أُضيفت مع الإصدار: v8.1.0.
socket
من النوع <net.Socket>request
من النوع <http.ClientRequest>
يُستدعى عند إرفاق socket
بالطلب request
بعد الاستمرار بسبب خيارات keep-alive. ويكون السلوك الافتراضي كالتالي:
socket.ref();
يمكن تجاوز هذا التابع بواسطة صنف فرعي معين للوكيل Agent
.
agent.destroy()
أُضيفت مع الإصدار: v0.11.4.
تدمير أي مقبس قيد الاستخدام حاليًا من قبل الوكيل.
عادة ليس من الضروري القيام بذلك. ومع ذلك، في حالة استخدام وكيل مع تفعيل keepAlive
، فمن الأفضل إيقاف تشغيل الوكيل بشكل صريح طالما لن يستخدم مرة أخرى. خلاف ذلك، قد يتعطل المقبس ويظل مفتوحًا لفترة طويلة قبل أن ينهيه الخادم.
agent.freeSockets
أُضيف مع الإصدار: v0.11.4.
كائن يحتوي على مصفوفات من المقابس قيد انتظار الاستخدام بواسطة الوكيل عندما يكون keepAlive
مُفعلًا. لا تعدله.
agent.getName(options)
أُضيفت مع الإصدار: v0.11.4.
options
من النوع <Object>: مجموعة من الخيارات التي توفر معلومات لتوليد الأسماء:- القيمة المعادة: من النوع <string>.
الحصول على اسم فريد لمجموعة من خيارات الطلب، لتحديد ما إذا كان يمكن إعادة استخدام الاتصال. بالنسبة إلى وكيل HTTP، يؤدي هذا إلى إعادة host:port:localAddress
أو host:port:localAddress:family
. بالنسبة إلى وكيل HTTPS، يشتمل الاسم على CA و cert و ciphers وخيارات HTTPS / TLS الخاصة الأخرى التي تحدد قابلية إعادة استخدام المقبس.
agent.maxFreeSockets
أُضيفت مع الإصدار: v0.11.7.
قيمته الافتراضية هي 256. بالنسبة إلى الوكلاء المُفعل لهم keepAlive
، يضبط الحد الأقصى لعدد المقابس التي ستُترك مفتوحة في الحالة الحرة.
agent.maxSockets
أُضيفت مع الإصدار: v0.3.6.
قيمته الافتراضية Infinity
. يحدد عدد المقابس المتزامنة التي يمكن للوكيل فتحها لكل مصدر. المصدر هو القيمة المُعادة من agent.getName()
.
agent.requests
أُضيفت مع الإصدار: v0.5.9.
كائن يحتوي على قوائم انتظار الطلبات التي لم تُعيَّن بعد إلى مقابس. لا تعدله.
agent.sockets
أُضيفت مع الإصدار: v0.3.6.
كائن يحتوي على مصفوفات من المقابس قيد الاستخدام من قِبَل الوكيل. لا تعدله.
الصنف http.ClientRequest
أُضيف مع الإصدار: v0.1.17.
يُنشأ هذا الكائن داخليًا ويُعاد من قِبَل http.request()
. يمثل طلب in-progress الذي تنتظر ترويسته في قائمة الانتظار. لا تزال ترويسة الصفحة قابلة للتغيير باستخدام واجهات التطبيقات setHeader(name, value)
و setHeader(name, value)
و getHeader(name)
و removeHeader(name)
. وترسل الترويسة الفعلية مع مقطع البيانات الأول أو عند استدعاء request.end()
.
للحصول على الاستجابة، يجب إضافة مستمع للحدث 'response'
إلى كائن الطلب. سيُصدر 'response'
من كائن الطلب عند استلام ترويسات الاستجابة. يُنفّذ الحدث 'response'
مع وسيطٍ واحدٍ مثيل لرسالة http.IncomingMessage
.
أثناء حدث 'response'
، يمكن إضافة مُستمعات إلى كائن الاستجابة؛ خاصة للاستماع لحدث 'data'
.
إذا لم يُضاف معالج 'response'
، فستُتجاهَل الاستجابة تمامًا. ومع ذلك، إذا أُضيف معالج للحدث 'response'
، فيجب استهلاك البيانات المُعادة من كائن الاستجابة، إما باستدعاء response.read()
كلما يكون هناك حدث 'readable'
أو بإضافة معالج 'data'
أو باستدعاء التابع .resume()
. لن يُطلَق الحدث 'end'
حتى تُستهلَك البيانات. أضف إلى ذلك أنَّه حتى تُقرَأ البيانات سوف تستهلك الذاكرة التي يمكن أن تؤدي في النهاية إلى خطأ "process out of memory".
لا يتحقق Node.js من تساوي طول المحتوى وطول المتن (body) المُرسل أم لا.
ينفذ الطلبُ واجهةَ التدفق القابل للكتابة. وهو EventEmitter
مع الأحداث التالية:
الحدث 'abort'
أُضيف مع الإصدار: v1.4.1.
يُطلَق عند إلغاء الطلب من قِبَل العميل. يُرسل هذا الحدث فقط عند الاستدعاء الأول للدالة abort()
.
الحدث 'connect'
أُضيف مع الإصدار: v0.7.0.
response
من النوع <http.IncomingMessage>.socket
من النوع <net.Socket>.head
من النوع <Buffer>.
يُطلَق في كل مرة يستجيب فيها الخادم لطلب باستخدام الطريقة CONNECT
. إذا لم يُستمَع إلى هذا الحدث، فستُغلق الاتصالات الخاصة بالعملاء الذين يتلقون طريقة CONNECT
.
فيما يلي زوج من العميل والخادم يوضح كيفية الاستماع إلى الحدث 'connect'
:
const http = require('http');
const net = require('net');
const url = require('url');
// إنشاء وكيل HTTP نفقي
const proxy = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('okay');
});
proxy.on('connect', (req, cltSocket, head) => {
// الاتصال بخادم الأصل
const srvUrl = url.parse(`http://${req.url}`);
const srvSocket = net.connect(srvUrl.port, srvUrl.hostname, () => {
cltSocket.write('HTTP/1.1 200 Connection Established\r\n' +
'Proxy-agent: Node.js-Proxy\r\n' +
'\r\n');
srvSocket.write(head);
srvSocket.pipe(cltSocket);
cltSocket.pipe(srvSocket);
});
});
// الآن هذا الوكيل يعمل
proxy.listen(1337, '127.0.0.1', () => {
// تقديم طلب إلى وكيل نفقي
const options = {
port: 1337,
hostname: '127.0.0.1',
method: 'CONNECT',
path: 'www.google.com:80'
};
const req = http.request(options);
req.end();
req.on('connect', (res, socket, head) => {
console.log('got connected!');
// تقديم طلب عبر نفق HTTP
socket.write('GET / HTTP/1.1\r\n' +
'Host: www.google.com:80\r\n' +
'Connection: close\r\n' +
'\r\n');
socket.on('data', (chunk) => {
console.log(chunk.toString());
});
socket.on('end', () => {
proxy.close();
});
});
});
الحدث 'continue'
أُضيف مع الإصدار: v0.3.2.
يُطلَق عندما يرسل خادم HTTP استجابة '100 Continue'، عادةً بسبب احتواء الطلب على 'Expect: 100-continue' هذه تعليمة بوجوب إرسال العميل لمتن الطلب.
الحدث 'information'
أُضيف مع الإصدار: v10.0.0.
يُطلَق عندما يرسل الخادم استجابة 1xx (باستثناء 101 Upgrade). يُرسل هذا الحدث مع دالة رد نداء تحتوي على كائن برمز الحالة.
const http = require('http');
const options = {
hostname: '127.0.0.1',
port: 8080,
path: '/length_request'
};
// تقديم طلب
const req = http.request(options);
req.end();
req.on('information', (res) => {
console.log(`Got information prior to main response: ${res.statusCode}`);
});
لا تؤدي حالات 101 Upgrade إلى إطلاق هذا الحدث بسبب انقطاعها عن سلسلة طلب/استجابة HTTP التقليدية، مثل مقابس الويب أو ترقيات طبقة النقل الآمنة TLS في الموقع (in-place TLS upgrades) أو HTTP 2.0. للإشعار بالحالة 101 Upgrade، يجب الاستماع إلى الحدث 'upgrade'
بدلاً من ذلك.
الحدث 'response'
أُضيف مع الإصدار: v0.1.0.
response
من النوع <http.IncomingMessage>.
يُطلَق عند تلقي استجابة لهذا الطلب. هذا الحدث يُطلَق مرة واحدة فقط.
الحدث 'socket'
أُضيف مع الإصدار: v0.5.3.
socket
من النوع <net.Socket>
يُطلَق بعد تعيين مقبس لهذا الطلب.
الحدث 'timeout'
أُضيف مع الإصدار: v0.7.8.
يُطلَق عندما يخرج المقبس الأساسي من حالة الخمول. يصدر هذا الحدث إشعارًا بأن النفس حامل. يجب إلغاء الطلب يدويًا.
انظر أيضًا: request.setTimeout()
.
الحدث: 'upgrade'
أُضيف مع الإصدار: v0.1.94.
response
من النوع <http.IncomingMessage>.socket
من النوع <net.Socket>.head
من النوع <Buffer>.
يُطلَق في كل مرة يستجيب فيها الخادم لطلب ما باستخدام ترقية (upgrade). إذا لم يُستمع لهذا الحدث وكان رمز حالة الاستجابة هو 101 Switching Protocols، فستُغلق اتصالات العملاء التي تتلقى ترويسة ترقية.
فيما يلي يوضح زوج الخادم والعميل كيفية الاستماع لحدث 'upgrade'
.
const http = require('http');
// إنشاء خادم HTTP
const srv = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('okay');
});
srv.on('upgrade', (req, socket, head) => {
socket.write('HTTP/1.1 101 Web Socket Protocol Handshake\r\n' +
'Upgrade: WebSocket\r\n' +
'Connection: Upgrade\r\n' +
'\r\n');
socket.pipe(socket); // echo back
});
// الآن هذا الخادم يعمل
srv.listen(1337, '127.0.0.1', () => {
// تقديم طلب
const options = {
port: 1337,
hostname: '127.0.0.1',
headers: {
'Connection': 'Upgrade',
'Upgrade': 'websocket'
}
};
const req = http.request(options);
req.end();
req.on('upgrade', (res, socket, upgradeHead) => {
console.log('got upgraded!');
socket.end();
process.exit(0);
});
});
request.abort()
أُضيفت مع الإصدار: v0.3.8.
يحدد الطلب على أنه جارٍ إلغاؤه. يؤدي استدعاء هذا إلى إسقاط البيانات المتبقية في الاستجابة وهدم المقبس.
request.aborted
أُضيفت مع الإصدار: v0.11.14.
إذا أُلغي طلب، تصبح هذه القيمة هي الوقت الذي أُحبِط فيه الطلب، بالمللي ثانية منذ 1 كانون الثاني/يناير 1970 00:00:00 UTC.
request.connection
أُضيفت مع الإصدار: v0.3.0.
راجع request.socket
.
request.end([data[, encoding]][, callback])
سجل التغييرات
الإصدار | التغييرات |
---|---|
v10.0.0 | يعيد هذا التابع الآن مرجع إلى ClientRequest .
|
v0.1.90 | أُضيفت مع الإصدار: v0.1.90. |
data
من النوع <string> | <Buffer>.encoding
من النوع <string>.callback
من النوع <Function>.- القيمة المعادة: <this>.
الانتهاء من إرسال الطلب. إذا لم يُرسَل أي جزء من المتن، فسيرسله إلى التدفق. إذا قُسِّم الطلب، فسيؤدي ذلك إلى إرسال '0\r\n\r\n'
.
إذا حُدِدت data، فإنه يكافئ استدعاء request.write(data, encoding)
متبوعًا بالتابع request.end(callback)
.
إذا حُدِدت الدالة callback
، فستُستدعى عند انتهاء تدفق الطلب.
request.flushHeaders()
أُضيف مع الإصدار: v1.6.0.
دفق ترويسات الطلبات.
لأسباب تتعلق بالكفاءة، عادةً ما يخزن Node.js ترويسات الطلبات مؤقتًا حتى يُستدعى request.end()
أو يُكتب أول جزء من بيانات الطلب. ثم يحاول حزم ترويسات الطلب والبيانات في حزمة TCP واحدة.
عادة ما يكون ذلك مرغوبًا (فهو يحفظ رحلة ذهاب وإياب TCP)، ولكن ليس عند عدم إرسال البيانات الأولى حتى وقت لاحق. يتجاوز request.flushHeaders()
هذا التحسين ويبدأ الطلب.
request.getHeader(name)
أُضيف مع الإصدار: v1.6.0.
name
من النوع <string>.- القيمة المعادة: أي نوع من الأنواع.
يقرأ ترويسة الطلب. لاحظ أن الاسم غير حساس لحالة الأحرف. يعتمد نوع القيمة المعادة على الوسائط المُمررة إلى request.setHeader()
.
أمثلة
request.setHeader('content-type', 'text/html');
request.setHeader('Content-Length', Buffer.byteLength(body));
request.setHeader('Set-Cookie', ['type=ninja', 'language=javascript']);
const contentType = request.getHeader('Content-Type');
// contentType is 'text/html'
const contentLength = request.getHeader('Content-Length');
// contentLength is of type number
const setCookie = request.getHeader('set-cookie');
// setCookie is of type string[]
request.maxHeadersCount
- <number> القيمة الإفتراضية:
2000
يحدد عدد ترويسات الاستجابات القصوى. إذا ضُبِط بالقيمة 0، فلن يُطبَّق أي حد.
request.removeHeader(name)
أُضيف مع الإصدار: v1.6.0.
name
من النوع <string>.
يزيل ترويسة معرفة بالفعل في كائن الترويسات.
أمثلة
request.removeHeader('Content-Type');
request.setHeader(name, value)
أُضيف مع الإصدار: v1.6.0.
name
من النوع <string>.value
من أي نوع من الأنواع.
ضبط قيمة ترويسة واحدة لكائن الترويسات. إذا كانت هذه الترويسة موجودةً بالفعل في الترويسات التي ستُرسَل، فستُستبدَل قيمتها. وهي تستخدم هنا مصفوفة من السلاسل النصية لإرسال عدة ترويسات تحمل نفس الاسم. ستُتخزن القيم غير النصية بدون تعديل. لذلك، قد يُعيد request.getHeader()
قيم ليست سلسلةً نصيةً. ومع ذلك، ستُحوّل القيم غير النصية إلى سلاسل نصية كي تُنقل على الشبكة.
أمثلة
request.setHeader('Content-Type', 'application/json');
أو
request.setHeader('Set-Cookie', ['type=ninja', 'language=javascript']);
request.setNoDelay([noDelay])
أُضيفت مع الإصدار: v0.5.9.
noDelay
من النوع <boolean>.
بمجرد تعيين مأخذ توصيل لهذا الطلب ستُستدعى socket.setNoDelay()
.
request.setSocketKeepAlive([enable][, initialDelay])
أُضيفت مع الإصدار: v0.5.9.
بمجرد تعيين مقبس لهذا الطلب وهو متصل ستُستدعى الدالة socket.setKeepAlive()
.
request.setTimeout(timeout[, callback])
أُضيفت مع الإصدار: v0.5.9.
timeout
من النوع <number> وهو الوقت بالميلي ثانية قبل إنتهاء مهلة الطلب.callback
من النوع <Function> وهي دالة اختيارية تُستدعى عند انقضاء المهلة. بنفس الارتباط بحدث'timeout'
.- القيمة المُعادة:
<http.ClientRequest>
بمجرد تعيين مقبس لهذا الطلب وتوصيلها ستُستدعى الدالة socket.setTimeout()
.
request.socket
أُضيفت مع الإصدار: v0.3.0.
يُشير إلى المقبس الأساسي. عادة لا يرغب المستخدمون في الاقتراب من هذه الخاصية. على وجه الخصوص، لن يُصدر المقبس أحداث 'readable'
بسبب كيفية توصيل مُحلل البروتوكول بالمقبس. يمكن أيضًا الوصول إلى socket
من خلال request.connection
.
أمثلة
const http = require('http');
const options = {
host: 'www.google.com',
};
const req = http.get(options);
req.end();
req.once('response', (res) => {
const ip = req.socket.localAddress;
const port = req.socket.localPort;
console.log(`Your IP address is ${ip} and your source port is ${port}.`);
// استهلاك كائن الاستجابة
});
request.write(chunk[, encoding][, callback])
أُضيف مع الإصدار: v0.1.29.
chunk
من النوع <string> | <Buffer>.encoding
من النوع <string>.callback
من النوع <Function>.- القيمة المعادة: من النوع <boolean>.
إرسال قطعة من المتن. من خلال استدعاء هذه الدالة عدة مرات، يمكن إرسال متن طلب إلى خادم - في هذه الحالة، يُقترح استخدام سطر الترويسة ['Transfer-Encoding', 'chunked']
عند إنشاء الطلب.
يُعد الوسيط encoding
اختياريًا وينطبق فقط عندما يكون chunk
سلسلة نصية. وقيمته الافتراضية 'utf8'
.
كما يُعد الوسيط callback
اختياريًا ويُستدعى عند دفع جزء البيانات هذا.
وتعيد هذه الدالة true
إذا دُفِعت البيانات بالكامل بنجاح إلى المخزن المؤقت kernel. وتعيد false
إذا وضعت كل البيانات أو جزء منها في قائمة الانتظار في ذاكرة المستخدم. سوف يُطلَق الحدث 'drain'
عندما يكون المخزن المؤقت متاحًا مرة أخرى.
الصنف http.Server
أُضيف مع الإصدار: v0.1.17.
يرث هذا الصنف من net.Server ولديه الأحداث الإضافية التالية:
الحدث 'checkContinue'
أُضيف مع الإصدار: v0.3.0.
request
من النوع <http.IncomingMessage>
.response
من النوع <http.ServerResponse>
.
يُطلَق عند استقبال طلب HTTP مع Expect: 100-continue
. إذا لم يُستمع إلى هذا الحدث، فسيستجيب الخادم تلقائيًا بترويسة 100 Continue
حسب الاقتضاء.
تتضمن معالجة هذا الحدث استدعاء response.writeContinue()
إذا استمر العميل في إرسال متن الطلب أو إنشاء استجابة HTTP مناسبة (على سبيل المثال 400 Bad Request
) إذا كان العميل لا يجب أن يستمر في إرسال متن الطلب.
لاحظ أنه عند إطلاق هذا الحدث ومعالجته، لن يُطلَق حدث 'request'
.
الحدث: 'checkExpectation'
أُضيف مع الإصدار: v5.5.0.
request
من النوع <http.IncomingMessage>
.response
من النوع <http.ServerResponse>
.
يُطلَق عند استقبال طلب مع ترويسة HTTP Expect
، بحيث تكون القيمة غير 100 Continue
. إذا لم يُستمع إلى هذا الحدث، فسيستجيب الخادم تلقائيًا مع 417 Expectation Failed
حسب الاقتضاء.
لاحظ أنه عند انطلاق هذا الحدث ومعالجته، لن يُطلَق حدث 'request'
.
الحدث 'clientError'
سجل التغييرات
الإصدار | التغييرات |
---|---|
v9.4.0 | rawPacket هو المخزن المؤقت الحالي الذي يُحلَّل فقط. إضافة هذا المخزن المؤقت إلى كائن الخطأ للحدث 'clientError' يُعد بمثابة تمكين للمطورين لتسجيل الحزمة المعطلة.
|
v6.0.0 | لن يحدث الإجراء الافتراضي للاتصال بالدالة .destroy() على socket إذا كان هناك مُستمعات مرتبطة بالحدث 'clientError' .
|
v0.1.94 | أُضيفت مع الإصدار: v0.1.94 |
exception
من النوع <Error>socket
من النوع <net.Socket>
إذا أطلق اتصال العميل حدث 'error'
، فسيُعاد توجيهه هنا. ويُعد مستمع هذا الحدث هو المسؤول عن إغلاق وهدم المقبس الأساسي. على سبيل المثال، قد يرغب المرء في إغلاق المقبس بأمان مع استجابة HTTP مخصصة بدلاً من قطع الاتصال فجأة.
السلوك الافتراضي هو إغلاق المقبس باستجابة HTTP '400 Bad Request'
إن أمكن، وإلا يُهدم المقبس فورًا.
socket
هو كائن net.Socket الذي نشأ الخطأ منه.
const http = require('http');
const server = http.createServer((req, res) => {
res.end();
});
server.on('clientError', (err, socket) => {
socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
});
server.listen(8000);
عند حدوث الحدث 'clientError'
، لا يوجد كائن request
أو response
، لذلك يجب كتابة أي استجابة HTTP أُرسِلت، بما في ذلك ترويسات الاستجابة والحمولة، مباشرةً إلى كائن socket
. يجب توخي الحذر لضمان أن الاستجابة هي رسالة استجابة HTTP منسقة بشكل صحيح.
err
هو مثيل للحدث Error مع عمودين إضافيين:
bytesParsed
: عدد وحدات البايت الخاصة بحزمة الطلب التي قد يكون حللها Node.js بشكل صحيح؛rawPacket
: الحزمة الأولية للطلب الحالي.
الحدث 'close'
أُضيف مع الإصدار: v0.1.4.
يُطلَق عند إغلاق الخادم.
الحدث 'connect'
أُضيف مع الإصدار: v0.7.0.
request
من النوع <http.IncomingMessage>: وسائط لطلب HTTP، كما هو الحال في حدث'request'
.socket
من النوع <net.Socket>: مقبس الشبكة بين الخادم والعميل.head
من النوع <Buffer>: أول حزمة من الدفق النفقي (قد تكون فارغة).
يُطلَق في كل مرة يطلب فيها العميل طريقة HTTP CONNECT
. إذا لم يُستمع إلى هذا الحدث، فستُغلق اتصالات العملاء التي تطلب الطريقة CONNECT
.
بعد إطلاق هذا الحدث، لن يكون لمقبس الطلب مستمع حدث 'data'
، مما يعني أنه سيكون من الضروري الارتباط من أجل معالجة البيانات المُرسلة إلى الخادم على هذا المقبس.
الحدث 'connection'
أُضيف مع الإصدار: v0.1.0.
socket
من النوع <net.Socket>.
يُطلَق هذا الحدث عند تأسيس دفق TCP جديد. عادةً ما يكون socket
كائنًا من النوع net.Socket. عادة لا يرغب المستخدمون في استخدام هذا الحدث. على وجه الخصوص، لن يُصدر المقبس أحداث 'readable'
بسبب كيفية توصيل مُحلل البروتوكول بالمقبس. يمكن أيضا الوصول إلى socket
عند request.connection
.
يمكن أيضًا أن يُطلَق هذا الحدث صراحةً من قِبل المستخدمين لإدخال اتصالات في خادم HTTP. في هذه الحالة، يمكن تمرير أي دفق Duplex
.
الحدث 'request'
أُضيف مع الإصدار: v0.1.0.
request
من النوع <http.IncomingMessage>.response
من النوع <http.ServerResponse>.
يُطلَق عند كل طلب. لاحظ أنه قد يكون هناك عدة طلبات لكل اتصال (في حالة اتصالات HTTP Keep-Alive).
الحدث: 'upgrade'
سجل التغييرات
الإصدار | التغييرات |
---|---|
v10.0.0 | عدم الاستماع إلى هذا الحدث لم يعد يتسبب في هدم المقبس إذا أرسل عميل ترويسة ترقية Upgrade. |
v0.1.94 | أُضيفت مع الإصدار: v0.1.94 |
request
من النوع <http.IncomingMessage>: وسائط لطلب HTTP، كما هو الحال في حدث 'request'.socket
من النوع <net.Socket>: مقبس الشبكة بين الخادم والعميل.head
من النوع <Buffer>: أول حزمة من الدفق المُرقَّى (قد يكون فارغًا).
يُطلَق في كل مرة يطلب فيها العميل ترقية HTTP. يُعد الاستماع إلى هذا الحدث اختياريًا ولا يمكن للعملاء الإصرار على تغيير البروتوكول.
بعد إطلاق هذا الحدث، لن يكون لمقبس الطلب مستمع حدث 'data'
، مما يعني أنه سيكون من الضروري الارتباط من أجل معالجة البيانات المُرسلة إلى الخادم على هذا المقبس.
server.close([callback])
أُضيف مع الإصدار: v0.1.90.
callback
من النوع <Function>.
إيقاف الخادم عن قبول اتصالات جديدة. راجع net.Server.close()
.
server.listen()
بدء استماع خادم HTTP للاتصالات. هذه الدالة مماثلة للدالة server.listen()
من net.Server.
server.listening
أُضيفت مع الإصدار: v5.7.0.
- <boolean> يشير إلى ما إذا كان الخادم يستمع للاتصالات أم لا.
server.maxHeadersCount
أُضيفت مع الإصدار: v0.7.0.
- <number> القيمة الإفتراضية:
2000
.
يُحدد الحد الأقصى للترويسات الواردة. إذا ضُبِط بالقيمة 0
، فلن يُطبَّق أي حد.
server.setTimeout([msecs][, callback])
أُضيفت مع الإصدار: v0.9.12.
msecs
من النوع <number> القيمة الإفتراضية:120000
(2 دقيقة).callback
من النوع <Function>.- القيمة المُعادة: <http.Server>.
يضبط قيمة المهلة للمآخذ، ويطلق حدث 'timeout'
على كائن الخادم، ويمرر المقبس كوسيط، في حالة انتهاء المهلة.
إذا كان هناك مستمع حدث 'timeout'
على كائن الخادم، فسيُستدعى مع المقبس المنتهي مهلته. كوسيط.
بشكل افتراضي، تكون قيمة مهلة الخادم دقيقتين، وتهدم المقابس تلقائيًا عند انتهاء مهلتها. ومع ذلك، إذا عُينت دالة رد نداء لحدث 'timeout'
الخاص بالخادم، فيجب التعامل مع المُهلات بشكل صريح.
server.timeout
أُضيفت مع الإصدار: v0.9.12.
- <number> المهلة بالمللي ثانية. القيمة الإفتراضية:
120000
(2 دقيقة).
الوقت بالميلي ثانية من الخمول قبل اعتبار أن المقبس قد انتهت مهلته.
إذا كانت القيمة تساوي 0
سيتعطل سلوك المهلة مع الاتصالات الواردة.
منطق مهلة المقبس مبني على الاتصال، لذا فإن تغيير هذه القيمة يؤثر فقط على الاتصالات الجديدة بالخادم، وليس أي اتصالات موجودة.
server.keepAliveTimeout
أُضيفت مع الإصدار: v8.0.0.
- <number> المهلة بالمللي ثانية. القيمة الإفتراضية:
5000
(5 ثوان).
الوقت بالمللي ثانية من الخمول والذي يحتاجه الخادم لانتظار بيانات واردة إضافية، بعد الانتهاء من كتابة الاستجابة الأخيرة، قبل هدم المقبس. إذا تلقى الخادم بيانات جديدة قبل إطلاق مهلة keep-alive، سيُعيد تعيين مهلة الخمول المعتادة، أي server.timeout
.
إذا كانت القيمة تساوي 0
سيتعطل سلوك مهلة keep-alive مع الاتصالات الواردة. تجعل القيمة 0
الخادم http يتصرف بشكل مشابه للإصدارات Node.js قبل 8.0.0، التي لم يكن بها مهلة keep-alive.
منطق مهلة المقبس مبني على الاتصال، لذا فإن تغيير هذه القيمة يؤثر فقط على الاتصالات الجديدة بالخادم، وليس أي اتصالات موجودة.
الصنف http.ServerResponse
أُضيف مع الإصدار: v0.1.17.
يُنشأ هذا الكائن داخليًا بواسطة خادم HTTP - وليس من قبل المستخدم. ويُمرر كمعامل ثاني لحدث 'request'
.
تنفِذ الاستجابة، ولكن لا ترث من، واجهة الدفق القابل للكتابة. وهو مُطلق أحداث EventEmitter
للأحداث التالية:
الحدث 'close'
أُضيف مع الإصدار: v0.6.7.
يشير إلى إنهاء الاتصال الأساسي.
الحدث 'finish'
أُضيف مع الإصدار: v0.3.6.
يُطلَق عند إرسال الاستجابة. وبشكل أكثر تحديدًا، يُطلَق هذا الحدث عند تسليم الجزء الأخير من ترويسات الاستجابة والمتن إلى نظام التشغيل للإرسال عبر الشبكة. ولا يعني ذلك أن العميل قد تلقى أي شيء حتى الآن.
بعد هذا الحدث، لن تُرسل أي أحداث أخرى على كائن الاستجابة.
response.addTrailers(headers)
أُضيف مع الإصدار: v0.3.0.
headers
من النوع <Object>.
تضيف هذه الدالة ترويسات HTTP اللاحقة (هي ترويسات ولكن توجد في نهاية الرسالة) إلى الاستجابة.
لن تُصدَر الترويسات اللاحقة إلا إذا اُستخدِم التشفير المقسم للاستجابة؛ وإذا لم يُستُخدم (على سبيل المثال إذا كان الطلب HTTP / 1.0)، ستُتجاهل بهدوء.
لاحظ أن HTTP يتطلب إرسال ترويسة Trailer
لإصدار اللواحق، مع قائمة بحقول الترويسة في قيمتها. على سبيل المثال:
response.writeHead(200, { 'Content-Type': 'text/plain',
'Trailer': 'Content-MD5' });
response.write(fileData);
response.addTrailers({ 'Content-MD5': '7895bf4b8828b55ceaf47747b4bca667' });
response.end();
ستؤدي محاولة ضبط اسم حقل ترويسة أو قيمته والتي يحتويان على أحرف غير صالحة إلى ظهور TypeError.
response.connection
أُضيفت مع الإصدار: v0.3.0.
انظر response.socket
.
response.end([data][, encoding][, callback])
سجل التغييرات
الإصدار | التغييرات |
---|---|
v10.0.0 | يُعيد هذا التابع الآن مرجع إلى ServerResponse. |
v0.1.90 | أُضيف مع الإصدار: v0.1.90. |
encoding
من النوع <string>.callback
من النوع <Function>.- القيمة المعادة: <this>
تشير هذه الدالة إلى الخادم أن كل ترويسات الاستجابة والمتن قد أُرسِلَت؛ وأن يجب على الخادم اعتبار أن الرسالة قد اكتملت. يجب استدعاء التابع response.end()
عند كل استجابة.
إذا حُدِدت قيمة data، فإنه يعادل استدعاء التابع response.write(data, encoding)
متبوعًا بالتابع response.end(callback)
.
إذا حُدِدت دالة callback
، فستُستدعى عند انتهاء تدفق الاستجابة.
response.finished
أُضيفت مع الإصدار: v0.0.2.
قيمة منطقية تشير إلى ما إذا كانت الاستجابة قد اكتملت. تبدأ بالقيمة false
. وبعد تنفيذ response.end()
، تصبح القيمة true
.
response.getHeader(name)
أُضيفت مع الإصدار: v0.4.0.
name
من النوع <string>.- القيمة المُعادة: أي نوع من الأنواع.
تقرأ ترويسة موضوعة في قائمة الانتظار بالفعل ولكن لم تُرسَل إلى العميل. لاحظ أن الاسم غير حساس لحالة الأحرف. يعتمد نوع القيمة المُعادة على الوسائط المُمررة إلى response.setHeader()
.
أمثلة
response.setHeader('Content-Type', 'text/html');
response.setHeader('Content-Length', Buffer.byteLength(body));
response.setHeader('Set-Cookie', ['type=ninja', 'language=javascript']);
const contentType = response.getHeader('content-type');
// contentType هو 'text/html'
const contentLength = response.getHeader('Content-Length');
// contentLength من التوع number
const setCookie = response.getHeader('set-cookie');
// setCookie من النوع string[]
response.getHeaderNames()
أُضيفت مع الإصدار: v7.7.0.
- القيمة المُعادة: <string []>.
تُعيد مصفوفة تحتوي على الأسماء الفريدة للترويسات الصادرة الحالية. كل أسماء الترويسات تكتب بالأحرف الصغيرة.
أمثلة
response.setHeader('Foo', 'bar');
response.setHeader('Set-Cookie', ['foo=bar', 'bar=baz']);
const headerNames = response.getHeaderNames();
// headerNames === ['foo', 'set-cookie']
response.getHeaders()
أُضيفت مع الإصدار: v7.7.0.
- القيمة المُعادة: <Object>.
تعرض هذه الدالة نسخة ضحلة من الترويسات الصادرة الحالية. نظرًا لاستخدام نسخة ضحلة، فقد تتحور قيم المصفوفة بدون استدعاءات إضافية للعديد من دوال وحدات http ذات الصلة بالترويسة. مفاتيح الكائن المُعاد هي أسماء الترويسات والقيم هي قيم الترويسات المناظرة كل منها. كل أسماء العناوين تكتب بالأحرف الصغيرة.
لا يرث الكائن المُعاد من الدالة response.getHeaders()
بشكل نمطي من Object
الـ JavaScript. هذا يعني أن دوال Object
الموروثة عبر سلسلة prototype مثل obj.toString()
و obj.hasOwnProperty()
، وغيرها لم تُعرَّف ولن تعمل.
أمثلة
response.setHeader('Foo', 'bar');
response.setHeader('Set-Cookie', ['foo=bar', 'bar=baz']);
const headers = response.getHeaders();
// headers === { foo: 'bar', 'set-cookie': ['foo=bar', 'bar=baz'] }
response.hasHeader(name)
أُضيفت مع الإصدار: v7.7.0.
تُعيد true إذا ضُبِطت الترويسة المُعرَفة بواسطة الاسم name
حاليًا في الترويسات الصادرة. لاحظ أن مطابقة اسم الترويسة غير حساس لحالة الأحرف.
أمثلة
const hasContentType = response.hasHeader('content-type');
response.headersSent
أُضيفت مع الإصدار: v0.9.3.
قيمة منطقية (للقراءة فقط). وتكون True
إذا أُرسلت الترويسات، و False
خلاف ذلك.
response.removeHeader(name)
أُضيفت مع الإصدار: v0.4.0.
name
من النوع <string>.
إزالة ترويسة مدرجة في قائمة الانتظار للإرسال الضمني.
أمثلة
response.removeHeader('Content-Encoding');
response.sendDate
أُضيفت مع الإصدار: v0.7.5.
عندما تكون قيمتها True
، تُنشَئ ترويسة التاريخ تلقائيًا وتُرسَل في الإستجابة إذا لم يكن موجودًا بالفعل في الترويسات. قيمتها الافتراضية True
.
يجب تعطيلها فقط للاختبار. إذ يتطلب HTTP ترويسة التاريخ في الإستجابات.
response.setHeader(name, value)
أُضيفت مع الإصدار: v0.4.0.
name
من النوع <string>.value
من أي نوع من الأنواع.
ضبط قيمة الترويسات الضمنية بقيمة ترويسة واحدة. إذا كانت هذه الترويسة موجودة بالفعل في الترويسات التي ستُرسل، فستُستبدل قيمتها. وهي تستخدم هنا مصفوفة من السلاسل النصية لإرسال عدة ترويسات تحمل نفس الاسم. ستُتخزن القيم غير النصية بدون تعديل. لذلك، قد تُعيد response.getHeader()
قيم غير نصية. ومع ذلك، ستُحوّل القيم غير النصية إلى سلاسل نصية كي تُنقل على الشبكة.
أمثلة
response.setHeader('Content-Type', 'text/html');
أو
response.setHeader('Set-Cookie', ['type=ninja', 'language=javascript']);
ستؤدي محاولة ضبط اسم حقل ترويسة أو قيمته والتي يحتويان على أحرف غير صالحة إلى ظهور TypeError
.
عند ضبط الترويسات باستخدام response.setHeader()
، ستُدمج مع أي ترويسات تُمرر إلى response.writeHead()
، مع أسبقية الترويسات المُمررة إلىresponse.writeHead()
.
// إعادة content-type = text/plain
const server = http.createServer((req, res) => {
res.setHeader('Content-Type', 'text/html');
res.setHeader('X-Foo', 'bar');
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('ok');
});
response.setTimeout(msecs[, callback])
أُضيفت مع الإصدار: v0.9.12.
msecs
من النوع <number>.callback
من النوع <Function>.- القيمة المُعادة:
<http.ServerResponse>.
ضبط msecs
بقيمة مهلة المقبس. إذا توفَّرت دالة رد النداء، فسيُضاف كمستمع في الحدث 'timeout'
على كائن الاستجابة.
إذا لم يُضاف أي مستمع 'timeout'
إلى الطلب أو الاستجابة أو الخادم، فستُهدم المقابس عند إنتهاء المهلة. إذا عُيّن معالج إلى أحداث 'timeout'
الخاصة بالطلب، أو بالإستجابة أو بالخادم، يجب معالجة المقابس المنتهية مهلتها بشكل صريح.
response.socket
أُضيفت مع الإصدار: v0.3.0.
الإشارة إلى المقبس الأساسي. عادة لا يرغب المستخدمون في الاقتراب من هذه الخاصية. على وجه الخصوص، لن يُصدر المقبس أحداث 'readable'
بسبب كيفية توصيل مُحلل البروتوكول بالمقبس. بعد response.end()، تُلغى الخاصية. يمكن الوصول إلى socket
أيضًا عبر response.connection
.
أمثلة
const http = require('http');
const server = http.createServer((req, res) => {
const ip = res.socket.remoteAddress;
const port = res.socket.remotePort;
res.end(`Your IP address is ${ip} and your source port is ${port}.`);
}).listen(3000);
response.statusCode
أُضيفت مع الإصدار: v0.4.0.
عند استخدام الترويسات الضمنية (عدم استدعاء response.writeHead()
بشكل صريح)، تتحكم هذه الخاصية في رمز الحالة الذي سيُرسَل إلى العميل عند دفع الترويسات.
أمثلة
response.statusCode = 404;
بعد إرسال ترويسة الاستجابة إلى العميل، تشير هذه الخاصية إلى رمز الحالة الذي أُرسِل.
response.statusMessage
أُضيفت مع الإصدار: v0.11.8.
عند استخدام الترويسات الضمنية (عدم استدعاء response.writeHead()
بشكل صريح)، تتحكم هذه الخاصية في رسالة الحالة التي ستُرسل إلى العميل عند دفع الترويسات. إذا تُرِكت على أنها undefined
فستُستخدم الرسالة القياسية لرمز الحالة.
أمثلة
response.statusMessage = 'Not found';
بعد إرسال ترويسة الاستجابة إلى العميل، تشير هذه الخاصية إلى رسالة الحالة التي أُرسِلت.
response.write(chunk[, encoding][, callback])
أُضيفت مع الإصدار: v0.1.29.
chunk
من النوع <string> | <Buffer>.Encoding
من النوع <string>، وقيمته الإفتراضية:'utf8'
.callback
من النوع <Function>.- القيمة المعادة: <boolean>.
عند استدعاء هذه الدالة وعدم استدعاء response.writeHead()
مسبقًا، فستنتقل إلى وضع الترويسة الضمنية وتدفع الترويسات الضمنية.
يرسل هذا جزءًا من متن الاستجابة. يمكن استدعاء هذه الدالة عدة مرات للإمداد بأجزاء متتالية من المتن.
لاحظ أنه في وحدة http
، يُحذف نص الاستجابة عندما يكون الطلب هو طلب للترويسة HEAD. وبالمثل، يجب ألا تتضمن الاستجابات 204
و 304
متنَ رسالة.
يمكن أن يكون chunk سلسلة نصية أو مخزن مؤقت. إذا كان chunk
سلسلة نصية، يحدد الوسيط الثاني كيفية ترميزه في دفق ثنائي. شتُستدعى دالة callback
عند دفع جزء البيانات هذا.
وهو متن HTTP الأولي ولا علاقة له بترميزات المتن متعدد الأجزاء ذي المستوى الأعلى التي يمكن استخدامها.
عند استدعاء response.write()
لأول مرة، يُرسل معلومات ترويسة الموجودة في المخزن المؤقت والجزء الأول من المتن إلى العميل. وعند استدعاء response.write()
للمرة الثانية، يفترض Node.js تدفق البيانات وإرسال البيانات الجديدة بشكل منفصل. بمعنى، تُخزَّن الاستجابة حتى الجزء الأول من المتن.
تُعيد true
إذا دُفِعت البيانات بالكامل بنجاح إلى مخزن kernel المؤقت. وتُعيد false
إذا وضعت كل البيانات أو جزء منها في قائمة انتظار ذاكرة المستخدم. سوف يُطلق 'drain'
عندما يكون المخزن المؤقت متاحًا مرة أخرى.
response.writeContinue()
أُضيف مع الإصدار: v0.3.0.
إرسال رسالة HTTP/1.1 100 Continue
إلى العميل، مشيرا إلى أنه يجب إرسال متن الطلب. راجع حدث 'checkContinue'
على Server
.
response.writeHead(statusCode[, statusMessage][, headers])
سجل التغييرات
الإصدار | التغييرات |
---|---|
v5.11.0 و 4.4.4 | يُطرح RangeError إذا كانت statusCode ليست عددًا ضمن النطاق [100 , 999 ].
|
v0.1.30 | أُضيف مع الإصدار: v0.1.30. |
إرسال ترويسة استجابة إلى الطلب. رمز الحالة هو رمز حالة HTTP مكون من 3 أرقام، مثل 404
. الوسيط الأخير headers هو ترويسات الاستجابة. يمكن إعطاء رسالة حالة statusMessage
مقروءة كوسيط ثاني.
أمثلة
const body = 'مرحبًا أيها العالم';
response.writeHead(200, {
'Content-Length': Buffer.byteLength(body),
'Content-Type': 'text/plain' });
يجب استدعاء هذه الدالة مرة واحدة فقط في كل رسالة ويجب أن يكون ذلك قبل استدعاء response.end()
.
إذا أستُدعي أيًا من response.write()
أو response.end()
قبل استدعاء هذا التابع، فستُحسب الترويسات الضمنية أو القابلة للتغيير وتستدعي هذا التابع.
عند ضبط الترويسات باستخدام response.setHeader()
، ستُدمج مع أي ترويسات تُمرر إلى response.writeHead()
، مع أسبقية الترويسات المُمررة إلى response.writeHead()
.
// إعادة content-type = text/plain
const server = http.createServer((req, res) => {
res.setHeader('Content-Type', 'text/html');
res.setHeader('X-Foo', 'bar');
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('ok');
});
لاحظ أن طول المحتوى Content-Length مُعطى بالبايت وليس بالأحرف. فيعمل المثال أعلاه لأن السلسلة النصية 'مرحبًا أيها العالم' تحتوي على حروف مكونة من بايت واحدة فقط. إذا احتوى المتن على أحرف من ترميز أعلى، فيجب استخدام Buffer.byteLength()
لتحديد عدد وحدات البايت في ترميز معين. ولا يتحقق Node.js ما إذا كان Content-Length وطول المتن المُرسل متساويين أم لا.
ستؤدي محاولة ضبط اسم حقل ترويسة أو قيمته والتي يحتويان على أحرف غير صالحة إلى ظهور TypeError
.
response.writeProcessing()
أُضيفت مع الإصدار: v10.0.0.
يرسل رسالة HTTP / 1.1 102 Processing
إلى العميل، مُشيرةً إلى أنه يجب إرسال متن الطلب.
الصنف http.IncomingMessage
أُضيف مع الإصدار: v0.1.17.
إنشاء كائن IncomingMessage
بواسطة http.Server
أو http.ClientRequest
وتمريرها كوسيط أول لحدثي 'request'
و 'response'
على التوالي. يمكن استخدام هذا الصنف للوصول إلى حالة الاستجابة والترويسات والبيانات.
فهي تطبق واجهة Readable Stream، بالإضافة إلى الأحداث والدوال والخصائص الإضافية التالية:
الحدث 'aborted'
أُضيف مع الإصدار: v0.3.8.
يُطلَق عند إلغاء الطلب.
الحدث 'close'
أُضيف مع الإصدار: v0.4.2.
يشير إلى أن الاتصال الأساسي قد أُغلِق. تمامًا مثلما في حالة الحدث 'end'، يحدث هذا الحدث مرة واحدة فقط لكل استجابة.
message.aborted
أُضيفت مع الإصدار: v10.1.0.
ستصبح الخاصية message.aborted بالقيمة true إذا أُلغي الطلب.
message.destroy([error])
أُضيفت مع الإصدار: v0.3.0.
error
من النوع <Error>.
استدعاء الدالة destroy()
على المقبس الذي تلقى IncomingMessage
. إذا مُرِر error
، يُطلَق حدث 'error'
ويُمرر error
كوسيط لأي مستمع في الحدث.
message.headers
أُضيفت مع الإصدار: v0.1.5.
كائن ترويسات الطلب أو الاستجابة.
أزواج القيمة الرئيسية لأسماء الترويسات وقيمها. تكون أسماء الترويسات من الأحرف الصغيرة. على سبيل المثال:
// طباعة شيئًا مثل:
//
// { 'user-agent': 'curl/7.22.0',
// host: '127.0.0.1:8000',
// accept: '*/*' }
console.log(request.headers);
تُعالج التكرارات في الترويسات الأولية بالطرق التالية، اعتمادًا على اسم الترويسة:
- تُتجاهَل تكرارات كل من
age
وauthorization
وcontent-length
وcontent-type
وetag
وexpires
وfrom
وhost
وif-modified-since
وif-unmodified-since
وlast-modified
وlocation
وmax-forwards
وproxy-authorization
وreferer
وretry-after
وuser-agent
. set-cookie
هي دائما مصفوفة. ويضاف إليها هذه المكررات.- بالنسبة إلى جميع الترويسات الأخرى، تُضم القيم مع
', '
.
message.httpVersion
أُضيفت مع الإصدار: v0.1.1.
في حالة طلب الخادم، يرسل العميل رقم إصدار HTTP. في حالة استجابة العميل، يرسل إصدار HTTP الخاص بالخادم المتصل. على الأغلب إما '1.1'
أو '1.0'
.
أيضا message.httpVersionMajor
تعيد أول عدد صحيح و message.httpVersionMinor
تعيد الثاني.
message.method
أُضيفت مع الإصدار: v0.1.1.
صالحة فقط للطلب المُعاد من http.Server
.
إعادة طريقة الطلب كسلسلة نصية. يُقرأ فقط. مثال: 'GET'
و 'DELETE'
.
message.rawHeaders
أُضيفت مع الإصدار: v0.11.6.
قائمة ترويسات الطلبات والاستجابات الأولية تمامًا كما تَرِد.
لاحظ أن المفاتيح والقيم موجودة في نفس القائمة. وهي ليست قائمة من صفوف. لذا، فإن العناصر ذات الأرقام الزوجية هي قيم المفاتيح، والعناصر ذات الأرقام الفردية هي القيم المرتبطة بها.
لا تكون الترويسات مكتوبة بأحرف صغيرة ولا تُدمَج التكرارات.
// طباعة شيئًا مثل:
//
// [ 'user-agent',
// 'لا يصلح هذا لأنه لا يمكن أن يكون هناك سوى واحد',
// 'User-Agent',
// 'curl/7.22.0',
// 'Host',
// '127.0.0.1:8000',
// 'ACCEPT',
// '*/*' ]
console.log(request.rawHeaders);
message.rawTrailers
أُضيفت مع الإصدار: v0.11.6.
تحتوي مفاتيح وقيم الطلب والاستجابة الأولية المُلحقة كما ترِد تمامًا. تُرسل فقط عند الحدث 'end'
.
message.setTimeout(msecs, callback)
أُضيف مع الإصدار: v0.5.9.
msecs
من النوع <number>.callback
من النوع <Function>.- القيمة المُعادة: <http.IncomingMessage>
تستدعي الدالة message.connection.setTimeout(msecs, callback).
message.socket
أُضيفت مع الإصدار: v0.3.0.
كائن <net.Socket> المرتبط بالاتصال.
مع دعم HTTPS، تستخدم request.socket.getPeerCertificate()
للحصول على تفاصيل المصادقة الخاصة بالعميل.
message.statusCode
أُضيفت مع الإصدار: v0.1.1.
صالحة فقط للاستجابة المُعادة من http.ClientRequest
.
رمز حالة استجابة HTTP المكون من 3 أرقام. على سبيل المثال 404
.
message.statusMessage
أُضيفت مع الإصدار: v0.11.10.
صالحة فقط للاستجابة المُعادة من http.ClientRequest
.
رسالة حالة استجابة HTTP (عبارة سببية). على سبيل المثال، OK
أو Internal Server Error
.
message.trailers
أُضيفت مع الإصدار: v0.3.0.
كائن ملحقات الطلب والرد. تُرسل فقط عند الحدث 'end'
.
message.url
أُضيفت مع الإصدار: v0.1.90.
صالحة فقط للطلب المُعاد من http.Server
.
طلب سلسلة العنوان URL النصية. وتحتوي فقط على عنوان URL الموجود في طلب HTTP الفعلي. إذا كان الطلب هو:
GET /status?name=ryan HTTP/1.1\r\n
Accept: text/plain\r\n
\r\n
حينئذ يكون request.url
:
'/status?name=ryan'
تحليل عنوان url إلى أجزائه يمكن استخدام require('url').parse(request.url)
. مثال على ذلك:
$ node
> require('url').parse('/status?name=ryan')
Url {
protocol: null,
slashes: null,
auth: null,
host: null,
port: null,
hostname: null,
hash: null,
search: '?name=ryan',
query: 'name=ryan',
pathname: '/status',
path: '/status?name=ryan',
href: '/status?name=ryan' }
http.METHODS
أُضيفت مع الإصدار: v0.11.8.
قائمة بدوال HTTP المُدعومة بواسطة المحلل.
http.STATUS_CODES
أُضيفت مع الإصدار: v0.1.22.
مجموعة من جميع رموز حالة استجابة HTTP القياسية، والوصف الموجز لكل منها. على سبيل المثال، http.STATUS_CODES[404] === 'Not Found'
.
http.createServer([options][, requestListener])
سجل التغييرات
الإصدار | التغييرات |
---|---|
v9.6.0 | أصبح وسيط options مدعومًا الآن.
|
v0.1.13 | أُضيف مع الإصدار: v0.1.13. |
options
من النوع <Object>.IncomingMessage
من النوع :<http.IncomingMessage> لتحديد صنفIncomingMessage
المستخدم. مفيدة لتمديدIncomingMessage
الأصلي. القيمة الإفتراضية:IncomingMessage
.ServerResponse
من النوع <http.ServerResponse>: لتحديد صنفServerResponse
المُستخدم. مفيدة لتمديدServerResponse
الأصلي. القيمة الإفتراضية:ServerResponse
.
requestListener
من النوع <Function>- القيمة المُعادة: <http.Server>
لعرض نسخة جديدة من http.Server
.
تُعد requestListener
دالة تُضاف تلقائيًا إلى حدث 'request'
.
http.get(options[, callback])
سجل التغييرات
الإصدار | التغييرات |
---|---|
v7.5.0 | يمكن أن يكون المعامل options كائن عنوان URL WHATWG.
|
v0.3.6 | أُضيف مع الإصدار: v0.3.6. |
options
من النوع <Object> | <String> | <URL> تقبل نفسoptions
مثلhttp.request()
، مع تعيينmethod
دائمًا علىGET
. تُتجاهل الخصائص الموروثة من سلسلة prototype.callback
من النوع <Function>.- القيمة المُعادة: <http.ClientRequest>.
نظرًا لأن معظم الطلبات هي طلبات GET بدون متون، فإن Node.js يوفر هذه الدالة المناسبة. الاختلاف الوحيد بين هذه الدالة ودالة http.request()
هو أنها تضبط الدالة على GET وتستدعي req.end()
تلقائيًا. لاحظ أن دالة رد النداء يجب أن تهتم باستهلاك بيانات الاستجابة للأسباب المذكورة في قسم http.ClientRequest.
تُستدعى callback مع وسيط واحد يمثل نسخة من http.IncomingMessage
.
أمثلة عن جلب JSON:
http.get('http://nodejs.org/dist/index.json', (res) => {
const { statusCode } = res;
const contentType = res.headers['content-type'];
let error;
if (statusCode !== 200) {
error = new Error('Request Failed.\n' +
`Status Code: ${statusCode}`);
} else if (!/^application\/json/.test(contentType)) {
error = new Error('Invalid content-type.\n' +
`Expected application/json but received ${contentType}`);
}
if (error) {
console.error(error.message);
// استهلاك بيانات الاستجابة لتفريغ الذاكرة
res.resume();
return;
}
res.setEncoding('utf8');
let rawData = '';
res.on('data', (chunk) => { rawData += chunk; });
res.on('end', () => {
try {
const parsedData = JSON.parse(rawData);
console.log(parsedData);
} catch (e) {
console.error(e.message);
}
});
}).on('error', (e) => {
console.error(`Got error: ${e.message}`);
});
http.globalAgent
أُضيفت مع الإصدار: v0.5.9.
- <http.Agent>
المثيل العام للوكيل Agent
الذي يُستخدم كإعداد افتراضي لجميع طلبات عميل HTTP.
http.request(options[, callback])
سجل التغييرات
الإصدار | التغييرات |
---|---|
v7.5.0 | يمكن أن يكون معامل options عبارة عن كائن URL WHATWG.
|
v0.3.6 | أُضيف مع الإصدار: v0.3.6. |
- options من النوع <Object> | <string> | <URL>.
protocol
من النوع <string> وهو البروتوكول المراد استخدامه. القيمة الإفتراضية:'http:'
.host
من النوع <string> وهو اسم المجال أو عنوان IP الخاص بالخادم المُصدَر إليه الطلب. القيمة الإفتراضية:'localhost'
.hostname
من النوع <string> وهو اسم مستعار للمضيفhost
. لدعمurl.parse()
، يفضل استخدامhostname
علىhost
.family
من النوع <number> وهي عائلة عنوان IP لاستخدامها عند حلhost
وhostname
. القيم الممكنة هي4
أو6
. عندما يكون غير محدد، يستخدم كل من IP v4 و v6.port
من النوع <number> وهو منفذ الخادم البعيد. القيمة الإفتراضية:80
.localAddress
من النوع <string> وهو واجهة محلية لربط اتصالات الشبكة.socketPath
من النوع <string> وهو Unix Domain Socket (ويستخدمhost:port
أوsocketPath
).method
من النوع <string> وهي سلسلة نصية تحدد طريقة طلب HTTP. القيمة الإفتراضية:'GET'
.path
من النوع <string> وهو مسار الطلب. يجب تضمين سلسلة الاستعلام النصية إذا كانت موجودة. على سبيل المثال'/index.html?page=12'
. يرمى استثناء عندما يحتوي مسار الطلب على أحرف غير صالحة. حاليًا، يُرفض المسافات فقط ولكن هذا قد يتغير في المستقبل. القيمة الافتراضية:'/'
.headers
من النوع <Object> كائن يحتوي على ترويسات الطلبات.auth
من النوع <string> وهي المصادقة الأساسية بمعنى'user:password'
لحساب ترويسة المصادقة.agent
من النوع <http.Agent> | <boolean> وهو يتحكم في سلوك الوكيلAgent
. القيم المُمكنة:undefined
(القيمة الافتراضية): استخدمhttp.globalAgent
لهذا المضيف والمنفذ.- كائن
Agent
: استخدامAgent
المُمرر بشكل صريح. false
: يتسبب في استخدامAgent
جديد بقيم افتراضية.
createConnection
من النوع <Function> وهي دالة تنتج مقبس ودفق لاستخدامهما عند عدم استخدام خيارagent
. يمكن استخدام هذا لتجنب إنشاء فئةAgent
مخصص فقط لتجاوز الدالةcreateConnection
الافتراضية. راجعagent.createConnection()
لمزيد من التفاصيل. أي دفق مزدوجDuplex
هو قيمة مُعادة صالحة.timeout
من النوع <number> وهو رقم يُحدد مهلة المقبس بالمللي ثانية. سيضبط هذا الخيار المهلة قبل توصيل المقبس.setHost
من النوع <boolean> وهو يستخدم لتحديد ما إذا كانت ترويسة المضيف Host ستُضاف تلقائيًا أم لا. القيمة الافتراضيةtrue
.
callback
من النوع <Function>.- القيمة المُعادة: <http.ClientRequest>
يحافظ Node.js على عدة اتصالات لكل خادم لإجراء طلبات HTTP. تسمح هذه الدالة لإحداها بإصدار الطلبات بشفافية.
يمكن أن تكون options كائنًا أو سلسلة أو كائن URL
. إذا كانت options
سلسلة نصية، ستُحلل تلقائيًا بواسطة url.parse()
. إذا كان كائن URL، فسيتحول تلقائيًا إلى كائن options
عادي.
سيُضاف معامل callback
الاختياري كمستمع لمرة واحدة للحدث 'response'
.
وتُعيد الدالة http.request()
نسخة من الصنف http.ClientRequest
. ويُعد المثيل ClientRequest
دفقًا قابلًا للكتابة. في حالة الحاجة إلى تحميل ملف له طلب من النوع POST، يجب الكتابة إلى كائن ClientRequest
.
أمثلة
const postData = querystring.stringify({
'msg': 'مرحبًا أيها العالم!'
});
const options = {
hostname: 'www.google.com',
port: 80,
path: '/upload',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(postData)
}
};
const req = http.request(options, (res) => {
console.log(`STATUS: ${res.statusCode}`);
console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
res.setEncoding('utf8');
res.on('data', (chunk) => {
console.log(`BODY: ${chunk}`);
});
res.on('end', () => {
console.log('No more data in response.');
});
});
req.on('error', (e) => {
console.error(`problem with request: ${e.message}`);
});
// كتابة البيانات لطلب المتن
req.write(postData);
req.end();
لاحظ أنه في هذا المثال قد أُستُدعي req.end()
. يجب دائمًا استدعاء req.end()
مع http.request()
للدلالة على نهاية الطلب - حتى إذا لم تكن هناك بيانات تُكتب إلى متن الطلب.
إذا صادف حدوث أي خطأ أثناء الطلب (سواء كان ذلك أثناء حل DNS، أو أخطاء في مستوى TCP، أو أخطاء تحليل HTTP الفعلية) يُطلَق حدث 'error'
على كائن الطلب المُعاد. كما هو الحال مع جميع أحداث 'error'، إذا لم تُسجَّل أي مستمعات، فسيُطرح الخطأ.
هناك بعض الترويسات الخاصة التي يجب ملاحظتها.
- سيؤدي إرسال 'Connection: keep-alive' إلى إخطار Node.js بأن الاتصال بالخادم يجب أن يستمر حتى الطلب التالي.
- سيؤدي إرسال ترويسة 'Content-Length' إلى تعطيل الترميز الافتراضي المُجزَّأ.
- سيؤدي إرسال ترويسة 'Expect' إلى إرسال ترويسات الطلبات على الفور. عادة، عند إرسال
'Expect: 100-continue'
، يجب ضبط كل من المهلة ومستمع للحدث'continue'
. لمزيد من المعلومات، راجع RFC2616 القسم 8.2.3. - سيؤدي إرسال ترويسة المُصادقة إلى إلغاء استخدام خيار
auth
لحساب المصادقة الأساسية.
مثال باستخدام URL
كخيار options:
const options = new URL('http://abc:xyz@example.com');
const req = http.request(options, (res) => {
// ...
});
في طلب ناجح، ستُرسل الأحداث التالية بالترتيب التالي:
'socket'
'response'
'data'
أي عدد من المرات، على كائنres
(لن يُطلَق الحدث'data'
على الإطلاق إذا كان متن الاستجابة فارغًا، على سبيل المثال، في معظم عمليات إعادة التوجيه).'end'
على كائنres
'close'
في حالة حدوث خطأ في الاتصال، ستُطلق الأحداث التالية:
'socket'
'error'
'close'
إذا أستُدعيت الدالة req.abort()
قبل نجاح الاتصال، فستُطلق الأحداث التالية بالترتيب التالي:
'socket'
- (تُستدعى الدالة
req.abort()
هنا) 'abort'
'close'
'error'
مع الخطأ مع رسالة'Error: socket hang up'
ورمز'ECONNRESET'
إذا أستُدعيت الدالة req.abort()
بعد تلقي الاستجابة، فستُطلق الأحداث التالية بالترتيب التالي:
'socket'
'response'
'data'
أي عدد من المرات، على كائن res.
- (تُستدعى
req.abort()
هنا) 'abort'
'close'
'aborted'
على كائنres
'end'
على كائنres
'close'
على كائنres
لاحظ أن ضبط خيار timeout
أو استخدام الدالة setTimeout()
لن يؤدي إلى إلغاء الطلب أو القيام بأي شيء بجانب إضافة حدث 'timeout'
.
مصادر
صفحةHTTP في توثيق Node.js الرسمي.