Request ma’lumotnomasi
HTTP so‘rovi obyekti
HTTP so‘rovi obyekti Node.js tomonidan ichki yaratiladi va HTTP so‘rovlarini amalga oshirishda so‘rov hodisasini callback funksiyasi qilish uchun birinchi parametr sifatida o‘tkaziladi. U HTTP serverlari bilan foydalanilganda mijozdan kiruvchi xabarni yoki HTTP mijozlari bilan foydalanilganda chiquvchi xabarni ifodalaydi.
Node.js da Request obyektlarining ikkita asosiy turi mavjud:
http.ClientRequest- chiquvchi HTTP so‘rovlarini yuborishda yaratilganhttp.IncomingMessage- Mijoz so‘rovlarini ko‘rib chiqishda server tomonidan qabul qilinadi
ClientRequest obyekti
http.ClientRequest obyekti http.request() yoki http.get() chaqirilganda yaratilgan Writable Stream misolidir. Bu serverga yuboriladigan chiquvchi HTTP so‘rovini ifodalaydi.
ClientRequest yaratish
const http = require('http');
// Create a client request
const req = http.request({
hostname: 'example.com',
port: 80,
path: '/',
method: 'GET'
}, (res) => {
// Handle response (IncomingMessage)
console.log(`Status: ${res.statusCode}`);
});
// End the request
req.end();
Misolni ishga tushirish »
ClientRequest xususiyatlari
| Xususiyat | Tavsif |
|---|---|
| request.aborted | So‘rov bekor qilingan (aborted) yoki yo‘qligini ko‘rsatuvchi boolean qiymat. |
| request.connection | Asosiy soketga havola. |
| request.socket | Pastki soketga havola. request.connection taxalluslari. |
| request.finished | So‘rov ma’lumot yuborishni yakunlagan yoki yo‘qligini ko‘rsatuvchi boolean qiymat. |
| request.path | So‘rov yo‘li (path). |
| request.method | So‘rov metodi (GET, POST va h.k.). |
| request.host | So‘rov hosti. |
ClientRequest usullari
| Metod | Tavsif |
|---|---|
| request.abort() | So‘rovni bekor qilingan deb belgilaydi. |
| request.destroy([error]) | So‘rovni yo‘q qiladi. Ixtiyoriy ravishda uzatilgan xatoni chiqaradi (emit). |
| request.end([data[, encoding]][, callback]) | So‘rovni yuborishni tugatadi. Agar tananing biron bir qismi yuborilmagan bo‘lsa, u ularni oqimga olib boradi. |
| request.flushHeaders() | So‘rov sarlavhalarini (headers) darhol yuboradi (flush). |
| request.getHeader(name) | Allaqachon navbatga qo‘yilgan, lekin yuborilmagan sarlavha qiymatini oladi. |
| request.removeHeader(name) | Yuborish uchun navbatda turgan sarlavhani olib tashlaydi. |
| request.setHeader(name, value) | Sarlavhalar obyekti uchun bitta sarlavha qiymatini o‘rnatadi. |
| request.setNoDelay([noDelay]) | Soketning noDelay parametrini o‘rnatadi. |
| request.setSocketKeepAlive([enable][, initialDelay]) | Soketning keepAlive parametrini o‘rnatadi. |
| request.setTimeout(timeout[, callback]) | So‘rov uchun kutish vaqti qiymatini o‘rnatadi. |
| request.write(chunk[, encoding][, callback]) | So‘rov tanasining (body) bir qismini (chunk) yuboradi. |
ClientRequest voqealari
| Event | Tavsif |
|---|---|
| 'abort' | So‘rov bekor qilinganda chiqariladi. |
| 'connect' | Server so‘rovga CONNECT usuli bilan javob berganida chiqariladi. |
| 'continue' | Server '100 Continue' HTTP javobini yuborganda ishga tushadi. |
| 'information' | Server 1xx javobini yuborganda ishga tushadi (101 Upgrade bundan mustasno). |
| 'response' | Ushbu so‘rovga javob olinganda chiqariladi. Bu hodisa faqat bir marta chiqariladi. |
| 'socket' | Ushbu so‘rovga soket tayinlanganda chiqariladi. |
| 'timeout' | So‘rov vaqti tugaganda (timeout) ishga tushadi. |
| 'upgrade' | Server yangilanish bilan javob berganda chiqariladi. |
| 'close' | So‘rov yopilganda chiqariladi. |
| 'error' | Xato yuz berganda ishga tushadi. |
IncomingMessage obyekti
http.IncomingMessage obyekti HTTP serveri tomonidan yaratilgan va "so‘rov" hodisasiga birinchi argument sifatida uzatiladi. Bu kiruvchi xabarni ifodalaydi, odatda mijoz so‘rovi yoki serverdan javob.
Serverda IncomingMessage-ga kirish
const http = require('http');
// Create HTTP server
const server = http.createServer((req, res) => {
// 'req' is an IncomingMessage object
console.log(`Received ${req.method} request for ${req.url}`);
res.end('Hello World');
});
server.listen(8080);
Misolni ishga tushirish »
IncomingMessage xususiyatlari
| Xususiyat | Tavsif |
|---|---|
| message.headers | So‘rov/javob sarlavhalari obyekti. |
| message.httpVersion | Mijoz tomonidan yuborilgan HTTP versiyasi (masalan, '1.1', '1.0'). |
| message.method | String ko‘rinishidagi so‘rov metodi (faqat so‘rov obyektlari uchun). |
| message.rawHeaders | Xom so‘rov/javob sarlavhalari aynan qanday qabul qilingan bo‘lsa, shunday ro‘yxatlanadi. |
| message.rawTrailers | Xom so‘rov/javob treyleri kalitlari va ular qabul qilingan kabi qiymatlar. |
| message.socket | Ulanish bilan bog‘langan net.Socket obyekti. |
| message.statusCode | HTTP javob holat kodi (faqat javob obyektlari uchun). |
| message.statusMessage | HTTP javob holat xabari (faqat javob obyektlari uchun). |
| message.trailers | So‘rov/javobning trailer sarlavhalari obyekti. |
| message.url | So‘rov URL stringi (faqat so‘rov obyektlari uchun). |
Kiruvchi xabar usullari
| Metod | Tavsif |
|---|---|
| message.destroy([error]) | Xabarni yo‘q qiladi. Ixtiyoriy ravishda uzatilgan xatoni chiqaradi (emit). |
| message.setTimeout(msecs, callback) | Soketning kutish vaqti qiymatini o‘rnatadi. |
GET so‘rovining asosiy namunasi
GET so‘rovini yuborish uchun http.get() dan foydalanishning asosiy misoli:
const http = require('http');
// Make a simple GET request
http.get('http://example.com', (res) => {
const { statusCode } = res;
const contentType = res.headers['content-type'];
console.log(`Status Code: ${statusCode}`);
console.log(`Content-Type: ${contentType}`);
let error;
if (statusCode !== 200) {
error = new Error(`Request Failed. Status Code: ${statusCode}`);
} else if (!/^text\/html/.test(contentType)) {
error = new Error(`Invalid content-type. Expected text/html but received ${contentType}`);
}
if (error) {
console.error(error.message);
// Consume response data to free up memory
res.resume();
return;
}
res.setEncoding('utf8');
let rawData = '';
// Collect response data as it arrives
res.on('data', (chunk) => { rawData += chunk; });
// Process the complete response
res.on('end', () => {
try {
console.log(`Response length: ${rawData.length} characters`);
console.log('First 100 characters:');
console.log(rawData.substring(0, 100) + '...');
} catch (e) {
console.error(e.message);
}
});
}).on('error', (e) => {
console.error(`Got error: ${e.message}`);
});
Misolni ishga tushirish »
POST so‘roviga misol
Ma’lumotlar bilan POST so‘rovini yaratish:
const http = require('http');
// Data to send in the POST request
const postData = JSON.stringify({
'name': 'John Doe',
'email': 'john@example.com',
'message': 'Hello from Node.js HTTP client!'
});
// Request options
const options = {
hostname: 'postman-echo.com',
port: 80,
path: '/post',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(postData)
}
};
// Create the request
const req = http.request(options, (res) => {
console.log(`STATUS: ${res.statusCode}`);
console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
res.setEncoding('utf8');
let responseData = '';
res.on('data', (chunk) => {
responseData += chunk;
});
res.on('end', () => {
console.log('Response body:');
try {
// Try to parse as JSON
const parsedData = JSON.parse(responseData);
console.log(JSON.stringify(parsedData, null, 2));
} catch (e) {
// If not JSON, show as text
console.log(responseData);
}
});
});
req.on('error', (e) => {
console.error(`Problem with request: ${e.message}`);
});
// Write data to request body
req.write(postData);
// End the request
req.end();
Misolni ishga tushirish »
So‘rov sarlavhalarini qayta ishlash
So‘rov sarlavhalari bilan ishlash:
const http = require('http');
// Create a server to demonstrate request headers
const server = http.createServer((req, res) => {
// Display request information
console.log(`Request received: ${req.method} ${req.url}`);
console.log(`HTTP Version: ${req.httpVersion}`);
// Display standard headers
console.log('\nStandard Headers:');
const stdHeaders = ['host', 'user-agent', 'accept', 'accept-language', 'content-type', 'content-length'];
stdHeaders.forEach(header => {
if (req.headers[header]) {
console.log(`${header}: ${req.headers[header]}`);
}
});
// Display raw headers (name-value pairs)
console.log('\nRaw Headers:');
for (let i = 0; i < req.rawHeaders.length; i += 2) {
console.log(`${req.rawHeaders[i]}: ${req.rawHeaders[i+1]}`);
}
// Create response
res.writeHead(200, {'Content-Type': 'text/html'});
// Send response with headers information
res.end(`
<!DOCTYPE html>
<html>
<head>
<title>Request Headers</title>
</head>
<body>
<h1>Your Request Headers</h1>
<pre>${JSON.stringify(req.headers, null, 2)}</pre>
</body>
</html>
`);
});
// Start server
const PORT = 8080;
server.listen(PORT, () => {
console.log(`Server running at http://localhost:${PORT}/`);
// Make a request to demonstrate headers
const req = http.request({
hostname: 'localhost',
port: PORT,
path: '/headers-demo',
method: 'GET',
headers: {
'User-Agent': 'Node.js HTTP Client',
'X-Custom-Header': 'Custom Value',
'Accept': 'text/html,application/json'
}
}, (res) => {
res.resume(); // Consume response data
});
req.on('error', (e) => {
console.error(`Demo request error: ${e.message}`);
});
req.end();
});
Misolni ishga tushirish »
Fayl yuklash misoli
Faylni yuklash uchun so‘rovdan foydalanish:
const http = require('http');
const fs = require('fs');
const path = require('path');
// Create a sample file for upload
const sampleFile = path.join(__dirname, 'upload-sample.txt');
fs.writeFileSync(sampleFile, 'This is a sample file for upload demonstration.\n'.repeat(10));
// Function to create multipart form-data boundary and body
function createMultipartFormData(fields, files) {
const boundary = `----NodeJSUploadExample${Math.random().toString(16).substr(2)}`;
let body = '';
// Add regular fields
Object.keys(fields).forEach(field => {
body += `--${boundary}\r\n`;
body += `Content-Disposition: form-data; name="${field}"\r\n\r\n`;
body += `${fields[field]}\r\n`;
});
// Add files
Object.keys(files).forEach(fileField => {
const filePath = files[fileField];
const filename = path.basename(filePath);
const fileContent = fs.readFileSync(filePath);
body += `--${boundary}\r\n`;
body += `Content-Disposition: form-data; name="${fileField}"; filename="${filename}"\r\n`;
body += `Content-Type: application/octet-stream\r\n\r\n`;
body += fileContent.toString() + '\r\n';
});
// Add final boundary
body += `--${boundary}--\r\n`;
return {
boundary,
body
};
}
// Prepare form data
const formData = createMultipartFormData(
{
name: 'Node.js Upload Example',
description: 'Uploading a file using HTTP client request'
},
{
file: sampleFile
}
);
// Request options
const options = {
hostname: 'httpbin.org',
port: 80,
path: '/post',
method: 'POST',
headers: {
'Content-Type': `multipart/form-data; boundary=${formData.boundary}`,
'Content-Length': Buffer.byteLength(formData.body)
}
};
// Create the request
const req = http.request(options, (res) => {
console.log(`Upload Status: ${res.statusCode}`);
let responseData = '';
res.setEncoding('utf8');
res.on('data', (chunk) => {
responseData += chunk;
});
res.on('end', () => {
console.log('Upload Response:');
try {
const response = JSON.stringify(JSON.parse(responseData), null, 2);
console.log(response);
} catch (e) {
console.log(responseData);
}
// Clean up sample file
fs.unlinkSync(sampleFile);
console.log('Sample file removed');
});
});
req.on('error', (e) => {
console.error(`Upload error: ${e.message}`);
});
// Send the form data
req.write(formData.body);
req.end();
console.log('Uploading file...');
Misolni ishga tushirish »
So‘rovni ko‘rib chiqish muddati
So‘rov taym-autlarini o‘rnatish va qayta ishlash:
const http = require('http');
// Create a request with timeout
const req = http.request({
hostname: 'example.com',
port: 80,
path: '/',
method: 'GET',
timeout: 8080 // 3 second timeout
}, (res) => {
console.log(`STATUS: ${res.statusCode}`);
res.resume(); // Consume response data
});
// Handle timeout event
req.on('timeout', () => {
console.log('Request timed out after 3 seconds');
req.abort(); // Abort the request
});
// Handle errors, including those caused by abort()
req.on('error', (err) => {
console.error(`Request error: ${err.message}`);
});
// End the request
req.end();
Misolni ishga tushirish »
Eng yaxshi amaliyotlar
- Xatolik bilan ishlov berish: HTTP so‘rovlariga har doim xato hodisalari ishlov beruvchisini biriktiring.
- Javob ma’lumotlarini iste’mol qilish: Xotira oqishini oldini olish uchun har doim javob ma’lumotlarini, hatto kerak bo‘lmasa ham iste’mol qiling.
- Taym-autlarni o‘rnating: So‘rovlar osilib qolmasligi uchun tegishli taym-autlarni o‘rnating.
- Kontent-uzunligi: Ma’lumotlar to‘g‘ri yuborilganligiga ishonch hosil qilish uchun har doim POST/PUT so‘rovlari uchun Kontent uzunligini belgilang.
- So‘rovni tugatish: So‘rovni yuborishni tugatish uchun har doim
request.end()metodini chaqiring. - Qayta yo‘naltirishni boshqarish: Shuni yodda tutingki, Node.js avtomatik ravishda yo‘naltirishlarga amal qilmaydi – ularni boshqarishingiz kerak.
- Ulanishlarni qayta ishlatish: Bir serverga bir nechta so‘rovlar uchun keepAlive bilan maxsus agentdan foydalaning.
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
