كيف يمكنك إرسال طلب HTTP HEAD في Python 2؟


Answers

يمكن استخدام urllib2 لتنفيذ طلب الرأس. هذا أجمل قليلاً من استخدام httplib لأن urllib2 يوزع عنوان URL الخاص بك بدلاً من مطالبتك بتقسيم عنوان URL إلى اسم ومسار المضيف.

>>> import urllib2
>>> class HeadRequest(urllib2.Request):
...     def get_method(self):
...         return "HEAD"
... 
>>> response = urllib2.urlopen(HeadRequest("http://google.com/index.html"))

تتوفر الرؤوس عبر response.info () كما كان من قبل. ومن المثير للاهتمام ، يمكنك العثور على عنوان URL الذي تمت إعادة توجيهك إليه:

>>> print response.geturl()
http://www.google.com.au/index.html
Question

ما أحاول القيام به هنا هو الحصول على رؤوس عناوين URL المحددة حتى أتمكن من تحديد نوع MIME. أريد أن أكون قادرًا على رؤية ما إذا كان http://somedomain/foo/ سيعرض مستند HTML أو صورة بتنسيق JPEG على سبيل المثال. وبالتالي ، أحتاج إلى معرفة كيفية إرسال طلب HEAD حتى أتمكن من قراءة نوع MIME دون الحاجة إلى تنزيل المحتوى. هل يعرف أي شخص طريقة سهلة للقيام بذلك؟




كما جانبا ، عند استخدام httplib (على الأقل في 2.5.2) ، فإن محاولة قراءة استجابة طلب HEAD ستحجب (على readline) ثم تفشل لاحقاً. إذا لم تقم بإصدار قراءة على الاستجابة ، فأنت غير قادر على إرسال طلب آخر على الاتصال ، ستحتاج إلى فتح طلب جديد. أو قبول تأخير طويل بين الطلبات.




للتأكد من اكتمال الإجابة على Python3 المكافئ للإجابة المقبولة باستخدام httplib .

هو في الأساس نفس الكود فقط أن المكتبة لا تسمى httplib بعد الآن ولكن http.client

from http.client import HTTPConnection

conn = HTTPConnection('www.google.com')
conn.request('HEAD', '/index.html')
res = conn.getresponse()

print(res.status, res.reason)



ونهج آخر (على غرار إجابة باول):

import urllib2
import types

request = urllib2.Request('http://localhost:8080')
request.get_method = types.MethodType(lambda self: 'HEAD', request, request.__class__)

فقط لتجنب وجود طرق غير محدودة على مستوى المثال.




أعتقد أنه يجب ذكر مكتبة requests أيضًا.




Links