آموزش ارسال درخواستهای HTTP در پایتون، بخش مهمی از مراحل کسب مهارت هر برنامه نویس تازهکاری است. اصول پایه را در کنار بعضی از کاربردهای پیشرفته، پوشش میدهیم. علاوه بر آن، مثالهایی را هم برای کمک به درک بهتر روش استفاده از کتابخانه Requests فراهم کردهایم.
کتابخانه Requests در پایتون چیست؟
به طور کلی میتوان کتابخانه Requests را با چند جمله توصیف کرد.
- کتابخانه Requests برای کمک به ارسال درخواستهای HTTP طراحی و ساخته شده است.
- این کتابخانه برنامه نویسی، برای تعامل با API-ها و Web Service-ها به توسعهدهندگان و برنامهها کمک میکند.
- برنامهنویسان با کمک این کتابخانه میتوانند با روش سادهتر و کارآمدتری وب اسکرپینگ کنند.
علاوه بر موارد گفته شده باید بگوییم که با کمک کتابخانه Requests تقریبا تمام وظایف موجود در حوزه HTTP را میتوان اجرا کرد.
API-های قابل درک کتابخانه Requests، ارسال درخواستهای HTTP را به شکل بسیار سادهتری ممکن میکنند. در عین حال این کتابخانه میتواند طیف گستردهای از متدهای HTTP را مانند GET و PUT و DELETE و HEAD و OPTIONS و PATCH پشتیبانی کند.
فلسفه توسعه کتابخانه Requests
کتابخانه Requests در پایتون، تلاش میکند که کاربری سادهای داشته باشد و تا حد امکان دستورات تجزیه شده و قابل درکی را ارائه دهد. در مقابل، کتابخانههای استاندارد HTTP در پایتون، کاربری سختی دارند. درک دستورات پیچیده این کتابخانهها مشکل است و معمولا برای انجام کار یکسانی به دستورات بسیار زیادتری نیاز دارند. برای مثال، در کادرهای زیر دستور یکسانی را بین کتابخانه Urllib3 و Requests پیادهسازی و مقایسه کردهایم.
در ابتدا دستور را با کتابخانه Urllib3 پیادهسازی میکنیم. توجه کنید که کدهای مربوط به print() جزو بدنه اصلی دستور نیستند.
1#!/usr/bin/env python# -*- coding: utf-8 -*-
2import urllib3
3
4http = urllib3.PoolManager()
5gh_url = 'https://api.github.com'
6headers = urllib3.util.make_headers(user_agent= 'my-agent/1.0.1', basic_auth='abc:xyz')
7requ = http.request('GET', gh_url, headers=headers)
8print (requ.headers)
9print(requ.data)
10# ------# 200# 'application/json'
سپس همان دستور را با کمک امکانات و کدهای کتابخانه Requests پیادهسازی میکنیم.
1#!/usr/bin/env python# -*- coding: utf-8 -*-
2import requests
3r = requests.get('https://api.github.com', auth=('user', 'pass'))
4print(r.status_code)
5print(r.headers['content-type'])
6# ------# 200# 'application/json'
نهتنها که استفاده از کتابخانه Requests تعداد عبارتهای کد را به میزان قابل توجهی کاهش داده، بلکه این کتابخانه عیبیابی و درک کدها را حتی برای چشم افراد تازهکار به اندازه زیادی سادهتر کرده است.
همینطور که مشاهده میشود، کتابخانه Requests به میزان قابل توجهی از هر کتابخانه استاندارد دیگری در پایتون کارآمدتر است و این مسئله به صورت تصادفی اتفاق نیافتاده. کتابخانه Requests با در نظر گرفتن چندین مورد از اصول PEP 20 و با تمرکز بر روی زبان برنامه نویسی پایتون توسعه داده شده و هنوز هم در حال توسعه و پیشرفت است.
در فهرست زیر مهمترین گزینههای مطرح شده در اصول توسعه کتابخانه Requests را بیان کردهایم.
- زیبایی بهتر از زشتی است.
- صراحت از ابهام، بهتر است.
- سادهگی از پیچیدهبودن بهتر است.
- پیچیدهگی بهتر از درهم رفتهگی و سردرگمی است.
- خوانایی اهمیت زیادی دارد.
پنج اصطلاح نمادینی که در بالا نوشته شدند، زیربنای فرایند توسعه ماژول Requests پایتون را تشکیل میدهند. همچنین هر مشارکت جدیدی که برای توسعه این کتابخانه انجام شود هم باید از اصول بالا پیروی کند.
کتابخانه Requests در پایتون، جزو کتابخانههای بسیار مفید و مربوط به عملیات پیشرفته در پایتون هستند. از آنجا که پایتون، زبان همه فن حریف و قدرتمندی است، در ساخت اپلیکیشنهای تحت وب مخصوصا با کمک فریمورکهای قدرتمند Django و Flask نیز بهکار برده میشود. در صورت داشتن توانایی کار با کتابخانه Requests در پایتون، گزینههای شغلی و تخصصی زیادی در مقابل شما قرار خواهد گرفت. تلاش برای گسترش مهارتهای برنامهنویسی باید به صورت دائمی انجام گیرد، مخصوصا برای افراد علاقهمند یا اشخاصی که آینده شغلی خود را در این مسیر میبینند. یادگیری زبانهای برنامهنویسی همزمان با افزایش مهارت، جذابتر و کاربردیتر میشود.
برای یادگیری بیشتر، روشهای متنوعی وجود دارند که میتوان با توجه به شرایط خود، هر کدام را انتخاب کرد. یکی از بهترین راهها استفاده از فیلمهای آموزشی است. زیرا فیلمهای آموزشی دارای نکات مثبت زیادی هستند. به عنوان مثال:
چگونه کتابخانه Requests در پایتون را نصب کنیم؟
کتابخانه Requests جزئی از کتابخانههای استاندارد پایتون نیست. بنابراین برای استفاده از این کتابخانه باید در ابتدا آن را دانلود و نصب کرد. فرایند نصب این کتابخانه بسیار ساده است و با کمک خط کدی در ترمینال لینوکس یا خط فرمان ویندوز به راحتی انجام میشود.
$ pip install requests
البته توصیه متخصصان این است که از ترمینال فراهم شده در محیط کدنویسی مانند PyCharm استفاده کنید. زیرا عمل نصب هر کتابخانهای از طریق این ترمینال به شکل بسیار مطمئنتری انجام میشود. خود محیط کدنویسی تضمین میکند که کتابخانه به صورت صحیح در جای درست و بدون مشکل نصب شده و آماده استفاده باشد.
در نهایت، قبل از شروع به استفاده از کتابخانه Requests در هر پروژهای لازم است که آن را به محیط کدنویسی خود وارد کنیم. روال بسیار ساده انجام این کار، در کد زیر نمایش داده شده است. برای همه فایلها و اسکریپتهای پایتون نیز به همین شکل انجام میشود.
1#In Python "import requests" allows us to use the library
2import requests
درخواست GET با کتابخانه Requests در پایتون
Requests، یکی از محبوبترین کتابخانههای پایتون برای ارسال درخواستهای HTTP/HTTPS به وبسایتها و API-ها است. این کتابخانه درخواستهای GET و POST و PUT وDELETE و غیره را با استفاده از پارامترهای گوناگون مانند headers و cookies و data و json و غیره به وبسایتها و API-ها ارسال و پاسخهای مورد نظر را دریافت میکند.
در بین همه درخواستهای HTTP، درخواست GET بیشترین استفاده را دارد. همینطور که از نام دستور GET مشخص است، برای بدست آوردن داده از منبع مشخص شدهای تلاش میکند. معمولا این منبع از جنس وبسایتهای اینترنتی است. برای اینکه دخواست GET ارسال شود، باید تابع requests.get() را در پایتون فراخوانی کرده و به آن URL یا آدرس مقصد را اضافه کنیم.
برای مثال، در کد زیر درخواست سادهای را با کمک این تابع ارسال کردهایم.
1import requests
2requests.get('http://httpbin.org/')
درخواست سادهای که به عنوان مثال در بالا ارسال کردهایم، پاسخ « <Response [200]> » را برمیگرداند. کد پاسخ 200 به معنی «OK» است و نشان میدهد که درخواست با موفقیت ارسال و دریافت شده. پیغام پاسخ را میتوان با ساخت شیء مخصوص و استفاده از تابع print(object.status_code) مشاهده کرد.
انواع کدهای وضعیت در HTTP
تعداد زیادی کد وضعیت، مانند مورد نمایش داده شده در بخش قبل وجود دارند. هر کدام از این کدها دارای معنی و مفهوم خاصی هستند. در فهرست زیر به کدهایی اشاره کردهایم که بیش از همه در پاسخ به درخواستها برگشت داده میشوند.
- کد 200 : به معنی «OK» است.
- کد 400 : به معنی «Bad Request» است. این کد زمانی برگشت داده میشود که سرور مقصد در درک درخواست ارسال شده توسط کلاینت با مشکل روبهرو شده باشد. به طور کلی این کد نشاندهنده آن است که سینتکس درخواست ارسال شده بدشکل یا غلط است. شاید کادربندی یا قالب پیام ارسال شده به عنوان درخواست نامعتبر باشد یا سایر مشکلاتی که به سینتکس پیام مربوط میشود.
- کد 401 : این کد به معنی «Unauthorized» است. کد 401 زمانی به کلاینت برگشت داده میشود که برای تکمیل کردن درخواست، نیاز به فراهم کردن اطلاعاتی معتبر است. برای دستیابی به دستورالعمل روش برطرف کردن این مشکل میتوانید به راهنمای خطای «HTTP 401 Unauthorized» در وب سایتهای مربوط به درخواستهای HTTP در اینترنت مراجعه کنید.
- کد 403 : این کد معنای «Forbidden» دارد. به معنای این که سرور به درستی درخواست را فهمیده است، اما هیچ اقدامی برای برآورده کردن پاسخ درخواست، انجام نمیدهد. در مواردی که مدارک لازم به سرور ارائه شدهاند، کد 403 به معنای این است که حساب کاربری ارسال کننده درخواست، مجوزهای لازم و معتبر را برای دیدن این محتوا ندارد.
- کد 404 : این کد به معنای «Not found» است. یعنی این که سرور پیغام را به درستی تحویل گرفته اما نمیتواند پاسخ متناظر با درخواست را پیدا کند. شاید URL مورد اشاره در Request، دیگر موجود یا معتبر نباشد. بعضی وقتها کد 404 برای پوشش دادن پاسخهای 403 بهکار برده میشوند. برای مثال، در زمانهای که سرور نمیخواهد دلایل رد کردن درخواست را به کلاینت اعلام کند. برای برطرف کردن این مشکل میتوانید از راهنمای موجود در وب سایتهای مربوط به درخواستهای HTTP در اینترنت استفاده کنید.
- کد 429 : این کد خطا، پیچیدهتر و مشکلتر است. کد 429 به معنای این است که کلاینت از اندازه محدودیت تحمیل شده توسط سرور تجاوز کرده است. در اصل یکی از دلایل رویدادن این خطا این است که سرور درحال دریافت درخواستهای بسیار زیادی از سمت کلاینت در واحد زمان است. در نتیجه به صورت موقت، دریافت درخواستهای بیشتر از آن کلاینت را ممنوع میکند. یکی از مثالها برای مدیریت چنین خطایی میتواند شبیه به کد پایین باشد.
1import requests
2import time
3
4response = requests.get('https://example.com/api')
5
6if response.status_code == 429:
7 retry_after = int(response.headers.get('Retry-After', 1))
8 print(f"Rate limit exceeded. Waiting {retry_after} seconds before retrying...")
9 time.sleep(retry_after)
10 response = requests.get('https://example.com/api')
در صورت نیاز میتوان درخواستهای GET را همراه با پارامترهای مشخص شدهای ارسال کرد. این پارامترها از همان منطقی استفاده میکنند که برای ساختاربخشی به URL به صورت دستی استفاده میشود. هر پارامتر بعد از علامت سوال به درخواست URL معمولی اضافه میشود. همچنین میتوان چندین پارامتر را با استفاده از علامت «& » از یکدیگر جدا کرد.
در کد زیر نحوه ارسال درخواست با کمک کتابخانه Requests نمایش داده شده است.
1payload = {'key1': 'value1', 'key2': 'value2'}
2requests.get('http://httpbin.org/', params=payload)
با نوشتن کد بالا، URL مورد استفاده در درخواست به شکل زیر ایجاد میشود.
1https://httpbin.org/get?key2=value2&key1=value1
با اینکه از کدهای وضعیت، دادههای مفیدی بدست میآوریم اما این کدها درباره محتوای بدست آمده اطلاعات زیادی را افشا نمیکنند. تا به اینجا فقط میدانیم که کدوضعیت، موفقیت یا شکست درخواست را نشان میدهد. همچنین در صورت با شکست روبهرو شدن درخواست، احتمالا دلیل آن را هم بیان میکند.
خواندن پاسخ ها
برای دیدن «شیء پاسخ» (Response Object) مربوط به درخواست ارسال شده توسط دستور GET در پایتون، باید متغیری ایجاد کنیم. به منظور سادهتر شدن کار، متغیر ایجاد شده را response نام گذاری میکنیم.
1response = requests.get('http://httpbin.org/')
در درخواستهای ارسال شده توسط زبان پایتون، مقدار timeout به صورت پیشفرض برابر با None قرار میگیرد. به این معنا که اگر پاسخی را دریافت نکردیم، اپلیکیشن طراحی شده میتواند برای مدت نامحدودی منتظر بماند.
البته بدون استفاده از کنسول هم میتوانیم به کد وضعیت دست پیدا کنیم. برای روی دادن همچنین اتفاقی، نیاز داریم که بخش خاصی از پاسخ را – status_code - چاپ کنیم. در کد زیر، روش استفاده از status_code نمایش داده شده است.
1print(response.status_code)
تا به اینجای کار، خروجی «<Response [200]> » شبیه به همان خروجیهایی است که قبلا دیدیم. توجه کنید که کدهای وضعیت دارای مقادیر بولینی هستند که به صورت پیشفرض به آنها تخصیص داده شدهاند. برای مثال کدها از شماره «200» تا «399» به عنوان مقدار True در نظر گرفته میشوند و موفقیت را نشان میدهند. درحالی که کدهای شماره «400» به بالا به عنوان False در نظر گرفته میشوند. کدهای بالاتر از شماره «400»، وقوع خطا در ارسال، پردازش یا پاسخ درخواست را نشان میدهند. استفاده کردن از کدهای وضعیت به عنوان مقادیر Boolean، میتواند برای بررسی موفقیت آمیز بودن پاسخ قبل از ادامه سایر فعالیتها مفید باشد.
برای خواندن محتوی پاسخ لازم است که با استفاده از تکه کد response.text به بخش متنی آن دسترسی پیدا کنیم. چاپ کردن خروجی، کل پاسخ را در پنجره مربوط به کنسول پایتون نمایش میدهد.
1print(response.text)
کتابخانه Requests به صورت خودکار تلاش میکند که بر اساس هِدِر HTTP، حدس دقیقی درباره رمزگذاری انجام دهد، بنابراین فراهم کردن مقداری برای رمزگذاری معمولا غیر ضروری است. شاید در موارد نادری نیاز شود که رمزگذاری تغییر کند. به منظور انجام این کار باید مقدار خاصی را برای آرگومان response.encoding تعریف کنیم. بعد از آن، در هربار اجرای عملیات فراخوانی، از مقدار مشخص شده جدید استفاده خواهد شد.
پاسخها را میتوان در قالب JSON هم رمزگشایی کرد. اما سایت HTTPbin پاسخی ارسال نمیکند که بتوان آن را در فرمت JSON رمزگشایی کرد. برای همین تلاش برای انجام اینکار باعث برخواستن خطای استثنا میشود.
با هدف توضیح دادن بیشتر این مطلب از API مربوط به Github استفاده میکنیم.
1response = requests.get('http://api.github.com')
2print(response.json())
استفاده از تابع .json() باعث برگردانده شدن شیء دیکشنری میشود که محتوی آن قابل دسترسی و جستوجو است. علاوه بر این، اگر بخواهیم که از فرمان cURL دادههایی را به شکل JSON استخراج کنیم، ميتوانیم از این ابزار برای تبدیل cURL به JSON استفاده کنیم.
استفاده از هدر درخواست در پایتون
هِدِر پاسخ بخش مهم دیگری از درخواست است. با اینکه این هِدِر شامل هیچ محتوایی از پیام اصلی نمیشود، اما اطلاعات بسیار مهمی میتوان از درون هِدِر پاسخ، بیرون کشید. هِدِر پاسخ شامل اطلاعات بسیار مهمی از قبیل موارد فهرست شده در زیر میشود.
- اطلاعاتی درباره سرور
- تاریخ
- رمزگذاری دادهها
- و غیره
با یک فراخوانی ساده هدر، میتوان تمام اطلاعات موجود در پاسخ اولیه را بدست آورد.
1print(response.headers)
همینطور که با فراخوانی تابع .json() شیء دیکشنری از اطلاعات درون هدر ایجاد میشود. تمام اطلاعات درون آن شیء دیکشنری، قابل دسترسی است. بنابراین، با اضافه کردن پارامترهای خاص به دستور فراخوانی میتوانیم بخشهای از اطلاعات درون پاسخ را به بیرون واکشی کنیم.
در کد زیر با افزودن پارامتر Date به اطلاعات مربوط به تاریخ در هدر پاسخ، دست پیدا کردهایم.
1print(response.headers['Date'])
دستوری که در کد بالا نمایش داده شده، تاریخ ذخیره شده در هدر پاسخ را نشان میدهد. تمام مقادیر به صورت غیر حساس به بزرگی و کوچکی حروف در نظر گرفته میشوند. بنابراین Requests بدون توجه به اینکه تاریخ به صورت «date» یا «Date» نوشته شده نتیجه یکسانی را تولید کرده و به بیرون برمیگرداند.
همچنین با استفاده از کتابخانه Requests در پایتون، میتوانیم هدرهای سفارشی خود را نیز ارسال کنیم.
برای انجام این کار، دوباره از اشیا شبیه به دیکشنری در پایتون استفاده میشود، با این تفاوت که این دفعه اطلاعات درون دیکشنری را باید به صورت دستی پُر کنیم. هدرها به عنوان پارامتر با روشی شبیه به هم به درخواست ارسال میشوند. برای بررسی ارسال موفقیتآمیز هدر درخواست، باید آرگومان response.request.headers را فراخوانی کنیم.
1import requests
2
3headers = {'user-agent': 'my-agent/1.0.1'}
4response = requests.get('http://httpbin.org/', headers=headers)
5print(response.request.headers)
اجرای کد بالا، اطلاعات هدر درخواست ارسال شده را همراه با کاربر مسئول به شکل my-agent/1.0.1 در کنسول پایتون نمایش میدهد. به عنوان قاعده کلی، توصیه شده است که اطلاعات کاربران عادی یا مسئول سیستم همراه با درخواست ارسال شوند. زیرا شاید بعضی از وبسایتها کد وضعیت 403 به معنی «Forbidden» را در صورت عدم شناسایی کاربر به عنوان پاسخ برگردانند.
هدرهای سفارشی HTTP معمولا برای اهداف عیبیابی یا آگاهی بخشی ارسال میشوند. User Agent-ها معمولا در پروژههای وب اسکرپینگ بهکار برده میشوند. با کمک هدرهای سفارشی در پروژههای وب اسکرپینگ میتوان محل ارسال درخواستهای ورودی را تغییر داد.
درخواست POST با کتابخانه Requests در پایتون
ارسال درخواست POST در پایتون، دومین متد بسیار پرکاربرد در HTTP است. این درخواستها برای ساخت منابع اطلاعاتی بر روی سرور با دادههای از پیش مشخص شده بهکار برده میشوند. ارسال درخواستهای POST به همان سادگی ارسال درخواست GET است.
1response = requests.post('https://httpbin.org/post', data = {'key':'value'})
البته همه متدهای HTTP – به غیر از متد HEAD – بدنه پاسخی را برمیگردانند که قابل دسترسی و خواندن است. بنابراین، پاسخهای ارسال شده به درخواستهای POST به همان روش پاسخهای ارسال شده به درخواستهای GET – یا هر متد دیگری – قابل خوانده شدن هستند.
1print(response.text)
به صورت واضح، پاسخها با نوع درخواستهای ساخته شده مرتبط هستند. برای مثال، پاسخ درخواست POST شامل اطلاعاتی درباره دادههای ارسال شده به سرور است..
در بیشتر موارد، احتمالا کافی نیست که فقط دادهها را درون درخواست POST مشخص کنیم. کتابخانه Requests در پایتون، آرگومانهایی را از اشیا دیکشنری میپذیرد که میتوانند برای ارسال دادههای توسعهیافتهتر بهکار برده شوند.
1payload = {'key1': 'value1', 'key2': 'value2'}
2response = requests.post('https://httpbin.org/post', data = payload)
درخواست جدید ساخته شده، «بخش اصلی پیام» (Payload Object) را به سرور مقصد ارسال میکند. بعضی وقتها ضروری است که درخواست POST را به صورت JSON ارسال کنیم. کتابخانه Requests در پایتون، برای انجام این کار، ویژگی افزودهای دارد. یعنی اینکه میتواند اطلاعات درخواست POST را به صورت خودکار به پیامهایی از جنس JSON تبدیل کند.
1import requests
2
3payload = {'key1': 'value1', 'key2': 'value2'}
4response = requests.post('https://httpbin.org/post', json = payload)
5print(response.json())
همینطور که در کد زیر میبینید، کتابخانه json به اسکریپت پایتونimport شده است.
1import json
2import requests
3
4payload = {
5 'key1': 'value1',
6 'key2': 'value2'}
7jsonData = json.dumps(payload)
8response = requests.post('https://httpbin.org/post', data = jsonData)
9print(response.json())
توجه کنید که آرگومان json در صورت استفاده از data یا files کنار گذاشته میشود. در هر درخواست POST که به صورت مجزا ارسال میشود، کتابخانه Requests فقط یکی از این سه گزینه – json یا data یا files - را میپذیرد.
سایر متدهای HTTP
همینطور که در ادامه خواهید دید یکی از روشهای حفظ امنیت ارتباطات استفاده از SSL در کنار پروتکلهای HTTP است. در این صورت پروتکل امن HTTPS به وجود میآید. پروتکل HTTPS یا «HyperText Transfer Protocol Secure»، پروتکل امنیتی است که برای انتقال اطلاعات بین کامپیوترها در شبکه اینترنت استفاده میشود. یعنی اینکه وظیفه انتقال امن داده از کامپیوتر کاربر به وبسرورها و برعکس را بر عهده دارد. این پروتکل از ترکیب دوتایی از HTTP و SSL/TLS تشکیل شده است. برای آشنایی با این پروتکل پیشنهاد میکنیم که فیلم رایگان پروتکل امن انتقال ابرمتن چیست؟
متدهای POST و GET بیشترین کاربرد را در میانگین استفاده توسط کاربران به خود اختصاص دادهاند. برای مثال، کاربران «Scraper API» فقط از این دو متد برای ارسال درخواستهای کاری – POST – و واکشی اطلاعات – GET – استفاده میکنند. اما هنوز روشهای بسیار زیاد دیگری نیز برای تعامل با سرورها از طریق HTTP وجود دارند.
در این بخش از مطلب چند مورد دیگر از این روشها را بررسی میکنیم.
متد PUT
این متد همه نسخههای فعلی منبع هدف را با محتوای ارسال شده جایگزین میکند.
با اینکه درخواستهای PUT و POST به ظاهر شبیه به یکدیگراند، اما درخواستهای PUT بیخطر هستند. به معنی اینکه حتی اگر چندین درخواست PUT پشت سرهم بفرستید، باز هم نتیجه یکسانی دریافت میکنید. زیرا هر درخواست باز هم همان منبع را بازنویسی خواهد میکند. در مقابل، درخواست POST برای هر درخواستی که ارسال میشود منبع جدیدی میسازد.
ارسال درخواستهای PUT شبیه به ارسال درخواست POST است. با این تفاوت که باید از تابع put() استفاده کنیم.
1response = requests.put('https://httpbin.org/post', data = {'key':'value'})
متد DELETE
متد DELETE تمام نسخههای موجود منبع هدف را که توسط URL مشخص شدهاند، حذف میکند.
این متد برای حذف منبع خاصی، درخواستی را به URL مشخص شده ارسال میکند. ارسال درخواست DELETE همانند ارسال سایر درخواستهای HTTP است. سینتکس خام مربوط به ارسال این درخواست در پایین، نمایش داده شده است.
1requests.delete(url, params={key: value}, args)
در کد زیر، به عنوان نمونه، درخواستی را از متد DELETE برای حذف کردن منبعdelete ارسال کردهایم.
1import requests
2# Making a DELETE request
3response = requests.delete('https://httpbin.org/delete')
میتوانیم کد وضعیت را برای بررسی پاسخ دریافت شده بررسی کنیم.
1print(response.status_code)
متد HEAD
تابع head() برای استفاده در متد HEAD بهکار برده میشود. این تابع برای گرفتن دادههای خاصی از وب سرور، درخواست ارسال میکند. تنها اطلاعاتی که در پاسخ به این متد، برمیگردند در ارتباط با خود وبسرور هستند. هیچ اطلاعاتی درباره محتوی برنمیگردد. اما نکته اینجاست که این متد کار خود را سریعتر از درخواست GET انجام میدهد. علاوه بر این توسعهدهندگان میتوانند اپلیکیشنی ایجاد کنند که به کمک آن اطلاعات اضافی یا مدارک لازم برای احراز هویت را به سرور ارسال کنند. در نتیجه، هدر سفارشی تولید شده توسط این نوع از اپلیکیشنها را میتوان با متد HEAD ارسال کرد.
سینتکس خام ارسال درخواست HEAD به صورت نمایش داده شده در پایین است.
1requests.head(url, **kwargs)
متد OPTIONS
این متد گزینههای ارتباطی را برای منبع هدف مشخص میکند.
متد options() «شیء پاسخ» (Response Object) خاصی را واکشی میکند. این شی پاسخ شامل دادهها و مشخصاتی مانند موارد فهرست شده در پایین است.
- محتوی پاسخ
- هدر
- رمزگذاری
- کوکیها
- و غیره
در کادر زیر سینتکس خام استفاده از تابع options() متعلق به کتابخانه Requests در پایتون را نمایش دادهایم.
1response = requests.options(url)
متد PATCH
درخواست PATCH فقط باید شامل تغییرات درون منبع باشد و به کل منبع اشاره نکند. این متد شبیه به درخواست PUT است اما بهجای جایگذاری کل منبع، دستورالعملهایی درون خود دارد که روش اصلاح و تغییر در منابع روی سرور را به صورت صحیح تعریف کردهاند. با این کار نسخه جدیدی از اطلاعات درون سرور به کمک متد PATCH تولید میشود.
در کادر زیر سینتکس خام ارسال درخواست PATCH را نمایش دادهایم.
1requests.patch(url, params={key: value}, args)
همه متدهای HTTP که در بالا فهرست شدهاند، به ندرت بیرون از سامانههای مدیریت سرور، توسعه وب اپلیکیشنها و عیبیابی بهکار برده میشوند. کاربر معمولی اینترنت تقریبا بر روی هیچ سایتی مجوزهای استفاده از درخواستهایی مانند DELETE یا PUT را نخواهد داشت. سایر متدهای HTTP بیشتر برای آزمایش کارایی وبسایتها بهکار برده میشوند، که اغلب خارج از حوزه علاقهمندی کاربران معمولی اینترنت است.
البته پُراستفادهترین درخواست – متد GET – به توسعهدهندگان اجازه میدهد که با استفاده از کتابخانه Requests در پایتون، دادهها را از API مورد نظر خود واکشی کنند.
در کادر زیر از تابع requests.get() برای ارسال درخواست GET در HTTP به سایت http://httpbin.org/ip استفاده کردهایم.
1response = requests.get("http://httpbin.org/ip")
الان میتوانیم از اشیا پاسخی، مانند status_code و content و text و json() را برای بدست آوردن اطلاعات بیشتر استفاده کنیم.
درخواست احراز هویت چیست؟
درخواست احراز هویت نوعی درخواست است که در آن فرستنده باید اطلاعات خاصی را برای احراز هویت خود به سرور ارسال کند. فقط بعد از احراز هویت حساب کاربری فرستنده توسط سرور است که فرستنده اجازه دسترسی به منابع درخواست شده در سرور را پیدا میکند. فرایند احراز هویت میتواند بین سایتها و سرورهای مختلف، فرق داشته باشد. اما معمولا شامل ارسال توکنهای خاص، اعتبار نامه یا مشخصات کاربری معتبر همراه با درخواست است.
ارسال داده همراه با درخواست احراز هویت
برای ارسال داده همراه با درخواست احراز هویت، در ابتدا نیاز داریم که مشخصات کاربری ضروری مربوط به تاييد هویت خود را بدست بیاوریم. بسته به API یا خدماتی که در حال کار با آن هستیم، این مرحله به احتمال زیاد تفاوت خواهد داشت. اما متدهای رایج شامل کلیدهای API و OAuth tokens و تکنیکهای احراز هویت ابتدایی میشوkد.
بعد از بدست آوردن اعتبارنامه لازم برای تایید هویت، میتوانیم از کتابخانه Requests در پایتون برای ارسال درخواست همراه با هدرهای احراز هویت مناسب استفاده کنیم. در کادر زیر، مثالی از روش ارسال درخواست POST همراه با پیام اصلی از جنس JSON و اطلاعاتی برای احراز هویتی با روش ابتدایی آن را پیادهسازی کردهایم.
برای تغییر دادن مقصد پیام اصلی خود میتوانیم به صورت دستی اطلاعاتی را به صورت رشتههای متنی به این URL اضافه کنیم.
1import requests
2
3url = 'https://example.com/api/data'
4payload = {'key1': 'value1', 'key2': 'value2'}
5auth = ('username', 'password')
6headers = {'Content-Type': 'application/json'}
7
8response = requests.post(url, json=payload, auth=auth, headers=headers)
9
10if response.status_code == 200:
11 print('Data sent successfully')
12else:
13 print('Error sending data:', response.text)
در مثال بالا، به ترتیب کارهای فهرست شده در زیر را انجام دادیم.
- ابتدا URL را تعریف کردهایم که باید درخواست به آن ارسال شود.
- سپس پیام اصلی خود را تعریف کردهایم که باید به فرمت JSON تبدیل شود.
- همچنین برای استفاده از تکینک پایه و ابتدایی احراز هویت اطلاعات کاربری یا اعتبارنامه خود را مشخص کردهایم. در واقع نام کاربری و رمز عبور خود را در این مرحله برای ارائه به درخواست فراهم کردهایم.
- در نهایت هم هدر نوع محتوی خود را برای مشخص کردن اینکه بسته اصلی پیام در قالب JSON طراحی شده، تنظیم کردیم.
سپس از تابع requests.POST() برای ارسال درخواست همراه با هدرهای احراز هویت و بسته اصلی پیام در قالب JSON استفاده کردیم. اگر درخواست ارسال شده موفقیتآمیز بود – به معنی اینکه در پاسخ کد وضعیت 200 دریافت کنیم – پیغام موفقیت را بر روی کنسول پایتون چاپ میکنیم. در غیر این صورت پیغام خطایی را به همراه متن پاسخ دریافت شده چاپ میکنیم.
واکشی داده ها به وسیله درخواست های تایید شده
واکشی دادهها به وسیله درخواستهای تایید شده شبیه به ارسال دادهها است. اما بهجای فرستادن بستههای حاوی پیام، برای گرفتن داده به سرور درخواست میفرستیم. همچنین به منظور دسترسی به منابع درخواست شده باید اطلاعات مناسبی را برای فرایند تایید اعتبار فراهم کنیم.
مثالی را در کادر زیر، برای واکشی دادهها به وسیله درخواستهای تایید شده با استفاده از متد GET و کلید API پیادهسازی کردهایم.
1import requests
2
3url = 'https://example.com/api/data'
4api_key = 'your-api-key'
5headers = {'Authorization': f'Bearer {api_key}'}
6
7response = requests.get(url, headers=headers)
8
9if response.status_code == 200:
10 data = response.json()
11 print('Data retrieved successfully:', data)
12else:
13 print('Error retrieving data:', response.text)
در مثال بالا آدرس URL مورد نظر برای فراخوانی دادهها را تعریف کرده و همچنین کلید API خود را با استفاده از هدر احراز هویت و نوع توکن Bearer ایجاد کردیم. سپس، برای احراز هویت لازم است که درخواستی با هدرهای مناسب ارسال کنیم. این درخواست را با کمک متد requests.get() ارسال میکنیم. اگر درخواست ارسال شده با موفقیت به نتیجه رسید، دادههای فراخوانی شده را با کمک دستور print() چاپ میکنیم و در غیر این صورت پیغام خطایی را همراه با متن پاسخ چاپ خواهیم کرد.
راستی آزمایی گواهی SSL
در محیطهای کاری امروزی برای محافظت از محرمانه بودن و یکپارچگی دادهها، حفظ امنیت ارتباطات، بین سیستمهای مختلف بسیار ضروری است. استفاده کردن از گواهیهای SSL/TLS که برای برقراری ارتباطات رمزنگاری شده بین سامانههای کامیپوتری استفاده میشوند، یکی از تکنیکها برای تضمین ارتباط امن است.
«راستی آزمایی SSL» یا (SSL Verification) فرایندی است که موجودیت سرور قابل اتصال را بررسی میکند. همچنین گواهی SSL/TLS ارائه شده توسط سرور را نیز اعتبارسنجی میکند. تایید اعتبار SSL برای جلوگیری از حملات «مرد میانی» (Man In The Middle) ضروری است. در این نوع از حملات، فرد مهاجم ارتباطات بین دو سامانه مختلف را استراق سمع کرده و دادههای تحویل داده شده را تغییر میدهد.
کتابخانه Requests در پایتون، رابط سادهای، برای ایجاد درخواستهای HTTP فراهم میکند. خود کتابخانه، گواهیهای SSL را به صورت پیشفرض ارائه میدهد تا از امنیت ارتباطات مطمئن شود. اما در بعضی از موقعیتها مانند زمان کار با گواهیهای Self-Signed یا امتحان کارآیی سیستم بر روی سرور محلی، شاید لازم شود که فرایند راستی آزمایی گواهی SSL را غیر فعال کنیم.
برای اینکه بتوانیم فرایند راستی آزمایی گواهی SSL را در کتابخانه Requests غیر فعال کنیم، باید مقدار آرگومان verify را برابر با False قرار دهیم. در کادر زیر مثالی از درخواست GET به سرور را مشاهده میکنید. در این مثال از SSL استفاده نمیکنیم. در واقع راستی آزمایی گواهی SSL را غیر فعال کردهایم.
1import requests
2
3url = 'https://example.com/api/data'
4response = requests.get(url, verify=False)
5
6if response.status_code == 200:
7 print('Data retrieved successfully')
8else:
9 print('Error retrieving data:', response.text)
برای امکان استفاده از اتصالها به صورت امن، کتابخانه Requests در پایتون به طور پیشفرض تأیید اعتبار SSL را فعال کرده است. اگر گواهی SSL/TLS سرور نامعتبر باشد، کتابخانه خطای استثنای CertificateError را برمیگرداند. اگرچه شاید مواردی وجود داشته باشند که ترجیح دهید گاهی SSL/TLS سفارشی خود را بسازید یا اینکه از بسته نرمافزاری «صادر کننده گواهی» (Certificate Authority | CA) سفارشی خودتان استفاده کنید.
با هدف فعال کردن، سامانه «راستی آزمایی گواهی SSL» یا (SSL Certificate Verification) با استفاده از CA سفاشی، باید از آرگومان verify برای دادن مسیر بسته نرمافزاری CA استفاده کنید. در کادر زیر مثالی درباره استفاده از بسته CA سفارشی پیادهسازی کردهایم. در این مثال از بسته CA سفارشی برای ارسال درخواست GET استفاده میکنیم. این درخواست به سمت سروری ارسال میشود که عملکرد تایید اعتبار SSL در آن فعال است.
1import requests
2
3url = 'https://example.com/api/data'
4ca_bundle = '/path/to/ca/bundle.crt'
5response = requests.get(url, verify=ca_bundle)
6
7if response.status_code == 200:
8 print('Data retrieved successfully')
9else:
10 print('Error retrieving data:', response.text)
Bearer Token
Bearer Token معمولا برای احراز هویت و تخصیص مجوز در API-ها استفاده میشود. با استفاده از مخزن کتابخانه Requests در پایتون، میتوانیم از Bearer Token استفاده کنیم. برای این کار باید آن را مانند هدر در درخواستهای HTTP خود وارد کنیم.
در کادر زیر مثالی درباره استفاده از Bearer Token برای ارسال درخواست GET به API فرضی پیادهسازی کردهایم.
1import requests
2
3url = 'https://example.com/api/data'
4token = 'Bearer my_access_token'
5headers = {'Authorization': token}
6response = requests.get(url, headers=headers)
7
8if response.status_code == 200:
9 data = response.json()
10 print('Data retrieved successfully')
11else:
12 print('Error retrieving data:', response.text)
در مثال بالا، برای ارسال درخواست GET، چند کار را به صورت مجزا در کنار یکدیگر انجام دادهایم.
- در خط سوم: URL هدفمندی را برای نقطه پایانی API تعریف کردهایم. دادههای خود را از این مقصد فراخوانی میکنیم.
- در خط چهارم و پنجم: با استفاده از بخش Authorization و آرگومان headers بسته Bearer Token خود را در هدر قرار دادیم.
- در خط ششم: از تابع get() متعلق به کتابخانه Requests در پایتون برای ارسال درخواست استفاده کردیم.
- در خطوط هشتم و نهم: اگر درخواست ارسال شده با موفقیت به مقصد رسید – کد وضعیت 200 برگشت داده شد – از متد response.json() برای تبدیل کردن دادههای JSON برگشت داده شده از API به شیء پایتون استفاده میکنیم.
- در خطوط یازدهم و دوازدهم: در صورتی که درخواست ارسال شده با شکست روبهرو شد، کد وضعیت و پیغام خطای مناسبی را برای نمایش به کاربر چاپ میکنیم.
جمع بندی
کتابخانه Requests در پایتون، هم به طرز بسیار شگفت انگیزی قدرتمند است و هم کاربری بسیار سادهای دارد. از این ابزار درجه یک برای ارسال درخواستهای HTTP استفاده میشود. معمولا دانستن اصول پایه برای ساخت اپلیکیشنها یا اسکریپتهای ساده کافی است. بنابراین با کمک اطلاعات منتشر شده در این مطلب میتوانید شروع به کار با کتابخانه Requests کرده و بیشتر نیازهای خود را برطرف کنید.
در این مطلب از مجله با کتابخانه Requests در پایتون آشنا شدیم. از پایهایترین اطلاعات مربوط به عملکرد و نحوه نصب این کتابخانه شروع کرده و سپس متدهای پرکاربرد و سادهای مانند GET و POST را بررسی کردیم. در نهایت هم تلاش کردیم که با مطالب پیشرفتهای مانند تکنیکها و مسائل مربوط به درخواستهای احراز هویت آشنا شویم. در آخر باید اشاره کنیم که تمام موارد بیان شده در مطلب را به کمک مثالهای کدنویسی شده ارائه دادهایم.
دیدگاهتان را بنویسید