از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
راهنمای ارسال درخواست HTTP در پایتون با urllib3
سرفصلهای مطلب
معرفی
منابع روی وب تحت نوعی قرار گرفته اند آدرس وب (حتی اگر در دسترس نباشند)، اغلب به عنوان a URL (یکسان منبع یاب). این منابع اغلب توسط یک کاربر نهایی (بازیابی، به روز رسانی، حذف و غیره) با استفاده از پروتکل HTTP از طریق مربوطه روش های HTTP.
در این راهنما، ما نگاهی به روش استفاده از اهرم خواهیم داشت
urllib3
کتابخانه ای که به ما امکان می دهد درخواست های HTTP را از طریق پایتون به صورت برنامه نویسی ارسال کنیم.
توجه داشته باشید: این urllib3
ماژول فقط با پایتون 3.x قابل استفاده است.
HTTP چیست؟
HTTP (پروتکل انتقال ابرمتن) یک پروتکل انتقال داده است که معمولاً برای انتقال اسناد ابررسانه ای مانند HTML استفاده می شود، اما می تواند برای انتقال JSON، XML یا فرمت های مشابه نیز استفاده شود. آن در اعمال می شود سطح کاربردی از مدل OSI، در کنار پروتکل های دیگری مانند FTP (پروتکل انتقال فایل) و SMTP (پروتکل ساده انتقال نامه).
HTTP ستون فقرات شبکه جهانی وب است که امروزه آن را می شناسیم و وظیفه اصلی آن فعال کردن یک کانال ارتباطی بین مرورگرهای وب و وب سرورها، از طریق یک چرخه زندگی از درخواست های HTTP و پاسخ های HTTP – اجزای ارتباطی اساسی HTTP.
مبتنی است روی را مشتری-سرور مدل که در آن a درخواست های مشتری یک منبع، و سرور پاسخ می دهد با منبع – یا کمبود آن.
غیر معمول درخواست HTTP ممکن است چیزی شبیه به این باشد:
GET /tag/java/ HTTP/1.1
Host: rasanegar.com
Accept: */*
User-Agent: Mozilla/5.0 (platform; rv:geckoversion) Gecko/geckotrail Firefox/firefoxversion
اگر سرور پیدا می کند منبع ، هدر پاسخ HTTP حاوی داده ها خواهد بود روی چرخه درخواست/پاسخ چگونه پیش رفت:
HTTP/1.1 200 OK
Date: Thu, 22 Jul 2021 18:16:38 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
...
و بدن پاسخ حاوی منبع واقعی خواهد بود – که در این مورد یک HTML است page:
<!DOCTYPE html>
<html lang="en">
<head>
<meta name="twitter:title" content="رسانگار"/>
<meta name="twitter:description" content="Learn Python, Java, JavaScript/Node, Machine Learning, and Web Development through articles, code examples, and tutorials for developers of all skill levels."/>
<meta name="twitter:url" content="https://rasanegar.com"/>
<meta name="twitter:site" content="@rasanegar"/>
<meta name="next-head-count" content="16"/>
</head>
...
این urllib3 مدول
این urllib3
ماژول جدیدترین ماژول مرتبط با HTTP است که برای پایتون و جانشین آن توسعه یافته است urllib2
. از آپلود فایل با رمزگذاری چند قسمتی، gzip، ادغام اتصال و ایمنی رشته پشتیبانی می کند. معمولاً با Python 3.x از قبل نصب شده است، اما اگر برای شما اینطور نیست، به راحتی می توان آن را با:
$ pip install urllib3
می توانید نسخه خود را بررسی کنید urllib3
با دسترسی به __version__
از ماژول:
import urllib3
print(urrlib3.__version__)
به طور متناوب، می توانید از درخواست ها ماژول ، که ساخته شده است روی بالای
urllib3
. این شهودی تر و انسان محورتر است و به طیف وسیع تری از درخواست های HTTP اجازه می دهد. اگر می خواهید در مورد آن بیشتر بخوانید – راهنمای ما برای ماژول درخواست ها در پایتون را بخوانید.
کدهای وضعیت HTTP
هر زمان که یک درخواست HTTP ارسال می شود – پاسخ، به غیر از منبع درخواستی (در صورت موجود و در دسترس بودن)، همچنین حاوی یک کد وضعیت HTTP، نشان دهنده چگونگی انجام عملیات است. بسیار مهم است که بدانید کد وضعیتی که دریافت کرده اید به چه معناست، یا حداقل به طور کلی به چه معناست.
آیا مشکلی وجود دارد؟ اگر اینطور است، به دلیل درخواست، سرور یا من است؟
وجود دارد پنج گروه های مختلف از کدهای پاسخ:
- کدهای اطلاع رسانی (بین 100 تا 199)
- کدهای موفق (بین 200 و 299) – 200 رایج ترین است
- تغییر مسیر کدها (بین 300 تا 399)
- کدهای خطای مشتری (بین 400 و 499) – 404 رایج ترین است
- کدهای خطای سرور (بین 500 و 599) – 500 رایج ترین است
برای ارسال درخواست با استفاده از urllib3
، ما از نمونه ای استفاده می کنیم PoolManager
کلاس ، که از درخواست های واقعی برای ما مراقبت می کند – به زودی تحت پوشش قرار می گیرد.
تمام پاسخ ها به این درخواست ها در یک بسته بندی می شوند HTTPResponse
به عنوان مثال، که، به طور طبیعی، شامل status
از آن پاسخ:
import urllib3
http = urllib3.PoolManager()
response = http.request("GET", "http://www.rasanegar.com")
print(response.status)
اگر نتیجه باشد می توانید از این وضعیت ها برای تغییر منطق کد استفاده کنید 200 OK
، احتمالاً نیازی به انجام زیاد نیست. با این حال، اگر نتیجه یک است 405 Method Not Allowed
پاسخ – درخواست شما احتمالاً بد ساخته شده است.
با این حال، اگر یک وب سایت با یک پاسخ دهد
418 I'm a teapot
کد وضعیت ، البته نادر – این به شما این امکان را می دهد که با یک قوری نمی توانید قهوه را دم کنید. در عمل، این معمولاً به این معنی است که سرور این کار را نمی کند خواستن برای پاسخ به درخواست، و هرگز. اگر این یک توقف موقت برای درخواست های خاص بود – الف503 Service Unavailable
کد وضعیت بسیار مناسب تر است.
توجه داشته باشید: این 418 I'm a teapot
کد وضعیت یک کد وضعیت واقعی اما بازیگوش است که به عنوان یک شوخی اول آوریل اضافه شده است.
مدیر استخر
آ استخر اتصال حافظه پنهانی از اتصالات است که می تواند در صورت نیاز در درخواست های آینده مورد استفاده مجدد قرار گیرد و برای بهبود عملکرد هنگام اجرای چندین فرمان خاص استفاده می شود. به همین ترتیب – هنگام ارسال درخواست های مختلف، الف استخر اتصال ساخته شده است تا بتوان از اتصالات خاصی استفاده مجدد کرد.
urllib3
درخواست ها و ارتباطات آنها را از طریق ردیابی می کند ConnectionPool
و HTTPConnection
کلاس ها. از آنجایی که ساخت اینها با دست منجر به کدهای دیگ بخار زیادی می شود – می توانیم کل منطق را به PoolManager
، که به طور خودکار اتصالات ایجاد می کند و آنها را به استخر اضافه می کند. با تنظیم num_pools
آرگومان، میتوانیم تعداد استخرهایی را که استفاده میکند تعیین کنیم:
import urllib3
http = urllib3.PoolManager(num_pools=3)
response1 = http.request("GET", "http://www.rasanegar.com")
response2 = http.request("GET", "http://www.google.com")
فقط از طریق را PoolManager
، آیا می توانیم a ارسال کنیم request()
، عبور در فعل HTTP و آدرسی که در حال ارسال درخواست به آن هستیم. ناهمسان افعال متفاوت دلالت کند مقاصد – چه بخواهی GET
برخی مطالب، POST
آن را به یک سرور، PATCH
یک منبع موجود یا DELETE
یکی
روش ارسال درخواست های HTTP در پایتون با urllib3
در نهایت، بیایید نگاهی به روش ارسال انواع درخواست از طریق بیاندازیم urllib3
و روش تفسیر داده های برگشتی.
ارسال درخواست HTTP GET
یک HTTP GET درخواست زمانی مورد استفاده قرار می گیرد که یک کلاینت درخواست بازیابی داده ها از یک سرور را داشته باشد، بدون اینکه آن را به هیچ وجه، شکل یا شکلی تغییر دهد.
برای ارسال یک HTTP GET درخواست در پایتون، ما از request()
روش از PoolManager
به عنوان مثال، ارسال فعل HTTP مناسب و منبعی که برای آن درخواست ارسال می کنیم:
import urllib3
http = urllib3.PoolManager()
response = http.request("GET", "http://jsonplaceholder.typicode.com/posts/")
print(response.data.decode("utf-8"))
در اینجا، ما ارسال کردیم درخواست دریافت کنید به {JSON} جایبان. این وبسایتی است که دادههای جعلی JSON را تولید میکند که در بدنه پاسخ ارسال میشود. به طور معمول، وب سایت برای آزمایش درخواست های HTTP استفاده می شود روی، پاسخ را خنثی می کند.
این HTTPResponse
به عنوان مثال، یعنی ما response
جسم بدنه پاسخ را نگه می دارد. می توان به آن دسترسی پیدا کرد data
دارایی که الف است bytes
جریان از آنجایی که یک وب سایت ممکن است با یک رمزگذاری پاسخ دهد، ما برای آن مناسب نیستیم، و از آنجایی که می خواهیم آن را تبدیل کنیم bytes
به یک str
به هر حال – ما decode()
بدنه و آن را در UTF-8 رمزگذاری کنید تا مطمئن شوید که میتوانیم دادهها را به طور منسجم تجزیه کنیم.
اگر می خواهید بیشتر بخوانید، راهنمای ما در مورد تبدیل بایت به رشته در پایتون را بخوانید.
بالاخره ما print بدن پاسخ:
(
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
},
{
"userId": 1,
"id": 2,
"title": "qui est esse",
"body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
},
...
ارسال درخواست HTTP GET با پارامترها
به ندرت انجام می دهیم نه پارامترهای خاصی را به درخواست ها اضافه کنید. متغیرهای مسیر و پارامترهای درخواست بسیار متداول هستند و به ساختارهای پیوندی پویا و سازماندهی منابع اجازه می دهند. به عنوان مثال – ممکن است بخواهیم a را جستجو کنیم خاص اظهار نظر روی یک پست خاص از طریق یک API – http://random.com/posts/get؟id=1&commentId=1
.
به طور طبیعی، urllib3
به ما اجازه می دهد تا پارامترهایی را به آن اضافه کنیم گرفتن درخواست ها، از طریق fields
بحث و جدل. یک فرهنگ لغت از نام پارامترها و مقادیر آنها را می پذیرد:
import urllib3
http = urllib3.PoolManager()
response = http.request("GET",
"http://jsonplaceholder.typicode.com/posts/",
fields={"id": "1"})
print(response.data.decode("utf-8"))
این فقط یک شی را با یک باز می گرداند id
از 1
:
(
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}
)
درخواست HTTP POST
یک HTTP POST درخواست برای ارسال داده ها از سمت مشتری به سمت سرور استفاده می شود. رایج ترین استفاده از آن با آپلود فایل یا پر کردن فرم است، اما می توان از آن برای ارسال استفاده کرد هر داده ها به سرور، با بارگذاری:
import urllib3
http = urllib3.PoolManager()
response = http.request("POST", "http://jsonplaceholder.typicode.com/posts", fields={"title": "Created Post", "body": "Lorem ipsum", "userId": 5})
print(response.data.decode("utf-8"))
حتی اگر ما با یک آدرس وب در حال ارتباط هستیم، زیرا ما یک پیام را ارسال می کنیم POST
درخواست، fields
آرگومان اکنون داده هایی را که ارسال می شود مشخص می کند به سرور، بازیابی نشده است.
ما یک رشته JSON ارسال کرده ایم که یک شی را با a نشان می دهد title
، body
و userId
. این {JSON} جایبان خدمات همچنین عملکرد را کاهش می دهد موجودیت ها را اضافه کنید، بنابراین پاسخی را برمی گرداند و به ما اطلاع می دهد که آیا توانسته ایم آن را به پایگاه داده “اضافه کنیم” و شناسه از پست “ایجاد شده”:
{
"id": 101
}
درخواست حذف HTTP
در نهایت برای ارسال HTTP DELETE درخواست ها، ما به سادگی فعل to را تغییر می دهیم "DELETE"
و یک پست خاص را از طریق آن هدف قرار دهید id
. بیایید همه پست ها را با id
اس از 1..5
:
import urllib3
http = urllib3.PoolManager()
for i in range(1, 5):
response = http.request("DELETE", "http://jsonplaceholder.typicode.com/posts", fields={"id": i})
print(response.data.decode("utf-8"))
یک بدنه خالی برگردانده می شود، زیرا منابع حذف می شوند:
{}
{}
{}
{}
هنگام ایجاد یک REST API – احتمالاً می خواهید کد وضعیت و پیامی بدهید تا به کاربر اطلاع دهید که یک منبع با موفقیت حذف شده است.
ارسال درخواست HTTP PATCH
در حالی که می توانیم استفاده کنیم POST
درخواست برای به روز رسانی منابع، اگر آن را حفظ کنیم، عمل خوبی در نظر گرفته می شود POST
فقط برای درخواست پدید آوردن منابع در عوض، ما می توانیم یک را شلیک کنیم PATCH
درخواست به روز رسانی یک منبع موجود
بیایید اولین پست را دریافت کنیم و سپس آن را با یک پست جدید به روز کنیم title
و body
:
import urllib3
data = {
'title': 'Updated title',
'body': 'Updated body'
}
http = urllib3.PoolManager()
response = http.request("GET", "http://jsonplaceholder.typicode.com/posts/1")
print(response.data.decode('utf-8'))
response = http.request("PATCH", "https://jsonplaceholder.typicode.com/posts/1", fields=data)
print(response.data.decode('utf-8'))
این باید به این نتیجه برسد:
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}
{
"userId": 1,
"id": 1,
"title": "Updated title",
"body": "Updated body"
}
ارسال درخواست های امن HTTPS در پایتون با urllib3
این urllib3
ماژول همچنین تأیید SSL سمت سرویس گیرنده را برای اتصالات HTTP ایمن فراهم می کند. ما می توانیم با کمک ماژول دیگری به نام به این هدف برسیم certifi
، که بسته استاندارد گواهی موزیلا را ارائه می دهد.
نصب آن از طریق بسیار ساده است pip
:
$ pip install certifi
با certifi.where()
، ما به نصب شده اشاره می کنیم مرجع صدور گواهی (CA). این نهادی است که گواهی های دیجیتال صادر می کند که می توان به آن اعتماد کرد. همه این گواهی های قابل اعتماد در certifi
مدول:
import urllib3
import certifi
http = urllib3.PoolManager(ca_certs=certifi.where())
response = http.request("GET", "https://httpbin.org/get")
print(response.status)
اکنون، ما می توانیم یک را ارسال کنیم امن است درخواست به سرور
آپلود فایل ها با urllib3
استفاده کردن urllib3
، ما همچنین میتوانیم آپلود فایل ها به یک سرور برای آپلود فایل ها، داده ها را به صورت کدگذاری می کنیم multipart/form-data
، و نام فایل و همچنین محتویات آن را به صورت چند تایی ارسال کنید file_name: file_data
.
برای خواندن محتویات یک فایل، می توانیم از برنامه داخلی پایتون استفاده کنیم read()
روش:
import urllib3
import json
with open("file_name.txt") as f:
file_data = f.read()
resp = urllib3.request(
"POST",
"https://reqbin.com/post-online",
fields= {
"file": ("file_name.txt", file_data),
}
)
print(json.loads(resp.data.decode("utf-8"))("files"))
برای هدف مثال، اجازه دهید یک فایل به نام ایجاد کنیم file_name.txt
و مقداری محتوا اضافه کنید:
Some file data
And some more
حالا، وقتی اسکریپت را اجرا می کنیم، باید print بیرون:
{'file': 'Some file data\nAnd some more'}
وقتی فایل ها را با استفاده از urllib3
، پاسخ است data
حاوی الف "files"
ویژگی متصل به آن، که از طریق آن به آن دسترسی داریم resp.data.decode("utf-8")("files")
. برای اینکه خروجی کمی خواناتر شود، از json
ماژول برای بارگذاری پاسخ و نمایش آن به صورت رشته ای.
همچنین می توانید آرگومان سومی را به تاپل ارائه دهید که نوع MIME فایل آپلود شده را مشخص می کند:
... previous code
fields={
"file": ("file_name.txt", file_data, "text/plain"),
}
نتیجه
در این راهنما، نگاهی به روش ارسال درخواستهای HTTP با استفاده از آن انداختهایم urllib3
، یک ماژول قدرتمند پایتون برای رسیدگی به درخواست ها و پاسخ های HTTP.
ما همچنین نگاهی انداخته ایم به اینکه HTTP چیست، کدهای وضعیت را باید انتظار داشت و چگونه آنها را تفسیر کرد، و همچنین روش آپلود فایل ها و ارسال درخواست های امن با certifi
.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-09 14:33:05