انتقال داده از طریق پروتکل HTTP و دانلود فایلها از اینترنت، از رایجترین کارهای روزمره یک مدیر سیستم یا توسعهدهنده است. در لینوکس، دو ابزار قدرتمند curl و wget برای این کارها در دسترس هستند که هر کدام رویکرد و کاربردهای متفاوتی دارند. در این درس، با هر دو ابزار، مفاهیم پایه HTTP، کار با هدرها و درخواستهای API آشنا میشوید.
مروری بر مفاهیم HTTP
پروتکل انتقال ابرمتن (HTTP) یک پروتکل لایهکاربردی است که برای انتقال دادهها در وب طراحی شده است.
متدهای اصلی HTTP (HTTP Methods):
| متد | کاربرد | ویژگی |
|---|---|---|
| GET | دریافت داده از سرور (مثلاً بارگذاری یک صفحه وب) | بدون تغییر در وضعیت سرور (ایمن)، قابل کش شدن |
| POST | ارسال داده به سرور برای ایجاد منبع جدید (مثلاً ثبتنام کاربر) | تغییر وضعیت سرور، بدنه درخواست حاوی داده |
| PUT | جایگزینی کامل یک منبع در سرور | تغییر وضعیت سرور، idempotent |
| PATCH | بهروزرسانی جزئی یک منبع | تغییر وضعیت سرور |
| DELETE | حذف یک منبع | تغییر وضعیت سرور |
هدرها (Headers):
هدرها ابردادهای درباره درخواست یا پاسخ ارسال میکنند و به صورت Key: Value هستند. برخی از هدرهای رایج عبارتند از:
-
User-Agent: نوع و نسخه نرمافزار مشتری -
Content-Type: نوع محتوای ارسالشده (مانندapplication/json) -
Authorization: اطلاعات احراز هویت (مانند توکنهای Bearer) -
Accept: نوع محتوای مورد انتظار از سرور
curl — ابزار قدرتمند انتقال داده
curl (Client URL) یک ابزار خطفرمان برای انتقال داده با استفاده از پروتکلهای مختلف است که HTTP/HTTPS محبوبترین آنهاست. curl بهخاطر انعطافپذیری بالا، پشتیبانی از تمام متدهای HTTP و امکان کنترل دقیق بر هدرها و بدنه درخواست، ابزار اصلی تعامل با APIها و وبسرویسها محسوب میشود .
ساختار کلی:
curl [options] [URL...]
کاربردهای اصلی curl
دریافت محتوای یک صفحه (متد GET پیشفرض):
curl https://example.com
ذخیره محتوا در فایل (مشابه دانلود):
curl -o output.html https://example.com
در این حالت، نام فایل خروجی را خودتان مشخص میکنید . اگر میخواهید نام فایل از سرور گرفته شود (محتویات هدر Content-Disposition):
curl -O https://example.com/file.zip
ارسال داده با متد POST:
curl -X POST -d "username=ali&password=123" https://api.example.com/login
در اینجا -X متد را مشخص میکند و -d دادههای فرم را ارسال میکند . برای ارسال داده JSON:
curl -X POST -H "Content-Type: application/json" -d '{"name":"Ali","age":30}' https://api.example.com/users
مشاهده پاسخ کامل (شامل هدرها):
curl -i https://api.example.com/status
یا برای مشاهده فقط هدرها:
curl -I https://example.com
این گزینه (-I) معادل درخواست HEAD است و برای بررسی وضعیت سرور بدون دانلود محتوا بسیار مفید است .
تنظیم هدر سفارشی:
curl -H "Authorization: Bearer TOKEN" -H "Accept: application/json" https://api.example.com/data
دنبال کردن تغییر مسیرها (Redirects):
curl -L https://bit.ly/example
اگر این گزینه را استفاده نکنید، curl فقط پاسخ تغییرمسیر (مثلاً کد ۳۰۲) را نمایش میدهد، نه محتوای نهایی را.
ارسال کوکی:
curl -b "name=value" https://example.com
wget — ابزار تخصصی دانلود
wget ابزاری قدرتمند و انعطافپذیر برای دانلود فایلها از وب است. طراحی wget بر انجام وظیفهاش (دانلود) بدون نیاز به نظارت کاربر متمرکز است و از پروتکلهای HTTP، HTTPS و FTP پشتیبانی میکند .
ساختار کلی:
wget [options] [URL]
کاربردهای اصلی wget
سادهترین دانلود:
wget https://example.com/file.zip
فایل با نام اصلیاش در دایرکتوری جاری ذخیره میشود.
ذخیره با نام دلخواه:
wget -O myfile.zip https://example.com/file.zip
ادامه دانلود نیمهتمام (Resume):
wget -c https://example.com/largefile.iso
این گزینه برای دانلود فایلهای حجیم که قطع شدهاند بسیار مفید است .
دانلود بهصورت پسزمینه (در صورت قطع اتصال ادامه میدهد):
wget -b https://example.com/file.zip
خروجی به فایل wget-log نوشته میشود.
دانلود بازگشتی (میرور) یک وبسایت:
wget -r -l 5 -np https://example.com/
-
-r: فعال کردن دانلود بازگشتی -
-l 5: حداکثر عمق (تعداد زیرشاخهها) را ۵ تعیین میکند -
-np: از رفتن به پوشههای بالاتر (parent directories) جلوگیری میکند
محدود کردن پهنای باند (Bandwidth Limit):
wget --limit-rate=200k https://example.com/largefile.iso
کار با APIها (درخواستهای API)
یکی از قدرتمندترین کاربردهای curl، تعامل با APIهای RESTful است. در ادامه، سناریوهای رایج و نحوه پیادهسازی آنها را با curl میبینیم.
سناریوی ۱: احراز هویت و دریافت داده
فرض کنید یک توکن JWT دریافت کردهاید و میخواهید اطلاعات کاربر را دریافت کنید:
curl -X GET \ -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \ -H "Accept: application/json" \ https://api.example.com/users/profile
سناریوی ۲: ایجاد یک منبع جدید (POST)
ایجاد یک کاربر جدید با ارسال دادههای JSON:
curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer TOKEN" \ -d '{"username":"new_user","email":"user@example.com"}' \ https://api.example.com/users
سناریوی ۳: بهروزرسانی جزئی (PATCH)
curl -X PATCH \ -H "Content-Type: application/json" \ -H "Authorization: Bearer TOKEN" \ -d '{"email":"new_email@example.com"}' \ https://api.example.com/users/123
سناریوی ۴: دریافت خروجی فرمتشده (با jq)
معمولاً خروجی APIها به صورت JSON است. برای خوانایی بهتر، میتوانیم خروجی را به jq (پردازشگر JSON) پاس دهیم:
curl -s https://api.example.com/users | jq '.[] | {id, name}'
مقایسه curl و wget
| ویژگی | curl | wget |
|---|---|---|
| کاربرد اصلی | انتقال داده با پروتکلهای متعدد، تعامل با APIها | دانلود ساده و قدرتمند فایلها |
| پشتیبانی از روشهای HTTP | کامل (GET, POST, PUT, DELETE, PATCH و ...) | محدود (عمدتاً GET و POST) |
| ارسال داده | پشتیبانی کامل از دادههای فرم، JSON و ... | پشتیبانی محدود |
| مدیریت کوکی | کامل (ذخیره و ارسال با -c و -b) | کامل (--save-cookies و --load-cookies) |
| دانلود بازگشتی | پشتیبانی ضعیف | عالی (-r, -l) |
| ادامه دانلود | با -C - امکانپذیر | با -c ساده و قدرتمند |
| استفاده در اسکریپتها | بسیار بالا (به دلیل خروجی و گزینههای بسیار) | بالا (بهویژه برای دانلود) |
انتخاب ابزار: اگر نیاز به تعامل با API، تست سرور یا کنترل دقیق بر متدها و هدرهای HTTP دارید،
curlانتخاب اول است. اگر هدف دانلود فایلهای حجیم، میرور کردن وبسایتها یا دانلود بهصورت پسزمینه است،wgetگزینه مناسبتری است . همچنین، اگر محدودیتهای شبکه دارید،wgetبا گزینه--limit-rateبه شما اجازه میدهد تا پهنای باند مصرفی را کنترل کنید .