все Python 3http.clientпонятие
http.client.HTTPConnection
соединения
Одно HTTP-соединение с сервером: request() отправляет запрос, getresponse() возвращает ответ. Низкоуровневая основа urllib.request.
Синтаксис
conn = http.client.HTTPConnection(host, port=None, timeout=..., source_address=None); conn.request(method, url, body=None, headers={}); resp = conn.getresponse()
Хост передаётся без схемы: HTTPConnection('http://example.com') падает с InvalidURL «nonnumeric port», потому что всё после двоеточия считается портом. Конструктор ничего не соединяет — подключение происходит при первом request(), и ошибки сети (ConnectionRefusedError, TimeoutError) вылетают оттуда. Без timeout запрос может висеть вечно. На одном соединении запросы строго по очереди: ответ нужно дочитать read() до следующего request(), иначе ResponseNotReady или CannotSendRequest. Коды 4xx и 5xx исключений не дают — проверяйте resp.status.
Примеры
import http.client
conn = http.client.HTTPConnection('example.com', 8080, timeout=5)
print(conn.host, conn.port, conn.sock) # → example.com 8080 None — соединения ещё нет
try:
http.client.HTTPConnection('http://example.com')
except http.client.InvalidURL as e:
print(e) # → nonnumeric port: '//example.com'
import http.client
import socket
server, client = socket.socketpair()
server.sendall(b'HTTP/1.1 404 Not Found\r\nContent-Length: 4\r\n\r\nnope')
conn = http.client.HTTPConnection('example.com')
conn.sock = client # вместо сети — заранее записанный ответ
conn.request('GET', '/missing', headers={'Accept': 'text/plain'})
print(server.recv(1024).split(b'\r\n')[0]) # → b'GET /missing HTTP/1.1'
resp = conn.getresponse()
print(resp.status, resp.reason, resp.read()) # → 404 Not Found b'nope'
conn.close()
server.close()
См. также
Частые ошибки
Открыть в полном глоссарииdocs.python.orgСообщить о неточности