از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
ماژول درخواست Node.js این روزها برنامه های کاربردی وب ما تمایل به ادغام زیادی با سرویس های دیگر دارند، خواه در تعامل با یک سرویس REST مانند توییتر یا دانلود تصاویر از فلیکر باشد. استفاده از Node/JavaScript یکی از محبوبترین زبانها برای مدیریت برنامههای کاربردی مانند این است. در هر صورت، شما در حال ساختن …
سرفصلهای مطلب
این روزها برنامه های کاربردی وب ما تمایل به ادغام زیادی با سایر سرویس ها دارند، چه در تعامل با یک سرویس REST مانند توییتر یا دانلود تصاویر از Flickr. استفاده از Node/JavaScript یکی از محبوبترین زبانها برای مدیریت برنامههای کاربردی مانند این است. در هر صورت، شما درخواستهای HTTP زیادی خواهید داشت، به این معنی که به یک ماژول جامد نیاز دارید تا نوشتن کد را بسیار قابل تحملتر کنید.
این درخواست ماژول تا حد زیادی محبوب ترین (غیر استاندارد) بسته Node برای ایجاد درخواست های HTTP است. در واقع، این در واقع فقط یک بسته بندی در اطراف Node است http ماژول، بنابراین شما می توانید به همه عملکردهای یکسان دست پیدا کنید روی خودت با http
، ولی request
فقط آن را بسیار ساده تر می کند.
ایجاد درخواست های HTTP
در حالی که چندین گزینه در دسترس شما وجود دارد request
(بسیاری از آنها را در طول این مقاله پوشش خواهیم داد)، استفاده از آن نیز می تواند بسیار ساده باشد. مثال “سلام جهان” برای این کتابخانه به آسانی ارسال یک URL و یک پاسخ تماس است:
const request = require('request');
request('http://rasanegar.com', function(err, res, body) {
console.log(body);
});
کد بالا یک درخواست HTTP GET را به rasanegar.com ارسال می کند و سپس HTML برگشتی را روی صفحه چاپ می کند. این نوع درخواست برای هر نقطه پایانی HTTP کار می کند، چه HTML، JSON، یک تصویر یا تقریباً هر چیز دیگری را برگرداند.
اولین استدلال به request
می تواند یک رشته URL یا یک شی از گزینه ها باشد. در اینجا برخی از گزینههای رایجتری که در برنامههای خود با آنها مواجه میشوید آمده است:
url
: URL مقصد درخواست HTTPmethod
: روش HTTP مورد استفاده (GET، POST، DELETE و غیره)headers
: یک شی از هدرهای HTTP (کلید-مقدار) که باید در درخواست تنظیم شودform
: یک شی حاوی داده های فرم کلید-مقدار
const request = require('request');
const options = {
url: 'https://www.reddit.com/r/funny.json',
method: 'GET',
headers: {
'Accept': 'application/json',
'Accept-Charset': 'utf-8',
'User-Agent': 'my-reddit-client'
}
};
request(options, function(err, res, body) {
let json = JSON.parse(body);
console.log(json);
});
با استفاده از options
شی، این درخواست از متد GET برای بازیابی داده های JSON به طور مستقیم از Reddit استفاده می کند که به صورت رشته ای در body
رشته. از اینجا می توانید استفاده کنید JSON.parse
و از داده ها به عنوان یک شیء معمولی جاوا اسکریپت استفاده کنید.
همین فرمت درخواست را می توان برای هر مورد استفاده کرد نوع روش HTTP، خواه DELETE، PUT، POST یا OPTION باشد. اگرچه، همه روش ها دقیقاً یکسان استفاده نمی شوند. برخی، مانند روش POST، می توانند داده ها را در درخواست قرار دهند. چند راه برای ارسال این داده ها وجود دارد که برخی از آنها عبارتند از:
body
: آBuffer
،String
، یاStream
شی (می تواند یک شی باشد اگرjson
گزینه تنظیم شده استtrue
)form
: یک شی از داده های جفت کلید-مقدار (ما بعداً به آن خواهیم پرداخت)multipart
: آرایه ای از اشیاء که می توانند شامل سرصفحه ها و ویژگی های بدنه خود باشند
هرکدام نیاز متفاوتی را برآورده میکنند (و راههای بیشتری برای ارسال دادهها وجود دارد که میتوانید در آنها پیدا کنید این بخش از درخواست README است). این request
ماژول حاوی روشهای راحتی است که کار با آنها را کمی آسانتر میکند، بنابراین حتماً اسناد کامل را بخوانید تا از سختتر کردن کدتان جلوگیری کنید.
در مورد روش های کمکی، روش بسیار مختصرتر برای فراخوانی روش های مختلف HTTP استفاده از روش های کمکی مربوطه ارائه شده است. در اینجا چند مورد از پرکاربردترین آنها آورده شده است:
request.get(options, callback)
request.post(options, callback)
request.head(options, callback)
request.delete(options, callback)
در حالی که این باعث صرفه جویی در تعداد زیادی از خطوط کد نمی شود، حداقل درک کد شما را کمی آسان تر می کند و به شما امکان می دهد فقط به روش فراخوانی نگاه کنید و نیازی به تجزیه همه گزینه های مختلف برای پیدا کردن نداشته باشید. آی تی.
تشکیل می دهد
چه با یک REST API رابط داشته باشید یا یک ربات برای خزیدن و ارسال داده ایجاد کنید روی وبسایتها، در برخی مواقع باید دادههایی را برای یک فرم ارسال کنید. مثل همیشه با request
، بسته به روش های مختلفی می توان این کار را انجام داد روی نیازهای شما.
برای فرم های معمولی (URL-encoded، با a MIME نوعی از application/x-www-form-urlencoded
، بهتر است از آن استفاده کنید .post()
روش راحتی با شی فرم:
let options = {
url: 'http://http://mockbin.com/request',
form: {
email: '(email protected)',
password: 'myPassword'
}
};
request.post(options, callback);
این کار داده ها را درست مانند یک فرم HTML آپلود می کند، تنها محدودیت آن این است که نمی توانید فایل ها را از این طریق آپلود کنید. برای انجام این کار، باید از آن استفاده کنید formData
در عوض گزینه ای که از فرم-داده کتابخانه زیر
استفاده کردن formData
در عوض، اکنون می توانیم داده های فایل را از طریق به سرور ارسال کنیم Buffer
اس، Stream
s یا حتی داده های غیر فایلی (مانند قبل) با جفت های کلید-مقدار ساده.
let formData = {
// Pass single file with a key
profile_pic: fs.createReadStream(__dirname + '/me.jpg'),
// Pass multiple files in an array
attachments: (
fs.readFileSync(__dirname + '/cover-letter.docx'), // Buffer
fs.createReadStream(__dirname + '/resume.docx'), // Stream
),
// Pass extra meta-data with your files
detailed_file: {
value: fs.createReadStream(__dirname + '/my-special-file.txt'),
options: {
filename: 'data.json',
contentType: 'application/json'
}
},
// Simple key-value pairs
username: 'ScottWRobinson'
};
request.post('http://http://mockbin.com/request', {formData: formData}, callback);
با این کار فایل های شما با نوع MIME ارسال می شود multipart/form-data
، که یک فرم آپلود چند قسمتی است.
در حالی که این برای موارد استفاده اکثر کاربران بیش از حد کافی خواهد بود، مواقعی وجود دارد که شما نیاز به کنترل دقیق تری دارید، مانند CLRF های قبل/پس از (خطوط جدید)، تکه تکه کردن، یا مشخص کردن چند قسمت خود. برای اطلاعات بیشتر روی این گزینه های اضافی را بررسی کنید این بخش از request
README.
جریان ها
یکی از کم استفاده ترین ویژگی هایی که در بسیاری از زبان های برنامه نویسی استفاده نمی شود، به نظر من، جریان ها هستند. سودمندی آنها فراتر از درخواست های شبکه است، اما این به عنوان یک مثال عالی برای اینکه چرا باید از آنها استفاده کنید عمل می کند. برای توضیح کوتاه روی چگونه و چرا باید از آنها استفاده کنید، بخش “Streams” در مقاله Node HTTP Servers for Static File Serving را بررسی کنید.
به طور خلاصه، استفاده از جریانها برای حجم زیاد داده (مانند فایلها) میتواند به کاهش ردپای حافظه و زمان پاسخگویی برنامه شما کمک کند. برای سهولت استفاده از این، هر یک از request
روش ها می توانند pipe
خروجی آنها به یک جریان دیگر
در این مثال، ما لوگوی Node.js را با استفاده از یک درخواست GET دانلود کرده و آن را به یک فایل محلی پخش می کنیم:
let fileStream = fs.createWriteStream('node.png');
request('https://nodejs.org/static/images/logos/nodejs-new-white-pantone.png').pipe(fileStream);
به محض اینکه درخواست HTTP شروع به بازگرداندن بخشهایی از تصویر دانلود شده کند، آن دادهها را مستقیماً به فایل منتقل میکند. node.png
.
دانلود فایل از این طریق مزایای دیگری نیز دارد. استریم ها برای اعمال تبدیل ها عالی هستند روی داده ها همانطور که دانلود می شود. بنابراین، برای مثال، فرض کنید حجم زیادی از داده های حساس را با آن دانلود می کنید request
که باید فورا رمزگذاری شود. برای انجام این کار، می توانید یک تبدیل رمزگذاری را با لوله گذاری خروجی اعمال کنید request
به crypto.createCipher:
let url = 'http://example.com/super-sensitive-data.json';
let pwd = new Buffer('myPassword');
let aesTransform = crypto.createCipher('aes-256-cbc', pwd);
let fileStream = fs.createWriteStream('encrypted.json');
request(url)
.pipe(aesTransform) // Encrypts with aes256
.pipe(fileStream) // Write encrypted data to a file
.روی('finish', function() {
console.log('Done downloading, encrypting, and saving!');
});
نادیده گرفتن جریانها آسان است، و بسیاری از مردم هنگام نوشتن کد این کار را انجام میدهند، اما میتوانند به عملکرد شما کمک زیادی کنند، به خصوص با کتابخانهای مانند request
.
متفرقه پیکربندی
درخواست های HTTP بسیار بیشتر از تعیین یک URL و دانلود داده ها است. برای برنامههای بزرگتر، و بهویژه آنهایی که باید طیف وسیعتری از محیطها را پشتیبانی کنند، ممکن است درخواستهای شما نیاز به رسیدگی به چند پارامتر پیکربندی، مانند پروکسیها یا گواهیهای اعتماد SSL ویژه داشته باشند.
یک متفرقه مهم ویژگی برای اشاره است request.defaults()
روش، که به شما امکان می دهد پارامترهای پیش فرض را مشخص کنید تا مجبور نباشید برای هر درخواستی که می کنید آنها را بدهید.
let req = request.defaults({
headers: {
'x-access-token': '123abc',
'User-Agent': 'my-reddit-client'
}
});
req('http://your-api.com', function(err, res, body) {
console.log(body);
});
اکنون، در مثال بالا، تمام درخواستهای انجام شده با req
همیشه سرصفحه ها را خواهد داشت x-access-token
و User-Agent
تنظیم. این برای تنظیم هدرهایی مانند این، سرورهای پروکسی یا تنظیمات TLS/SSL ایده آل است.
در طول بقیه این بخش، ما به برخی از ویژگی های رایج تری که با آنها برخورد خواهید کرد، نگاهی خواهیم انداخت:
پروکسی ها
چه رایانه شما پشت پراکسی شرکتی باشد یا بخواهید ترافیک خود را به کشور دیگری هدایت کنید، ممکن است در برخی مواقع لازم باشد یک آدرس پراکسی مشخص کنید. ساده ترین راه برای رسیدن به این هدف استفاده از proxy
گزینه ای که آدرسی را می گیرد که ترافیک از طریق آن پروکسی می شود:
let options = {
url: 'https://www.google.com',
proxy: 'http://myproxy.com'
};
request(options, callback);
این options
شی یک راه برای تعیین یک پروکسی است، اما request
همچنین از متغیرهای محیطی زیر برای پیکربندی یک اتصال پراکسی استفاده می کند:
- HTTP_PROXY / http_proxy
- HTTPS_PROXY / https_proxy
- NO_PROXY / no_proxy
این به شما کنترل بسیار بیشتری می دهد، مانند تنظیم سایت ها نباید از طریق پروکسی شود NO_PROXY
متغیر.
TLS/SSL
گاهی اوقات یک API نیاز به امنیت بیشتری دارد و بنابراین به گواهی مشتری نیاز دارد. این در واقع با API های شرکت های خصوصی نسبتاً رایج است، بنابراین ارزش دانستن روش انجام این کار را دارد.
یکی دیگر از سناریوهای احتمالی این است که شما می خواهید درخواست های HTTP شما به طور صریح به برخی موارد اعتماد داشته باشند مقامات گواهی، که می تواند شامل گواهی هایی باشد که توسط خود شما یا شرکتتان امضا شده اند.
مانند تمام پیکربندیهای دیگری که تاکنون دیدهایم، این تنظیمات در options
هدف – شی:
const fs = require('fs');
const request = require('request');
let myCertFile = fs.readFileSync(__dirname + '/ssl/client.crt')
let myKeyFile = fs.readFileSync(__dirname + '/ssl/client.key')
let myCaFile = fs.readFileSync(__dirname + '/ssl/ca.cert.pem')
var options = {
url: 'https://mockbin.com/request',
cert: myCertFile,
key: myKeyFile,
passphrase: 'myPassword',
ca: myCaFile
};
request.get(options);
احراز هویت پایه
سایت هایی که استفاده می کنند احراز هویت اولیه دسترسی هنوز هم می توان با استفاده از auth
گزینه:
const request = require('request');
var options = {
url: 'https://mockbin.com/request',
auth: {
username: 'ScottWRobinson',
password: 'myPassword'
}
};
request.get(options);
این گزینه یکی از هدرهای HTTP را به عنوان تنظیم می کند "authorization": "Basic c2NvdHQ6cGFzc3dvcmQh"
. رشته “Basic” در هدر “Authorization” اعلام می کند که این یک درخواست تأیید اولیه است و رشته الفبایی که در ادامه می آید رمزگذاری RFC2045-MIME (نوعی از Base64) از نام کاربری و رمز عبور ما است.
تغییر مسیرها
من متوجه شده ام که در برخی از برنامه ها، مانند خراش دادن وب، موارد بسیار کمی وجود دارد که برای موفقیت درخواست شما باید تغییر مسیرها را دنبال کنید. همانطور که احتمالا حدس زده اید، گزینه ای برای تعیین اینکه آیا به طور پیش فرض ریدایرکت ها را دنبال کنید وجود دارد، اما request
حتی یک قدم جلوتر می رود و به شما امکان می دهد تابعی را ارائه دهید که می تواند به صورت مشروط تعیین کند که آیا تغییر مسیر باید دنبال شود یا خیر.
تعدادی از گزینه های تغییر مسیر عبارتند از:
followRedirect
: اگرtrue
، سپس همه تغییر مسیرهای HTTP 3xx را دنبال کنید. یا ارسال یکfunction(res) {}
که برای تعیین اینکه آیا از تغییر مسیر پیروی شود یا نه استفاده می شودfollowAllRedirects
: همه تغییر مسیرهای HTTP 3xx غیر GET را دنبال کنیدmaxRedirects
: حداکثر تعداد دفعات دنبال کردن تغییر مسیرهای زنجیره ای (پیش فرض به 10)
نتیجه
بدون شک request
ماژول قدرتمندی است و احتمالاً از آن استفاده خواهید کرد. با توجه به تمام ویژگی هایی که ارائه می دهد، می تواند به عنوان یک نقطه شروع عالی برای هر چیزی از خزنده وب گرفته تا کتابخانه مشتری برای API شما عمل کند.
چندین گزینه و پیکربندی دیگر وجود دارد که می توان با آنها استفاده کرد request
از آنچه در اینجا نشان داده ایم، پس حتماً آن را بررسی کنید مستندات برای جزئیات بیشتر به خاطر داشته باشید که همه چیز در ماژول مستند نیست، بنابراین ممکن است برای یافتن پاسخ خود نیاز به جستجو/آزمایش بیشتری داشته باشید.
استفاده کردی request
در هر یک از پروژه های شما؟ اگر چنین است، چگونه؟
(برچسبها برای ترجمه)# استراحت
منتشر شده در 1403-01-28 11:34:03