Request ma’lumotnomasi


ULASHISH

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 yaratilgan
  • http.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

  1. Xatolik bilan ishlov berish: HTTP so‘rovlariga har doim xato hodisalari ishlov beruvchisini biriktiring.
  2. Javob ma’lumotlarini iste’mol qilish: Xotira oqishini oldini olish uchun har doim javob ma’lumotlarini, hatto kerak bo‘lmasa ham iste’mol qiling.
  3. Taym-autlarni o‘rnating: So‘rovlar osilib qolmasligi uchun tegishli taym-autlarni o‘rnating.
  4. Kontent-uzunligi: Ma’lumotlar to‘g‘ri yuborilganligiga ishonch hosil qilish uchun har doim POST/PUT so‘rovlari uchun Kontent uzunligini belgilang.
  5. So‘rovni tugatish: So‘rovni yuborishni tugatish uchun har doim request.end() metodini chaqiring.
  6. Qayta yo‘naltirishni boshqarish: Shuni yodda tutingki, Node.js avtomatik ravishda yo‘naltirishlarga amal qilmaydi – ularni boshqarishingiz kerak.
  7. Ulanishlarni qayta ishlatish: Bir serverga bir nechta so‘rovlar uchun keepAlive bilan maxsus agentdan foydalaning.

W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!