در این مقاله از وبسایت راکت ما به بررسی ایجاد درخواستهای HTTP با استفاده از متدهای GET و POST میپردازیم. اما پیش از هر چیزی باید با خود مفهوم HTTP آشنایی داشته باشید و بدانید که به چه صورتی میتوانیم چنین فرایندی را پیادهسازی کنیم.
اگر با زبان برنامهنویسی پایتون آشنایی ندارید این مقاله نمیتواند چندان راهنمای خوبی دارد. در صورت علاقهمندی به زبان برنامهنویسی پایتون میتوانید دوره آموزشی رایگان برنامهنویسی پایتون را مشاهده کرده و سپس شروع به تحقیق در رابطه با مفاهیم پیچیدهتر و تخصصیتر مانند این مقاله نمایید.
HTTP به چه مفهومی اشاره دارد؟
HTTP به یکسری پروتکل و راه ارتباطی اشاره دارد که ما را قادر میسازد تا بتوانیم میان کلاینت و سرور یک خط ارتباطی ایجاد کنیم. HTTP این کار را با استفاده از الگوریتم درخواست-پاسخ انجام میدهد. به این صورت که همواره یک درخواست از طرف کلاینت (مرورگر، اپلیکیشن یا هر چیز دیگری) به سمت سرور ارسال شده و سرور پس از تجزیه و تحلیل نیازمندیهای درخواست، پرسشی مرتبط را برمیگرداند.
در این فرایند HTTP از دو متد یا روش متفاوت استفاده میکند که هر کدام براساس ساختاری که دارند رویکرد جداگانهای را برای این کار در نظر میگیرند. این دو روش عبارت هستند از: GET و POST.
متد GET: با استفاده از متد GET شما میتوانید درخواستهایی را برای دریافت دادهای خاص از سرور ارسال کنید. برای مثال در فرایند دانلود یک فایل از سرور از این متد استفاده میشود.
متد POST: با استفاده از متد POST شما میتوانید دادهای را برای پردازش به سرور ارسال کنید. برای مثال فرم عضویت یکی از مثالهای عملی از این متد است.
در دیاگرام زیر میتوانید بصورت عملی با این قضیه بهتر آشنا شوید. (توضیحات زیر تصویر را مطالعه کنید)
در این دیاگرام به زبان ساده دو متد GET و POST را به دو فرایند Upload و Download تقلیل دادهاند، که البته این کار برای سادهسازی مفهوم این دو متد به کار برده شده است. همانطور که مشاهده میکنید یک درخواست POST به همراه یکسری داده از طریق کلاینت به سمت سرور ارسال شده و PHP مانند یک زبان که قابلیت تجزیه و تحلیل و انجام پردازش روی داده را دارد آن را وارد یک فایل txt میکند. حال اگر کسی قصد دسترسی (دانلود) به این فایل را داشته باشد میتواند با استفاده از متد GET این کار را انجام دهد.
حال که با موضوعات ابتدایی و کلی HTTP و دو متد GET و POST آشنا شدیم بیایید در رابطه با نحوه پیادهسازی این موارد در پایتون صحبت کنیم.
برای اینکه بتوانید درخواستهای HTTP را ایجاد کنید شما نیاز به استفاده از کتابخانههای پایتونی دارید. برای این کار ما کتابخانههای متفاوتی مانند httplib، urllib و requests را داریم.
سادهترین و سرراستترین کتابخانهای که میتوانیم از بین سه مورد بالا نام ببریم، requests خواهد بود. به همین دلیل قصد داریم در این مقاله نیز از این کتابخانه استفاده کنیم.
برای اینکه این کتابخانه را نصب کنید کافیست از طریق pip عمل نمایید.
pip install requests
ایجاد درخواست GET
خب در وهله اول برای ایجاد یک درخواست GET میتوانید به سادگی زیر عمل کنید:
# importing the requests library
import requests
# api-endpoint
URL = "http://maps.googleapis.com/maps/api/geocode/json"
# location given here
location = "delhi technological university"
# defining a params dict for the parameters to be sent to the API
PARAMS = {'address':location}
# sending get request and saving the response as response object
r = requests.get(url = URL, params = PARAMS)
# extracting data in json format
data = r.json()
# extracting latitude, longitude and formatted address
# of the first matching location
latitude = data['results'][0]['geometry']['location']['lat']
longitude = data['results'][0]['geometry']['location']['lng']
formatted_address = data['results'][0]['formatted_address']
# printing the output
print("Latitude:%s\nLongitude:%s\nFormatted Address:%s"
%(latitude, longitude,formatted_address))
در مثال بالا عرض و طول جغرافیایی یک نقطه از طریق نقشه گوگل با استفاده از متد GET درخواست شده است. البته در مثال بالا ما از قدرت APIها نیز استفاده کردهایم. اگر با مفهوم API آشنایی ندارید میتوانید مقاله «RESTful API به زبان ساده چیست؟» را مطالعه کنید.
با خواندن این مطلب متوجه خواهید شد که خروجی دریافتی از این درخواست بصورت JSON خواهد بود. در رابطه با این قضیه نیز در مطلب گفته شده توضیحاتی ارائه داده میشود.
اگر بخواهیم بصورت ساده فرایند قطعه کد بالا را توضیح دهیم باید بگویم که در اولین خط ما کتابخانه requests را وارد پروژه کردهایم.
از آنجایی که پاسخ به درخواست GET معمولا با یکسری اطلاعات به صورت دیکشنری ارسال میشود نیاز است که اطلاعات را استخراج کنیم. به همین دلیل بسیار مهم است که پیش از دریافت اطلاعات ما یک دیکشنری آماده داشته باشیم.
PARAMS = {'address':location}
در خط کدهای بعدی ما از این دیکشنری در تابع get از کتابخانه requests استفاده میکنیم.
از آنجایی که دادههای دریافتی را نیاز است به JSON تبدیل کنیم تا بهتر مورد استفاده قرار بگیرد ما دادههای دریافتی را در قطعه کد زیر به JSON تبدیل میکنیم:
data = r.json()
ایجاد درخواست POST
از آنجایی که درخواست POST نیاز به نوشتن اطلاعات در سرور و ارتباط مستقیم با بخش پردازشی آن دارد کمی پیادهسازی این درخواست پیچیدهتر از متد GET است. به همین دلیل ابتدای کار ما به یک API و یک API Key نیاز داریم.
# importing the requests library
import requests
# defining the api-endpoint
API_ENDPOINT = "http://pastebin.com/api/api_post.php"
# your API key here
API_KEY = "XXXXXXXXXXXXXXXXX"
# your source code here
source_code = '''
print("Hello, world!")
a = 1
b = 2
print(a + b)
'''
# data to be sent to api
data = {'api_dev_key':API_KEY,
'api_option':'paste',
'api_paste_code':source_code,
'api_paste_format':'python'}
# sending post request and saving response as response object
r = requests.post(url = API_ENDPOINT, data = data)
# extracting response text
pastebin_url = r.text
print("The pastebin URL is:%s"%pastebin_url)
ما در قطعه کد بالا از وبسایت Pastebin.com برای پیادهسازی API استفاده میکنیم.
مهمترین قسمت قطعه کد بالا پیادهسازی دیکشنری زیر است:
data = {'api_dev_key':API_KEY,
'api_option':'paste',
'api_paste_code':source_code,
'api_paste_format':'python'}
در این قطعه کد همانطور که مشاهده میکنید API_KEY
و source_code
که در یک متغیر در کدهای بالاتر ذخیره شده است.
حال برای ایجاد درخواست Post نیاز است که از قطعه کد زیر در جهت اجرای این درخواست استفاده کنیم:
r = requests.post(url = API_ENDPOINT, data = data)
در نهایت برای دریافت دادهها از متغیر r
ما نیاز داریم که به بخش text
آن دسترسی پیدا کنیم. برای همین قطعه کد زیر را به کار میبریم تا پاسخ درستی را در خروجی دریافت کنیم:
pastebin_url = r.text
چند نکته مهم در رابطه با کلیت این مطلب
- با استفاده از متد Get تمام دادههای به کار برده شده در داخل url قرار خواهد گرفت. به همین دلیل میتوانیم تمام دادهها مورد نیاز را از طریق url دریافت کنیم. اما در متد post دادهها در داخل بدنه پیام درخواست http قرار میگیرد.
- در درخواست get ما محدودیت میزان دادهای داریم بنابراین در استفاده از این متد باید هشیارانهتر برخورد کنیم. اما ما چنین محدودیت و مشکلی را در درخواست post نداریم.
- برای ارسال درخواست Get شما تنها حق استفاده از کاراکترهای ascii را دارید. در متد post ما چنین محدودیتی را نخواهیم داشت.
- از آنجایی که دادهها در get در url قرار میگیرد معمولا از نظر امنیت نسبت به post ضعیفتر عمل میکند.
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید