4 روش برای ساخت درخواست HTTP در Node.js

ترجمه و تالیف : امیررضا سیستانه ای
تاریخ انتشار : 13 خرداد 98
خواندن در 2 دقیقه
دسته بندی ها : جاوا اسکریپت

ساخت درخواست های HTTP یک عملیات اصلی برای زبان های مدرن بوده و یکی از چیزهاییست که توسعه دهندگان هنگام ورود به محیط های جدید یاد می گیرند. وقتی این عملیات به Node.js آمد تعداد کمی راه برای انجام این کار وجود داشت و هنوز توسط زبان و جامعه توسعه دهنده گسترش پیدا نکرده بود. بیایید درمورد برخی از محبوب ترین این روش ها صحبت کنیم.

ما از API تصاویر روز ناسا بعنوان JSON API استفاده میکنیم, علت استفاده از این api اینه که فضا همیشه چیز جالبی برای همه بوده و ما میخواهیم آموزش جالب تر بشه.

قبل از اینکه کار رو شروع کنیم مطمئن بشید که ورژن Node.js و npm که نصب کردید, آپدیت شده باشه و آخرین نسخه رو دارید.

HTTP - کتابخانه استاندارد

اولین گزینه ی ما ماژول HTTP در کتابخانه استاندارد هست. با این ماژول شما نیازی به نصب وابستگی های خارجی ندارید. نکته منفی اینه که این ماژول نسبت به بقیه راه ها کمتر user friendly هست. 

کد زیر یک درخواست GET به NASA API میفرسته و آدرس URL تصویر روز ناسا رو در خروجی میده :

const https = require('https');

https.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY', (resp) => {
 let data = '';

 // A chunk of data has been recieved.
 resp.on('data', (chunk) => {
  data += chunk;
 });

 // The whole response has been received. Print out the result.
 resp.on('end', () => {
  console.log(JSON.parse(data).explanation);
 });

}).on("error", (err) => {
 console.log("Error: " + err.message);
});

بیشتر از HTTP و HTTPS, عملکرد ماژول سطح پایین هست. شما باید اطلاعات دریافتی رو در chunks دریافت کنید بجای اینکه یک تابع callback ارائه بده که هروقت اطلاعات دریافت شد, تابع اجرا بشه. شما همچنین باید اطلاعات رو بصورت دستی parse (تبدیل) کنید. خروجی اگر بصورت فرمت JSON باشه چیز عجیبی نیست اما خب این تبدیلات هم یه قدم اضافست که باید بردارید.

مشکل دیگه اینه که این ماژول بصورت پیشفرض از HTTPS پشتیبانی نمیکنه. پس اگر API مورد نظر از HTTPS استفاده میکنه ما باید https رو هم require کنیم.

Request

Request یک کلاینت HTTP ساده شده و قابل مقایسه با کتابخانه ی requests در پایتون هست. این کتابخانه کاربر پسندتر از ماژول http هست و برای سال ها جزء محبوب ترین های جامعه توسعه دهندگان بوده.

از وقتی من با Node.js کار کردم, این انتخاب شخصی من بوده. همچنین یکی از بهترین گزینه ها برای شروع سریع پروژه هست. برخلاف ماژول http شما باید این ماژول رو بعنوان یک وابستگی توسط npm نصب کنید.

برای نصبش دستور زیر رو در ترمینال وارد کنید :

npm install request@2.81.0

همینطور که مشاهده می کنید کدهای کمتری برای انجام وظایف بالا نیاز دارید :

const request = require('request');

request('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY', { json: true }, (err, res, body) => {
  if (err) { return console.log(err); }
  console.log(body.url);
  console.log(body.explanation);
});

اگر شما فقط یک کتابخانه ساده برای استفاده بخواهید که با درخواست های HTTP بصورت مناسب رفتار کنه, Request یک انتخاب عالیه. اگر شما میخواهید از Promise ها استفاده کنید کتابخانه ی request-promise رو چک کنید.

Axios

Axios یک کلاینت HTTP براساس Promise هاست که برای مرورگرها هم بخوبی node.js کار میکنه. وقتی کدهاتون با زنجیره ای از رویدادها درحال دست و پنجه نرم کردنه, استفاده از Promise ها یک پیشرفت بسیار خوبیه. نوشتن کد بصورت asynchronous میتونه گیج کننده باشه و Promise ها یکی از بهترین راه حل ها برای این مشکل هستند. 

برای نصب این ماژول از طریق npm :

npm install axios@0.16.2

کدهای زیر همان وظایفی که بالا بهش اشاره کردیم یعنی خروجی آدرس URL تصویر روز ناسا رو اینبار با Anxios انجام میده :

axios.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY')
 .then(response => {
  console.log(response.data.url);
  console.log(response.data.explanation);
 })
 .catch(error => {
  console.log(error);
 });

همچنینAnxios بصورت پیشفرض کار تبدیل خروجی JSON رو انجام میده.

و شما میتونید چند درخواست بصورت همزمان با استفاده از axios.all انجام بدید. مثلا اگر بخواهید تصویر دو روز مختلف از سرویس ناسا رو دریافت کنید :

var axios = require('axios');

axios.all([
 axios.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY&date=2017-08-03'),
 axios.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY&date=2017-08-02')
]).then(axios.spread((response1, response2) => {
 console.log(response1.data.url);
 console.log(response2.data.url);
})).catch(error => {
 console.log(error);
});

SuperAgent

شبیه Axios, کتابخانه ی SuperAgent هم یکی از محبوب ترین ها برای ساخت درخواست Ajax در مرورگرهاست اما در Node.js هم بخوبی کار میکنه. 

برای نصب SuperAgent از دستور زیر استفاده کنید :

npm install superagent@3.5.2

نکته جالب درمورد SuperAgent اینه که شما از سایر توابع مفید رو میتونید استفاده کنید. مثلا از ()query برای افزودن پارامترها به درخواست استفاده کنید. ما در مثال های قبل بصورت دستی اون ها رو به url اضافه کردیم. اما ببینید که SuperAgent چطور کار رو ساده میکنه :

const superagent = require('superagent');

superagent.get('https://api.nasa.gov/planetary/apod')
.query({ api_key: 'DEMO_KEY', date: '2017-08-02' })
.end((err, res) => {
 if (err) { return console.log(err); }
 console.log(res.body.url);
 console.log(res.body.explanation);
});

منبع

دیدگاه‌ها و پرسش‌ها

برای ارسال نظر لازم است ابتدا وارد سایت شوید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید