وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

راهنمای ارسال درخواست HTTP در پایتون با urllib3

0 11
زمان لازم برای مطالعه: 8 دقیقه


معرفی

منابع روی وب تحت نوعی قرار گرفته اند آدرس وب (حتی اگر در دسترس نباشند)، اغلب به عنوان 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، نشان دهنده چگونگی انجام عملیات است. بسیار مهم است که بدانید کد وضعیتی که دریافت کرده اید به چه معناست، یا حداقل به طور کلی به چه معناست.

آیا مشکلی وجود دارد؟ اگر اینطور است، به دلیل درخواست، سرور یا من است؟

وجود دارد پنج گروه های مختلف از کدهای پاسخ:

  1. کدهای اطلاع رسانی (بین 100 تا 199)
  2. کدهای موفق (بین 200 و 299) – 200 رایج ترین است
  3. تغییر مسیر کدها (بین 300 تا 399)
  4. کدهای خطای مشتری (بین 400 و 499) – 404 رایج ترین است
  5. کدهای خطای سرور (بین 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

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید