Python 3 中的 http.client 请求方法

Shi*_*lia 1 python-3.x

当我运行此代码时:

import http.client
hR = ["/index.html"]
conn = http.client.HTTPConnection("www.python.org", 80)
conn.connect()
conn.request("GET", hR)
response = conn.getresponse()
data = response.read()
print (data)
conn.close()
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Traceback (most recent call last):
  File "C:\Python32\files\fcon.py", line 5, in <module>
    conn.request("GET", hR)
  File "C:\Python32\lib\http\client.py", line 964, in request
    self._send_request(method, url, body, headers)
  File "C:\Python32\lib\http\client.py", line 992, in _send_request
    self.putrequest(method, url, **skips)
  File "C:\Python32\lib\http\client.py", line 877, in putrequest
    if url.startswith('http'):
AttributeError: 'list' object has no attribute 'startswith'
Run Code Online (Sandbox Code Playgroud)

此外,当我将第 3 行中的 URL 更改为“ http://python.org ”时,我收到了一个不同的错误:

Traceback (most recent call last):
  File "C:\Python32\files\fcon.py", line 4, in <module>
    conn.connect()
  File "C:\Python32\lib\http\client.py", line 721, in connect
    self.timeout, self.source_address)
  File "C:\Python32\lib\socket.py", line 380, in create_connection
    for res in getaddrinfo(host, port, 0, SOCK_STREAM):
socket.gaierror: [Errno 11001] getaddrinfo failed
Run Code Online (Sandbox Code Playgroud)

mat*_*ata 6

第一条错误消息告诉你它hR不应该是一个列表,而是一个字符串,这会起作用:

import http.client
hR = "/index.html"
conn = http.client.HTTPConnection("www.python.org", 80)
conn.connect()
conn.request("GET", hR)
response = conn.getresponse()
data = response.read()
print (data)
conn.close()
Run Code Online (Sandbox Code Playgroud)

然而,你将不会看到任何数据,因为python.org只能用HTTP回复301respons重定向到它的HTTPS页面,这http.client确实自动跟随。

你得到的第二个错误http://www.python.org是因为不是有效的主机名,www.python.org这里是正确的。

http.client是一个相当低级的 API,你应该考虑urllib.request改用,甚至更好的requests库。