هنگام توسعه و تست API، اغلب نیاز به ارسال درخواستها از طریق سرورهای پروکسی وجود دارد. این ممکن است برای دور زدن محدودیتهای جغرافیایی، تست رفتار API از مناطق مختلف، اطمینان از ناشناسی یا کار با سرویسهایی که IP دیتاسنترها را مسدود میکنند، لازم باشد. در این راهنما بررسی خواهیم کرد که چگونه پروکسی را به درستی در کلاینتهای محبوب REST API تنظیم کنیم و از اشتباهات رایج جلوگیری کنیم.
ما چهار ابزار محبوب برای کار با API را بررسی خواهیم کرد: Postman (رابط گرافیکی برای اکثر توسعهدهندگان)، Insomnia (جایگزین مدرن با UI راحت)، cURL (ابزار کلاسیک خط فرمان) و HTTPie (کلاینت CLI مدرن با سینتکس قابل خواندن). برای هر ابزار نمونههای کد ارائه خواهیم داد و ویژگیهای پیکربندی را بررسی خواهیم کرد.
کدام نوع پروکسی برای کار با API مناسب است
قبل از تنظیم پروکسی در کلاینتهای API، مهم است که بدانید کدام نوع پروکسی برای کار شما مناسب است. کلاینتهای REST API از دو پروتکل اصلی پشتیبانی میکنند: HTTP/HTTPS و SOCKS5. انتخاب بستگی به نیازهای خاص API و سطح امنیتی که نیاز دارید، دارد.
پروکسیهای HTTP/HTTPS در سطح پروتکل HTTP کار میکنند و برای اکثر درخواستهای REST API ایدهآل هستند. آنها ساختار ترافیک HTTP را درک میکنند، میتوانند پاسخها را کش کنند و هدرها را تغییر دهند. پروکسیهای HTTPS به طور اضافی اتصال بین کلاینت و سرور پروکسی را رمزگذاری میکنند که در هنگام انتقال دادههای حساس مانند کلیدهای API یا توکنهای احراز هویت مهم است.
پروکسیهای SOCKS5 در سطح پایینتری کار میکنند و هر نوع ترافیکی را بدون تغییر منتقل میکنند. آنها از پروکسیهای HTTP کندتر هستند، اما ناشناسی بهتری را فراهم میکنند و برای مواردی که API از پروتکلهای غیر استاندارد استفاده میکند یا نیاز به شفافیت کامل اتصال دارد، مناسب هستند. SOCKS5 همچنین از ترافیک UDP پشتیبانی میکند، اگرچه برای REST API این به ندرت مورد نیاز است.
توصیه: برای کار با اکثر APIهای عمومی (GitHub، Stripe، Twilio، Google Maps) پروکسیهای HTTP/HTTPS کافی است. اگر API درخواستها را از IP دیتاسنترها مسدود میکند، از پروکسیهای مسکونی استفاده کنید — آنها IP کاربران واقعی را دارند و کمتر تحت مسدودیتها قرار میگیرند.
| نوع پروکسی | پروتکل | سرعت | چه زمانی استفاده کنیم |
|---|---|---|---|
| HTTP دیتاسنتر | HTTP/HTTPS | بسیار بالا | تست، توسعه، API بدون محدودیت جغرافیایی |
| HTTP مسکونی | HTTP/HTTPS | متوسط | API با حفاظت از رباتها، هدفگذاری جغرافیایی |
| HTTP موبایل | HTTP/HTTPS | متوسط | APIهای موبایل، شبکههای اجتماعی |
| SOCKS5 | SOCKS5 | پایین | حداکثر ناشناسی، پروتکلهای غیر استاندارد |
تنظیم پروکسی در Postman: تنظیمات جهانی و محلی
Postman — محبوبترین ابزار گرافیکی برای کار با REST API است که توسط میلیونها توسعهدهنده استفاده میشود. این ابزار از دو روش برای تنظیم پروکسی پشتیبانی میکند: تنظیمات جهانی (که به تمام درخواستها اعمال میشود) و تنظیمات در سطح محیط (environment). هر دو گزینه را به تفصیل بررسی خواهیم کرد.
تنظیم جهانی پروکسی در Postman
تنظیمات جهانی پروکسی در منوی Settings (آیکون چرخ دنده در گوشه بالا سمت راست) قرار دارد. این روش زمانی مناسب است که میخواهید تمام درخواستها از Postman همیشه از طریق یک سرور پروکسی مشخص عبور کنند. دستورالعمل گام به گام:
- Postman را باز کنید و روی آیکون چرخ دنده (Settings) در گوشه بالا سمت راست کلیک کنید
- به تب "Proxy" بروید
- گزینه "Add a custom proxy configuration" را فعال کنید
- نوع پروکسی را انتخاب کنید: HTTP، HTTPS یا SOCKS5
- آدرس سرور پروکسی را وارد کنید (به عنوان مثال:
proxy.example.com) - پورت را مشخص کنید (معمولاً 8080 برای HTTP، 1080 برای SOCKS5)
- اگر پروکسی نیاز به احراز هویت دارد، "Proxy Auth" را فعال کرده و نام کاربری/رمز عبور را وارد کنید
- روی "Save" کلیک کنید و پنجره تنظیمات را ببندید
پس از این، تمام درخواستها از Postman به طور خودکار از طریق پروکسی مشخص شده عبور خواهند کرد. ویژگی مهم: Postman همچنین دادههای تلمتری را ارسال کرده و بهروزرسانیها را از طریق پروکسی بررسی میکند که ممکن است ترافیک اضافی ایجاد کند. اگر از پروکسی با ترافیک محدود استفاده میکنید، باید این نکته را در نظر بگیرید.
تنظیم پروکسی از طریق متغیرهای محیطی
روش انعطافپذیرتر استفاده از متغیرهای محیطی (Environments) است. این امکان را میدهد که به سرعت بین پروکسیهای مختلف برای پروژهها یا APIهای مختلف جابجا شوید. یک محیط جدید ایجاد کرده و متغیرهای زیر را اضافه کنید:
PROXY_HOST = proxy.example.com
PROXY_PORT = 8080
PROXY_USER = your_username
PROXY_PASS = your_password
سپس در تنظیمات جهانی پروکسی از این متغیرها به جای مقادیر خاص استفاده کنید: {{PROXY_HOST}} و {{PROXY_PORT}}. اکنون میتوانید چندین محیط (به عنوان مثال، "Production Proxy"، "Testing Proxy"، "US Proxy") ایجاد کرده و با یک کلیک بین آنها جابجا شوید.
استفاده از پروکسی سیستم
Postman همچنین میتواند از تنظیمات پروکسی سیستم عامل شما استفاده کند. برای این کار در تنظیمات پروکسی گزینه "Use System Proxy" را انتخاب کنید. این گزینه زمانی مناسب است که شما قبلاً پروکسی را در سطح سیستمعامل (به عنوان مثال، از طریق تنظیمات Windows یا macOS) تنظیم کردهاید و میخواهید Postman از همان تنظیمات استفاده کند که مرورگر استفاده میکند.
مهم: هنگام استفاده از پروکسی سیستم، Postman ممکن است تنظیمات برای localhost و 127.0.0.1 را نادیده بگیرد. اگر شما API محلی را از طریق پروکسی تست میکنید، از پیکربندی سفارشی به جای سیستم استفاده کنید.
پیکربندی پروکسی در Insomnia
Insomnia — جایگزین مدرن Postman با رابط کاربری تمیز و کد منبع باز است. تنظیم پروکسی در Insomnia کمی متفاوت از Postman است و نیاز به ویرایش فایل پیکربندی یا استفاده از متغیرهای محیطی دارد. هر دو روش را بررسی خواهیم کرد.
تنظیم از طریق متغیرهای محیطی
سادهترین راه برای تنظیم پروکسی در Insomnia استفاده از متغیرهای محیطی استاندارد HTTP_PROXY و HTTPS_PROXY است. Insomnia به طور خودکار این متغیرها را از سیستم میخواند. آنها را قبل از راهاندازی Insomnia تنظیم کنید:
Linux/macOS:
export HTTP_PROXY="http://username:password@proxy.example.com:8080"
export HTTPS_PROXY="http://username:password@proxy.example.com:8080"
insomnia
Windows (PowerShell):
$env:HTTP_PROXY = "http://username:password@proxy.example.com:8080"
$env:HTTPS_PROXY = "http://username:password@proxy.example.com:8080"
insomnia
به فرمت URL توجه کنید: حتی برای پروکسی HTTPS از طرح http:// استفاده میشود، نه https://. این یک توافق استاندارد برای متغیرهای محیطی پروکسی است. اگر پروکسی نیاز به احراز هویت ندارد، URL کوتاهتر خواهد بود: http://proxy.example.com:8080.
تنظیم پروکسی SOCKS5
برای پروکسی SOCKS5 از متغیر محیطی ALL_PROXY استفاده کنید:
export ALL_PROXY="socks5://username:password@proxy.example.com:1080"
Insomnia از SOCKS5 پشتیبانی میکند، اما همه نسخهها به درستی احراز هویت SOCKS5 را پردازش نمیکنند. اگر با SOCKS5 احراز هویت شده مشکل دارید، سعی کنید از پروکسی HTTP استفاده کنید یا Insomnia را به آخرین نسخه بهروزرسانی کنید.
تنظیم از طریق فایل پیکربندی
برای تنظیم دائمی پروکسی میتوانید فایل پیکربندی Insomnia را ویرایش کنید. مکان فایل بستگی به سیستمعامل دارد:
- Windows:
%APPDATA%\Insomnia\config.json - macOS:
~/Library/Application Support/Insomnia/config.json - Linux:
~/.config/Insomnia/config.json
فایل را در ویرایشگر متن باز کرده و بخش proxy را اضافه کنید:
{
"proxy": {
"http": "http://username:password@proxy.example.com:8080",
"https": "http://username:password@proxy.example.com:8080"
}
}
پس از ویرایش، Insomnia را دوباره راهاندازی کنید. تنظیمات پروکسی به طور خودکار به تمام درخواستها اعمال میشود.
استفاده از پروکسی در cURL: نمونههای دستوری
cURL — ابزار کلاسیک خط فرمان برای کار با HTTP است که تقریباً در تمام سیستمهای مشابه Unix و Windows 10+ نصب شده است. این ابزار از پروکسی از طریق پارامتر -x یا --proxy پشتیبانی میکند. سناریوهای مختلف استفاده را بررسی خواهیم کرد.
استفاده پایه از پروکسی HTTP
سادهترین مثال استفاده از پروکسی HTTP بدون احراز هویت:
curl -x http://proxy.example.com:8080 https://api.example.com/users
پارامتر -x آدرس و پورت سرور پروکسی را مشخص میکند. cURL به طور خودکار تشخیص میدهد که این یک پروکسی HTTP است و اتصال را تنظیم میکند. اگر میخواهید پروتکل را به طور صریح مشخص کنید، از URL کامل استفاده کنید:
curl --proxy http://proxy.example.com:8080 https://api.example.com/users
پروکسی با احراز هویت
اگر پروکسی نیاز به احراز هویت با نام کاربری و رمز عبور دارد، آنها را به URL پروکسی اضافه کنید یا از پارامتر -U استفاده کنید:
# روش 1: نام کاربری و رمز عبور در URL
curl -x http://username:password@proxy.example.com:8080 https://api.example.com/users
# روش 2: پارامتر -U (امنتر، در تاریخچه دستورات ذخیره نمیشود)
curl -x http://proxy.example.com:8080 -U username:password https://api.example.com/users
روش دوم ترجیح داده میشود زیرا نام کاربری و رمز عبور در تاریخچه دستورات shell ذخیره نمیشود. برای امنیت بیشتر میتوانید فقط نام کاربری را مشخص کنید و cURL به صورت تعاملی از شما رمز عبور را درخواست میکند:
curl -x http://proxy.example.com:8080 -U username https://api.example.com/users
# cURL از شما رمز عبور را درخواست میکند: Enter proxy password for user 'username':
استفاده از پروکسی SOCKS5
برای پروکسی SOCKS5 پروتکل را به وضوح در URL مشخص کنید:
# SOCKS5 بدون احراز هویت
curl -x socks5://proxy.example.com:1080 https://api.example.com/users
# SOCKS5 با احراز هویت
curl -x socks5://username:password@proxy.example.com:1080 https://api.example.com/users
# SOCKS5h (حل DNS از طریق پروکسی)
curl -x socks5h://proxy.example.com:1080 https://api.example.com/users
تفاوت بین socks5:// و socks5h://: در مورد اول حل DNS به صورت محلی (روی دستگاه شما) انجام میشود، در مورد دوم — از طریق سرور پروکسی. از socks5h:// استفاده کنید اگر میخواهید درخواستهای DNS را به طور کامل از ارائهدهنده خود پنهان کنید.
درخواستهای POST از طریق پروکسی
پروکسی برای تمام متدهای HTTP به یک شکل کار میکند. مثال یک درخواست POST با دادههای JSON از طریق پروکسی:
curl -x http://proxy.example.com:8080 \
-X POST \
-H "Content-Type: application/json" \
-d '{"name":"John","email":"john@example.com"}' \
https://api.example.com/users
برای ارسال فایلها از پارامتر -F استفاده کنید:
curl -x http://proxy.example.com:8080 \
-X POST \
-F "file=@document.pdf" \
-F "description=Important document" \
https://api.example.com/upload
استفاده از متغیرهای محیطی
به جای مشخص کردن پروکسی در هر دستور، میتوانید از متغیرهای محیطی استفاده کنید. cURL به طور خودکار http_proxy، https_proxy و all_proxy را میخواند:
# تنظیم متغیرهای محیطی
export http_proxy="http://username:password@proxy.example.com:8080"
export https_proxy="http://username:password@proxy.example.com:8080"
# اکنون تمام دستورات cURL به طور خودکار از پروکسی استفاده میکنند
curl https://api.example.com/users
# غیرفعال کردن پروکسی برای یک دستور خاص
curl --noproxy "*" https://api.example.com/users
پارامتر --noproxy به شما این امکان را میدهد که دامنههای خاصی را از پروکسی کردن مستثنی کنید. به عنوان مثال، برای عدم استفاده از پروکسی برای localhost و دامنههای داخلی:
export no_proxy="localhost,127.0.0.1,.internal.company.com"
تنظیم پروکسی در HTTPie
HTTPie — جایگزین مدرن cURL با سینتکس قابل خواندن و خروجی رنگی است. این ابزار به ویژه برای کار تعاملی با API در ترمینال مناسب است. HTTPie از پروکسی از طریق پارامتر --proxy یا متغیرهای محیطی پشتیبانی میکند.
استفاده پایه از پروکسی
سینتکس HTTPie برای پروکسی کمی متفاوت از cURL است. باید پروتکل و URL پروکسی را به صورت جداگانه مشخص کنید:
# پروکسی HTTP
http --proxy=http:http://proxy.example.com:8080 \
--proxy=https:http://proxy.example.com:8080 \
GET https://api.example.com/users
# فرم کوتاهتر (اگر پروکسی برای HTTP و HTTPS یکسان باشد)
http --proxy=all:http://proxy.example.com:8080 GET https://api.example.com/users
فرمت: --proxy=protocol:proxy_url. برای درخواستهای HTTPS معمولاً از پروکسی HTTP (نه HTTPS) استفاده میشود، این رفتار استاندارد است.
پروکسی با احراز هویت
برای احراز هویت، نام کاربری و رمز عبور را به URL پروکسی اضافه کنید:
http --proxy=all:http://username:password@proxy.example.com:8080 \
GET https://api.example.com/users
HTTPie همچنین از پارامتر --proxy-auth برای مشخص کردن واضحتر اعتبارنامهها پشتیبانی میکند، اما در نسخههای اخیر این پارامتر منسوخ شده است و توصیه میشود احراز هویت را در URL قرار دهید.
پروکسی SOCKS5 در HTTPie
HTTPie از پروکسی SOCKS5 از نسخه 2.0.0 به بعد پشتیبانی میکند. اطمینان حاصل کنید که نسخه بهروز را نصب کردهاید:
# بررسی نسخه HTTPie
http --version
# بهروزرسانی HTTPie از طریق pip
pip install --upgrade httpie
# استفاده از پروکسی SOCKS5
http --proxy=all:socks5://proxy.example.com:1080 GET https://api.example.com/users
برای SOCKS5 با احراز هویت، نیاز به نصب کتابخانه اضافی pysocks خواهید داشت:
pip install pysocks
http --proxy=all:socks5://username:password@proxy.example.com:1080 \
GET https://api.example.com/users
درخواستهای POST و ارسال دادهها
HTTPie سینتکس راحتی برای درخواستهای POST دارد. مثال ارسال JSON از طریق پروکسی:
# POST با JSON (HTTPie به طور خودکار Content-Type را تشخیص میدهد)
http --proxy=all:http://proxy.example.com:8080 \
POST https://api.example.com/users \
name="John Doe" \
email="john@example.com" \
age:=30
# ارسال فایل
http --proxy=all:http://proxy.example.com:8080 \
POST https://api.example.com/upload \
file@document.pdf \
description="Important document"
به سینتکس توجه کنید: key=value برای رشتهها، key:=value برای اعداد و مقادیر بولی، key@file برای فایلها.
استفاده از متغیرهای محیطی
مانند cURL، HTTPie متغیرهای محیطی استاندارد http_proxy و https_proxy را میخواند:
export http_proxy="http://username:password@proxy.example.com:8080"
export https_proxy="http://username:password@proxy.example.com:8080"
# اکنون تمام دستورات به طور خودکار از پروکسی استفاده میکنند
http GET https://api.example.com/users
برای غیرفعال کردن موقت پروکسی از پارامتر --proxy= (مقدار خالی) استفاده کنید:
http --proxy= GET https://api.example.com/users
احراز هویت پروکسی: نام کاربری و رمز عبور
بیشتر خدمات پروکسی تجاری نیاز به احراز هویت برای جلوگیری از استفاده غیرمجاز دارند. دو روش اصلی احراز هویت وجود دارد: احراز هویت پایه (نام کاربری/رمز عبور) و لیست سفید IP (پیوند به آدرس IP). ویژگیهای هر روش را بررسی خواهیم کرد و نحوه تنظیم صحیح آنها در کلاینتهای API را توضیح خواهیم داد.
احراز هویت پایه (نام کاربری و رمز عبور)
احراز هویت پایه — رایجترین روش است. سرور پروکسی در هر اتصال نام کاربری و رمز عبور را درخواست میکند. اعتبارنامهها در هدر Proxy-Authorization به صورت Base64 منتقل میشوند. تمام کلاینتهای API مدرن به طور خودکار این هدر را ایجاد میکنند اگر نام کاربری و رمز عبور را در URL پروکسی مشخص کنید.
فرمت URL با احراز هویت:
protocol://username:password@proxy_host:proxy_port
نمونههایی برای پروتکلهای مختلف:
# پروکسی HTTP
http://user123:pass456@proxy.example.com:8080
# پروکسی HTTPS (از همان فرمت استفاده میشود)
http://user123:pass456@proxy.example.com:8080
# پروکسی SOCKS5
socks5://user123:pass456@proxy.example.com:1080
امنیت: هرگز رمزهای عبور پروکسی را به صورت واضح در اسکریپتها یا فایلهای پیکربندی که به سیستم کنترل نسخه (Git) منتقل میشوند، ذخیره نکنید. از متغیرهای محیطی یا فایلهایی با دسترسی محدود (chmod 600) استفاده کنید.
لیست سفید IP (پیوند به IP)
برخی از ارائهدهندگان پروکسی احراز هویت بر اساس آدرس IP را ارائه میدهند. در این صورت شما IP خود را به لیست سفید در پنل مدیریت پروکسی اضافه میکنید و سرور فقط اتصالات از این IP را بدون نام کاربری و رمز عبور مجاز میکند. این روش راحتتر و ایمنتر است، زیرا نیازی به ارسال اعتبارنامهها در هر درخواست نیست.
هنگام استفاده از لیست سفید IP، فرمت URL پروکسی سادهتر میشود:
# بدون نام کاربری و رمز عبور
http://proxy.example.com:8080
# مثال در cURL
curl -x http://proxy.example.com:8080 https://api.example.com/users
معایب این روش — اگر IP شما دینامیک باشد (هنگام اتصال مجدد به اینترنت تغییر کند)، باید هر بار لیست سفید را بهروزرسانی کنید. برای سرورهایی با IP ثابت، این گزینه ایدهآل است.
کاراکترهای ویژه در رمز عبور
اگر رمز عبور پروکسی شامل کاراکترهای ویژه (@، :، /، ?) باشد، باید آنها را با فرمت URL encoding (percent encoding) کدگذاری کنید. به عنوان مثال:
| کاراکتر | URL-کدگذاری | مثال |
|---|---|---|
| @ | %40 | pass@123 → pass%40123 |
| : | %3A | pass:word → pass%3Aword |
| / | %2F | pass/123 → pass%2F123 |
| ? | %3F | pass?123 → pass%3F123 |
| # | %23 | pass#123 → pass%23123 |
| فضا | %20 | my pass → my%20pass |
مثال استفاده از رمز عبور با کاراکترهای ویژه:
# رمز عبور اصلی: P@ss:w0rd/123
# رمز عبور کدگذاری شده: P%40ss%3Aw0rd%2F123
curl -x http://username:P%40ss%3Aw0rd%2F123@proxy.example.com:8080 \
https://api.example.com/users
برای کدگذاری خودکار میتوانید از ابزارهای آنلاین URL encoder یا دستور در Python استفاده کنید:
python3 -c "import urllib.parse; print(urllib.parse.quote('P@ss:w0rd/123'))"
# خروجی: P%40ss%3Aw0rd%2F123
حل مشکلات و خطاهای رایج
هنگام کار با پروکسی در کلاینتهای API، اغلب خطاهای رایجی پیش میآید. رایجترین مشکلات و روشهای حل آنها را بررسی خواهیم کرد.
خطای "407 Proxy Authentication Required"
این خطا به این معنی است که سرور پروکسی نیاز به احراز هویت دارد، اما اعتبارنامهها ارائه نشدهاند یا نادرست هستند. راهحلها:
- درستی نام کاربری و رمز عبور را در پنل مدیریت ارائهدهنده پروکسی بررسی کنید
- اطمینان حاصل کنید که کاراکترهای ویژه در رمز عبور کدگذاری شدهاند (به بخش بالا مراجعه کنید)
- فرمت URL را بررسی کنید:
http://username:password@host:port - اگر از لیست سفید IP استفاده میکنید، اطمینان حاصل کنید که IP فعلی شما به لیست سفید اضافه شده است
مثال تشخیص در cURL با خروجی دقیق:
curl -v -x http://username:password@proxy.example.com:8080 https://api.example.com/users
# پرچم -v (verbose) تمام هدرها و فرآیند احراز هویت را نشان میدهد
خطای "Connection timeout" یا "Failed to connect"
این خطا زمانی پیش میآید که کلاینت API نتواند اتصال با سرور پروکسی برقرار کند. دلایل ممکن:
- آدرس یا پورت نادرست پروکسی — تنظیمات را در ارائهدهنده بررسی کنید
- سرور پروکسی در دسترس نیست یا بارگذاری شده است — از سرور دیگری در لیست استفاده کنید
- فایروال شما اتصالات خروجی به پورت پروکسی را مسدود میکند
- ارائهدهنده پروکسی IP شما را به دلیل تجاوز از محدودیتها مسدود کرده است
برای تشخیص، سعی کنید به پروکسی مستقیماً از طریق telnet یا nc متصل شوید:
# بررسی در دسترس بودن پروکسی
telnet proxy.example.com 8080
# یا
nc -zv proxy.example.com 8080
# اگر اتصال برقرار نشود، مشکل در شبکه یا در دسترس نبودن سرور پروکسی است
خطای "SSL certificate problem"
هنگام استفاده از پروکسی HTTPS ممکن است مشکلاتی در بررسی گواهی SSL پیش بیاید. این موضوع به ویژه برای پروکسیهای MITM (Man-in-the-Middle) که ترافیک HTTPS را رهگیری و رمزگشایی میکنند، صدق میکند. راهحلها:
- در cURL از پرچم
-kیا--insecureبرای غیرفعال کردن بررسی گواهی استفاده کنید (فقط برای تست!) - در Postman گزینه "SSL certificate verification" را در Settings → General غیرفعال کنید
- گواهی ریشه پروکسی را در سیستم نصب کنید (برای محیط تولید)
# غیرفعال کردن بررسی گواهی SSL در cURL
curl -k -x http://username:password@proxy.example.com:8080 https://api.example.com/users