http.client --- کلاینت پروتکل HTTP¶
کد منبع: Lib/http/client.py
این ماژول کلاسهایی را تعریف میکند که سمت کلاینت پروتکلهای HTTP و HTTPS را پیادهسازی میکنند. این ماژول معمولاً بهطور مستقیم استفاده نمیشود — ماژول urllib.request از آن برای مدیریت URLهایی که از HTTP و HTTPS استفاده میکنند، استفاده میکند.
همچنین ملاحظه نمائید
برای یک رابط کلاینت HTTP سطح بالاتر، بسته Requests توصیه میشود.
توجه
پشتیبانی از HTTPS تنها در صورتی در دسترس است که پایتون با پشتیبانی از SSL کامپایل شده باشد (از طریق ماژول ssl).
دسترسپذیری: not WASI.
این ماژول روی WebAssembly کار نمیکند یا در دسترس نیست. برای اطلاعات بیشتر سکوهای WebAssembly را ببینید.
این ماژول کلاسهای زیر را فراهم میکند:
- class http.client.HTTPConnection(host, port=None, [timeout, ]source_address=None, blocksize=8192)¶
یک نمونه
HTTPConnectionنشاندهنده یک تراکنش با یک سرور HTTP است. نمونهسازی آن باید با دادن یک میزبان و شماره پورت اختیاری انجام شود. اگر شماره پورتی داده نشود، پورت از رشته میزبان استخراج میشود، به شرطی که به شکلhost:portباشد، در غیر این صورت از پورت پیشفرض HTTP (۸۰) استفاده میشود. اگر پارامتر اختیاری timeout داده شود، عملیاتهای مسدودکننده (مانند تلاشهای اتصال) پس از آن تعداد ثانیه منقضی میشوند (اگر داده نشود، از تنظیم سراسری پیشفرض timeout استفاده میشود). پارامتر اختیاری source_address میتواند یک تاپل (host, port) باشد که بهعنوان آدرس مبدأ برای برقراری اتصال HTTP استفاده میشود. پارامتر اختیاری blocksize اندازه بافر را بر حسب بایت برای ارسال بدنه پیام شبهپرونده تنظیم میکند.برای مثال، فراخوانیهای زیر همگی نمونههایی ایجاد میکنند که به سرور در همان میزبان و پورت متصل میشوند:
>>> h1 = http.client.HTTPConnection('www.python.org') >>> h2 = http.client.HTTPConnection('www.python.org:80') >>> h3 = http.client.HTTPConnection('www.python.org', 80) >>> h4 = http.client.HTTPConnection('www.python.org', 80, timeout=10)
تغییر یافته در نسخهی 3.2: source_address افزوده شد.
تغییر یافته در نسخهی 3.4: پارامتر strict حذف شده است. «پاسخهای ساده» به سبک HTTP 0.9 دیگر پشتیبانی نمیشوند.
تغییر یافته در نسخهی 3.7: پارامتر blocksize افزوده شد.
- class http.client.HTTPSConnection(host, port=None, *, [timeout, ]source_address=None, context=None, blocksize=8192)¶
زیرکلاسی از
HTTPConnectionکه از SSL برای ارتباط با سرورهای امن استفاده میکند. پورت پیشفرض443است. اگر context مشخص شده باشد، باید نمونهای ازssl.SSLContextباشد که گزینههای مختلف SSL را توصیف میکند.برای اطلاعات بیشتر درباره بهترین شیوهها، لطفاً ملاحظات امنیتی را بخوانید.
تغییر یافته در نسخهی 3.2: source_address، context و check_hostname افزوده شدند.
تغییر یافته در نسخهی 3.2: این کلاس اکنون در صورت امکان (یعنی اگر
ssl.HAS_SNItrue باشد) از میزبانهای مجازی HTTPS پشتیبانی میکند.تغییر یافته در نسخهی 3.4: پارامتر strict حذف شد. دیگر از «پاسخهای ساده» به سبک HTTP 0.9 پشتیبانی نمیشود.
تغییر یافته در نسخهی 3.4.3: این کلاس اکنون بهطور پیشفرض تمام بررسیهای لازم برای گواهی و نام میزبان را انجام میدهد. برای بازگشت به رفتار قبلی و تأییدنشده، میتوان
ssl._create_unverified_context()را به پارامتر context ارسال کرد.تغییر یافته در نسخهی 3.8: این کلاس اکنون
ssl.SSLContext.post_handshake_authدر TLS 1.3 را برای context پیشفرض یا زمانی که cert_file همراه با یک context سفارشی ارسال میشود، فعال میکند.تغییر یافته در نسخهی 3.10: این کلاس اکنون هنگامی که هیچ context ارائه نشود، یک افزونه ALPN با نشانگر پروتکل
http/1.1ارسال میکند. در context سفارشی باید پروتکلهای ALPN باset_alpn_protocols()تنظیم شوند.تغییر یافته در نسخهی 3.12: پارامترهای منسوخ key_file، cert_file و check_hostname حذف شدهاند.
- class http.client.HTTPResponse(sock, debuglevel=0, method=None, url=None)¶
کلاسی که نمونههای آن پس از اتصال موفق برگردانده میشوند. این کلاس مستقیماً توسط کاربر نمونهسازی نمیشود.
تغییر یافته در نسخهی 3.4: پارامتر strict حذف شد. دیگر از «پاسخهای ساده» (Simple Responses) به سبک HTTP 0.9 پشتیبانی نمیشود.
این ماژول تابع زیر را فراهم میکند:
- http.client.parse_headers(fp)¶
سرآیندها را از یک اشارهگر پرونده fp که نشاندهندهی یک درخواست/پاسخ HTTP است، تجزیه کنید. پرونده باید یک خوانندهی
BufferedIOBaseباشد (یعنی متنی نباشد) و باید سرآیندای معتبر به سبک RFC 5322 ارائه کند.این تابع یک نمونه از
http.client.HTTPMessageرا برمیگرداند که فیلدهای سرآیند را نگه میدارد، اما باری ندارد (مشابهHTTPResponse.msgوhttp.server.BaseHTTPRequestHandler.headers). پس از بازگشت، اشارهگر پرونده fp آماده خواندن بدنه HTTP است.توجه
parse_headers()خط شروع (start-line) یک پیام HTTP را تجزیه نمیکند؛ فقط سطرهایName: valueرا تجزیه میکند. پرونده باید برای خواندن این سطرهای فیلد آماده باشد، بنابراین خط اول باید پیش از فراخوانی این تابع مصرف شده باشد.
استثناهای زیر در صورت لزوم پرتاب میشوند:
- exception http.client.HTTPException¶
کلاس پایه سایر استثناهای این ماژول. این یک زیرکلاس از
Exceptionاست.
- exception http.client.NotConnected¶
زیرکلاسی از
HTTPException.
- exception http.client.InvalidURL¶
زیرکلاسی از
HTTPException، که اگر پورتی داده شود و آن پورت غیرعددی یا خالی باشد، پرتاب میشود.
- exception http.client.UnknownProtocol¶
زیرکلاسی از
HTTPException.
- exception http.client.UnknownTransferEncoding¶
زیرکلاسی از
HTTPException.
- exception http.client.UnimplementedFileMode¶
زیرکلاسی از
HTTPException.
- exception http.client.IncompleteRead¶
زیرکلاسی از
HTTPException.
- exception http.client.ImproperConnectionState¶
زیرکلاسی از
HTTPException.
- exception http.client.CannotSendRequest¶
زیرکلاسی از
ImproperConnectionState.
- exception http.client.CannotSendHeader¶
زیرکلاسی از
ImproperConnectionState.
- exception http.client.ResponseNotReady¶
زیرکلاسی از
ImproperConnectionState.
- exception http.client.BadStatusLine¶
زیرکلاسی از
HTTPException. زمانی پرتاب میشود که یک سرور با کد وضعیت HTTP پاسخ دهد که ما آن را درک نمیکنیم.
- exception http.client.LineTooLong¶
زیرکلاسی از
HTTPException. زمانی پرتاب میشود که یک خط بیش از حد طولانی در پروتکل HTTP از سرور دریافت شود.
- exception http.client.RemoteDisconnected¶
زیرکلاسی از
ConnectionResetErrorوBadStatusLine. زمانی توسطHTTPConnection.getresponse()پرتاب میشود که تلاش برای خواندن پاسخ منجر به خوانده نشدن هیچ دادهای از اتصال شود؛ این موضوع نشان میدهد که طرف مقابل، اتصال را بسته است.اضافه شده در نسخهی 3.5: پیشتر،
BadStatusLine('')پرتاب میشد.
ثابتهای تعریفشده در این ماژول عبارتاند از:
- http.client.HTTP_PORT¶
پورت پیشفرض پروتکل HTTP (همیشه
80).
- http.client.HTTPS_PORT¶
پورت پیشفرض برای پروتکل HTTPS (همیشه
443).
- http.client.responses¶
این دیکشنری کدهای وضعیت HTTP 1.1 را به نامهای W3C نگاشت میکند.
مثال:
http.client.responses[http.client.NOT_FOUND]برابر با'Not Found'است.
برای مشاهدهی فهرستی از کدهای وضعیت HTTP که در این ماژول بهصورت ثابت در دسترس هستند، کدهای وضعیت HTTP را ببینید.
اشیای HTTPConnection¶
نمونههای HTTPConnection دارای متدهای زیر هستند:
- HTTPConnection.request(method, url, body=None, headers={}, *, encode_chunked=False)¶
با این کار، یک درخواست با استفاده از متد درخواست HTTP method و URI درخواست url به سرور ارسال میشود. url ارائهشده باید یک مسیر مطلق باشد تا با RFC 2616 §5.1.2 مطابقت داشته باشد (مگر در صورت اتصال به یک سرور پراکسی HTTP یا استفاده از متدهای
OPTIONSیاCONNECT).If body is specified, the specified data is sent after the headers are finished. It may be a
str, a bytes-like object, an open file object, or an iterable ofbytes. If body is a string, it is encoded as ISO-8859-1, the default for HTTP. If it is a bytes-like object, the bytes are sent as is. If it is a file object, the contents of the file is sent; this file object should support at least theread()method. If the file object is an instance ofio.TextIOBase, the data returned by theread()method will be encoded as ISO-8859-1, otherwise the data returned byread()is sent as is. If body is an iterable, the elements of the iterable are sent as is until the iterable is exhausted.آرگومان headers باید یک نگاشت از سرآیندهای HTTP اضافی برای ارسال همراه با درخواست باشد. برای مطابقت با RFC 2616 §5.1.2 باید یک سرآیند Host ارائه شود (مگر اینکه به یک سرور پراکسی HTTP متصل شوید یا از متدهای
OPTIONSیاCONNECTاستفاده کنید).اگر headers نه شامل Content-Length و نه شامل Transfer-Encoding باشد، اما بدنهای برای درخواست وجود داشته باشد، یکی از آن فیلدهای سرآیند بهطور خودکار اضافه خواهد شد. اگر body برابر
Noneباشد، سرآیند Content-Length برای متدهایی که انتظار بدنه دارند (PUT،POSTوPATCH) روی0تنظیم خواهد شد. اگر body یک رشته یا یک شیء شبهبایت باشد که در عین حال یک پرونده نیست، سرآیند Content-Length برابر طول آن تنظیم خواهد شد. هر نوع دیگری از body (بهطور کلی پروندهها و پیمایشپذیرها) بهصورت کدگذاری تکهای (chunk-encoded) درخواهد آمد و سرآیند Transfer-Encoding بهطور خودکار بهجای Content-Length تنظیم خواهد شد.آرگومان encode_chunked تنها زمانی مرتبط است که Transfer-Encoding در headers مشخص شده باشد. اگر encode_chunked برابر
Falseباشد، شیء HTTPConnection فرض میکند که تمام کدگذاریها توسط کد فراخوان مدیریت میشود. اگرTrueباشد، بدنه بهصورت تکهای (chunk-encoded) کدگذاری میشود.برای مثال، جهت انجام یک درخواست
GETبهhttps://docs.python.org/3/:>>> import http.client >>> host = "docs.python.org" >>> conn = http.client.HTTPSConnection(host) >>> conn.request("GET", "/3/", headers={"Host": host}) >>> response = conn.getresponse() >>> print(response.status, response.reason) 200 OK
توجه
کدگذاری انتقال تکهای (chunked transfer encoding) به نسخه 1.1 پروتکل HTTP افزوده شده است. مگر اینکه مشخص باشد سرور HTTP از HTTP 1.1 پشتیبانی میکند، فراخواننده باید یا Content-Length را مشخص کند، یا باید یک شیء
strیا شیء شبهبایت (bytes-like) را که همزمان پرونده هم نباشد، بهعنوان نمایش بدنه ارسال کند.توجه
توجه داشته باشید که پیش از آنکه بتوانید درخواست جدیدی را به سرور ارسال کنید، باید کل پاسخ را خوانده باشید یا اگر
getresponse()استثنایی غیر ازConnectionErrorپرتاب کرده باشد،close()را فراخوانی کرده باشید.تغییر یافته در نسخهی 3.2: body اکنون میتواند پیمایشپذیر باشد.
تغییر یافته در نسخهی 3.6: اگر هیچکدام از Content-Length و Transfer-Encoding در headers تنظیم نشده باشند، اشیاء پرونده و پیمایشپذیر body اکنون کدگذاری تکهای (chunk-encoded) میشوند. آرگومان encode_chunked اضافه شد. هیچ تلاشی برای تعیین Content-Length برای اشیاء پرونده انجام نمیشود.
- HTTPConnection.getresponse()¶
باید پس از ارسال درخواست، برای دریافت پاسخ از سرور فراخوانی شود. یک نمونه
HTTPResponseبرمیگرداند.تغییر یافته در نسخهی 3.5: اگر یک
ConnectionErrorیا یکی از زیرکلاسهای آن پرتاب شود، شیءHTTPConnectionهنگامی که درخواست جدیدی ارسال شود، برای اتصال مجدد آماده خواهد بود.توجه داشته باشید که این موضوع به استثناهای
OSErrorپرتابشده توسط سوکت زیرین اعمال نمیشود. در عوض، فراخواننده مسئول فراخوانیclose()روی اتصال موجود است.
- HTTPConnection.set_debuglevel(level)¶
سطح اشکالزدایی را تنظیم کنید. سطح اشکالزدایی پیشفرض
0است، به این معنا که هیچ خروجی اشکالزدایی چاپ نمیشود. هر مقدار بزرگتر از0باعث میشود تمام خروجیهای اشکالزدایی که در حال حاضر تعریف شدهاند، در stdout چاپ شوند.debuglevelبه هر شیء جدیدHTTPResponseکه ایجاد شود، منتقل میشود.اضافه شده در نسخهی 3.1.
- HTTPConnection.set_tunnel(host, port=None, headers=None)¶
میزبان و پورت را برای تونلزنی HTTP Connect تنظیم کنید. این کار امکان برقراری اتصال از طریق یک سرور پراکسی را فراهم میکند.
آرگومانهای host و port پایانهی اتصال تونلشده را مشخص میکنند (یعنی نشانی گنجاندهشده در درخواست CONNECT، نه نشانی سرور پراکسی).
آرگومان headers باید یک نگاشت از سرآیندهای HTTP اضافی برای ارسال بههمراه درخواست CONNECT باشد.
از آنجا که برای درخواست تونلسازی HTTP CONNECT از HTTP/1.1 استفاده میشود، طبق RFC، باید یک سرآیند HTTP
Host:ارائه شود که با قالب authority (authority-form) هدف درخواستی که بهعنوان مقصد درخواست CONNECT ارائه شده است مطابقت داشته باشد. اگر سرآیند HTTPHost:از طریق آرگومان headers ارائه نشود، یک سرآیند بهطور خودکار تولید و ارسال میشود.برای مثال، برای ایجاد تونل از طریق یک سرور پراکسی HTTPS که بهصورت محلی روی پورت ۸۰۸۰ اجرا میشود، نشانی پراکسی را به سازندهی
HTTPSConnectionو نشانی میزبانی را که در نهایت میخواهیم به آن دسترسی پیدا کنیم، به متدset_tunnel()میدهیم:>>> import http.client >>> conn = http.client.HTTPSConnection("localhost", 8080) >>> conn.set_tunnel("www.python.org") >>> conn.request("HEAD","/index.html")
اضافه شده در نسخهی 3.2.
تغییر یافته در نسخهی 3.12: درخواستهای تونلزنی HTTP CONNECT از پروتکل HTTP/1.1 استفاده میکنند، که از پروتکل HTTP/1.0 ارتقا یافته است. سرآیند HTTP
Host:برای HTTP/1.1 الزامی است، بنابراین اگر در آرگومان headers ارائه نشده باشد، یک سرآیند بهطور خودکار تولید و ارسال میشود.
- HTTPConnection.get_proxy_response_headers()¶
یک دیکشنری شامل سرآیندهای پاسخ دریافتشده از سرور پراکسی به درخواست CONNECT برمیگرداند.
اگر درخواست CONNECT ارسال نشده باشد، متد
Noneرا برمیگرداند.اضافه شده در نسخهی 3.12.
- HTTPConnection.connect()¶
به سرور مشخصشده در زمان ایجاد شیء متصل میشود. بهطور پیشفرض، اگر کلاینت از قبل اتصالی نداشته باشد، این متد بهصورت خودکار هنگام ارسال درخواست فراخوانی میشود.
یک رویداد حسابرسی
http.client.connectرا با آرگومانهایself،hostوportپرتاب میکند.
- HTTPConnection.close()¶
بستن اتصال به سرور.
- HTTPConnection.blocksize¶
اندازهی بافر بر حسب بایت برای ارسال بدنهی پیام شبهپرونده.
اضافه شده در نسخهی 3.7.
بهعنوان جایگزینی برای استفاده از متد request() که در بالا توضیح داده شد، میتوانید با استفاده از چهار تابع زیر، درخواست خود را گامبهگام ارسال کنید.
- HTTPConnection.putrequest(method, url, skip_host=False, skip_accept_encoding=False)¶
این باید اولین فراخوانی پس از برقراری اتصال به سرور باشد. این فراخوانی سطری را به سرور میفرستد که شامل رشتهی method، رشتهی url و نسخهی HTTP (
HTTP/1.1) است. برای غیرفعالسازی ارسال خودکار سرآیندهایHost:یاAccept-Encoding:(برای مثال برای پذیرش کدگذاریهای اضافی محتوا)، skip_host یا skip_accept_encoding را با مقادیری غیر از False تعیین کنید.
- HTTPConnection.putheader(header, argument[, ...])¶
این متد یک سرآیند به سبک RFC 822 را به سرور ارسال میکند. این متد سطری را به سرور میفرستد که شامل سرآیند، یک دونقطه و یک فاصله، و اولین آرگومان است. اگر آرگومانهای بیشتری داده شوند، سطرهای ادامه ارسال میشوند که هر یک شامل یک تب و یک آرگومان است.
- HTTPConnection.endheaders(message_body=None, *, encode_chunked=False)¶
یک خط خالی به سرور ارسال کنید تا پایان سرآیندها اعلام شود. میتوانید از آرگومان اختیاری message_body برای ارسال بدنه پیام مرتبط با درخواست استفاده کنید.
اگر encode_chunked برابر
Trueباشد، نتیجه هر تکرار از message_body بهصورت تکهای کدگذاری میشود (chunk-encoded)، همانطور که در RFC 7230، بخش 3.3.1 مشخص شده است. نحوه کدگذاری دادهها به نوع message_body وابسته است. اگر message_body رابط بافر را پیادهسازی کند، کدگذاری منجر به یک تکه واحد میشود. اگر message_body یکcollections.abc.Iterableباشد، هر تکرار از message_body منجر به یک تکه میشود. اگر message_body یک شیء پرونده باشد، هر فراخوانی.read()منجر به یک تکه میشود. این متد بهطور خودکار پایان دادههای کدگذاریشده بهصورت تکهای را بلافاصله پس از message_body اعلام میکند.توجه
به دلیل مشخصات کدگذاری تکهای (chunked encoding)، تکههای خالی که توسط بدنهی پیمایشگر تولید میشوند، توسط کدگذار تکهای (chunk-encoder) نادیده گرفته میشوند. این برای جلوگیری از خاتمه زودهنگام خواندن درخواست توسط سرور هدف به دلیل کدگذاری نادرست است.
تغییر یافته در نسخهی 3.6: پشتیبانی از کدگذاری تکهای (chunked encoding) و پارامتر encode_chunked افزوده شد.
- HTTPConnection.send(data)¶
داده را به سرور ارسال میکند. این متد باید فقط پس از فراخوانی متد
endheaders()و پیش از فراخوانیgetresponse()بهطور مستقیم استفاده شود.یک رویداد حسابرسی
http.client.sendرا با آرگومانهایselfوdataپرتاب میکند.
اشیاء HTTPResponse¶
یک نمونه از HTTPResponse پاسخ HTTP از سرور را دربر میگیرد. این نمونه دسترسی به سرآیندهای درخواست و بدنهی موجودیت را فراهم میکند. پاسخ یک شیء پیمایشپذیر است و میتوان از آن در یک دستور with استفاده کرد.
تغییر یافته در نسخهی 3.5: رابط io.BufferedIOBase اکنون پیادهسازی شده است و تمام عملیات خواندن آن پشتیبانی میشود.
- HTTPResponse.read([amt])¶
بدنه پاسخ یا حداکثر تا amt بایت بعدی را میخواند و برمیگرداند.
- HTTPResponse.readinto(b)¶
حداکثر len(b) بایت بعدی از بدنه پاسخ را در بافر b میخواند. تعداد بایتهای خواندهشده را برمیگرداند.
اضافه شده در نسخهی 3.3.
- HTTPResponse.getheader(name, default=None)¶
مقدار سرآیند name را برمیگرداند، یا اگر سرآیندی مطابق با name وجود نداشته باشد، default را برمیگرداند. اگر بیش از یک سرآیند با نام name وجود داشته باشد، تمام مقادیر را که با ', ' به هم پیوستهاند برمیگرداند. اگر default هر پیمایشپذیری بهجز یک رشته تنها باشد، عناصر آن نیز به همین ترتیب با ویرگول به هم پیوسته و برگردانده میشوند.
- HTTPResponse.getheaders()¶
فهرستی از تاپلهای (سرآیند، مقدار) برمیگرداند.
- HTTPResponse.fileno()¶
filenoسوکت زیرین را برمیگرداند.
- HTTPResponse.msg¶
یک نمونه
http.client.HTTPMessageکه شامل سرآیندهای پاسخ است.http.client.HTTPMessageزیرکلاسی ازemail.message.Messageاست.
- HTTPResponse.version¶
نسخهی پروتکل HTTP که سرور از آن استفاده میکند. 10 برای HTTP/1.0 و 11 برای HTTP/1.1.
- HTTPResponse.url¶
URL منبع واکشیشده، معمولاً برای تشخیص اینکه آیا یک تغییرمسیر دنبال شده است استفاده میشود.
- HTTPResponse.headers¶
سرآیندهای پاسخ در قالب یک نمونه از
email.message.EmailMessage.
- HTTPResponse.status¶
کد وضعیت برگرداندهشده توسط سرور.
- HTTPResponse.reason¶
عبارت دلیل برگرداندهشده از سوی سرور.
- HTTPResponse.debuglevel¶
یک قلاب اشکالزدایی . اگر
debuglevelبزرگتر از صفر باشد، در حین خوانده و تجزیه شدن پاسخ، پیامها در stdout چاپ خواهند شد.
- HTTPResponse.closed¶
اگر جریان بسته باشد،
Trueاست.
مثالها¶
در اینجا یک نشست نمونه آمده است که از متد GET استفاده میکند:
>>> import http.client
>>> conn = http.client.HTTPSConnection("www.python.org")
>>> conn.request("GET", "/")
>>> r1 = conn.getresponse()
>>> print(r1.status, r1.reason)
200 OK
>>> data1 = r1.read() # This will return entire content.
>>> # The following example demonstrates reading data in chunks.
>>> conn.request("GET", "/")
>>> r1 = conn.getresponse()
>>> while chunk := r1.read(200):
... print(repr(chunk))
b'<!doctype html>\n<!--[if"...
...
>>> # Example of an invalid request
>>> conn = http.client.HTTPSConnection("docs.python.org")
>>> conn.request("GET", "/parrot.spam")
>>> r2 = conn.getresponse()
>>> print(r2.status, r2.reason)
404 Not Found
>>> data2 = r2.read()
>>> conn.close()
در اینجا یک نشست نمونه آمده است که از متد HEAD استفاده میکند. توجه داشته باشید که متد HEAD هرگز هیچ دادهای را برنمیگرداند.
>>> import http.client
>>> conn = http.client.HTTPSConnection("www.python.org")
>>> conn.request("HEAD", "/")
>>> res = conn.getresponse()
>>> print(res.status, res.reason)
200 OK
>>> data = res.read()
>>> print(len(data))
0
>>> data == b''
True
در اینجا یک نشست نمونه آمده است که از متد POST استفاده میکند:
>>> import http.client, urllib.parse
>>> params = urllib.parse.urlencode({'@number': 12524, '@type': 'issue', '@action': 'show'})
>>> headers = {"Content-type": "application/x-www-form-urlencoded",
... "Accept": "text/plain"}
>>> conn = http.client.HTTPConnection("bugs.python.org")
>>> conn.request("POST", "", params, headers)
>>> response = conn.getresponse()
>>> print(response.status, response.reason)
302 Found
>>> data = response.read()
>>> data
b'Redirecting to <a href="https://bugs.python.org/issue12524">https://bugs.python.org/issue12524</a>'
>>> conn.close()
درخواستهای HTTP PUT در سمت کلاینت بسیار شبیه به درخواستهای POST هستند. تفاوت تنها در سمت سرور است، جایی که سرورهای HTTP اجازه میدهند منابع از طریق درخواستهای PUT ایجاد شوند. لازم به ذکر است که متدهای HTTP سفارشی نیز در urllib.request.Request و با تنظیم ویژگی method مناسب مدیریت میشوند. در ادامه یک نشست نمونه آمده است که از متد PUT استفاده میکند:
>>> # This creates an HTTP request
>>> # with the content of BODY as the enclosed representation
>>> # for the resource http://localhost:8080/file
...
>>> import http.client
>>> BODY = "***filecontents***"
>>> conn = http.client.HTTPConnection("localhost", 8080)
>>> conn.request("PUT", "/file", BODY)
>>> response = conn.getresponse()
>>> print(response.status, response.reason)
200, OK
اشیای HTTPMessage¶
- class http.client.HTTPMessage(email.message.Message)¶
یک نمونه از http.client.HTTPMessage سرآیندهای یک پاسخ HTTP را نگه میدارد. این نمونه با استفاده از کلاس email.message.Message پیادهسازی شده است.