Nuestro grupo especializado luego de muchos días de trabajo y recopilar de información, obtuvimos la respuesta, queremos que te sea de gran utilidad en tu trabajo.
Código fuente:Lib / http / client.py
Este módulo define clases que implementan el lado del cliente de los protocolos HTTP y HTTPS. Normalmente no se utiliza directamente: el módulo urllib.request
lo usa para manejar URL que usan HTTP y HTTPS.
Ver también
los Paquete de solicitudes se recomienda para una interfaz de cliente HTTP de nivel superior.
Nota
El soporte HTTPS solo está disponible si Python se compiló con soporte SSL (a través del ssl
módulo).
El módulo proporciona las siguientes clases:
class http.client.HTTPConnection(host, port=None, [timeout, ]source_address=None, blocksize=8192)
-
Un
HTTPConnection
instancia representa una transacción con un servidor HTTP. Se debe crear una instancia pasándole un host y un número de puerto opcional. Si no se pasa ningún número de puerto, el puerto se extrae de la cadena de host si tiene la formahost:port
, de lo contrario, se utiliza el puerto HTTP predeterminado (80). Si el opcional se acabó el tiempo se proporciona el parámetro, las operaciones de bloqueo (como los intentos de conexión) expirarán después de esa cantidad de segundos (si no se proporciona, se utiliza la configuración de tiempo de espera global predeterminada). El opcional Dirección de la fuente El parámetro puede ser una tupla de (host, puerto) para usar como dirección de origen desde la que se realiza la conexión HTTP. El opcional tamaño de bloque El parámetro establece el tamaño del búfer en bytes para enviar un cuerpo de mensaje similar a un archivo.Por ejemplo, todas las siguientes llamadas crean instancias que se conectan al servidor en el mismo host y puerto:
>>> 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)
Modificado en la versión 3.2: Dirección de la fuente fue añadido.
Modificado en la versión 3.4: los estricto se eliminó el parámetro. Las “Respuestas simples” de estilo HTTP 0.9 ya no son compatibles.
Modificado en la versión 3.7: tamaño de bloque se agregó el parámetro.
class http.client.HTTPSConnection(host, port=None, key_file=None, cert_file=None, [timeout, ]source_address=None, *, context=None, check_hostname=None, blocksize=8192)
-
Una subclase de
HTTPConnection
que utiliza SSL para la comunicación con servidores seguros. El puerto predeterminado es443
. Si contexto se especifica, debe ser unssl.SSLContext
instancia que describe las diversas opciones de SSL.Por favor lee Consideraciones de Seguridad para obtener más información sobre las mejores prácticas.
Modificado en la versión 3.2: Dirección de la fuente, contexto y check_hostname fueron agregados.
Modificado en la versión 3.2: Esta clase ahora admite hosts virtuales HTTPS si es posible (es decir, si
ssl.HAS_SNI
es verdad).Modificado en la versión 3.4: los estricto se eliminó el parámetro. Las “Respuestas simples” de estilo HTTP 0.9 ya no son compatibles.
Modificado en la versión 3.4.3: Esta clase ahora realiza todas las comprobaciones necesarias de certificados y nombres de host de forma predeterminada. Para volver al comportamiento anterior, no verificado
ssl._create_unverified_context()
se puede pasar al contexto parámetro.Modificado en la versión 3.8: Esta clase ahora habilita TLS 1.3
ssl.SSLContext.post_handshake_auth
por defecto contexto o cuando cert_file se pasa con una costumbre contexto.En desuso desde la versión 3.6: archivo de clave y cert_file están en desuso a favor de contexto. Por favor use
ssl.SSLContext.load_cert_chain()
en su lugar, o dejarssl.create_default_context()
seleccione los certificados CA de confianza del sistema para usted.los check_hostname el parámetro también está en desuso; los
ssl.SSLContext.check_hostname
atributo de contexto debe usarse en su lugar.
class http.client.HTTPResponse(sock, debuglevel=0, method=None, url=None)
-
Clase cuyas instancias se devuelven tras una conexión correcta. No instanciado directamente por el usuario.
Modificado en la versión 3.4: los estricto se eliminó el parámetro. Las “Respuestas simples” de estilo HTTP 0.9 ya no son compatibles.
Este módulo proporciona la siguiente función:
http.client.parse_headers(fp)
-
Analizar los encabezados de un puntero de archivo fp que representa una solicitud / respuesta HTTP. El archivo debe ser un
BufferedIOBase
lector (es decir, no texto) y debe proporcionar un RFC 2822 encabezado de estilo.Esta función devuelve una instancia de
http.client.HTTPMessage
que contiene los campos de encabezado, pero sin carga útil (lo mismo queHTTPResponse.msg
yhttp.server.BaseHTTPRequestHandler.headers
). Después de regresar, el puntero del archivo fp está listo para leer el cuerpo HTTP.Nota
parse_headers()
no analiza la línea de inicio de un mensaje HTTP; solo analiza elName: value
líneas. El archivo debe estar listo para leer estas líneas de campo, por lo que la primera línea ya debería estar consumida antes de llamar a la función.
Las siguientes excepciones se plantean según corresponda:
exception http.client.HTTPException
-
La clase base de las otras excepciones de este módulo. Es una subclase de
Exception
.
exception http.client.NotConnected
-
Una subclase de
HTTPException
.
exception http.client.InvalidURL
-
Una subclase de
HTTPException
, se genera si se proporciona un puerto y no es numérico o está vacío.
exception http.client.UnknownProtocol
-
Una subclase de
HTTPException
.
exception http.client.UnknownTransferEncoding
-
Una subclase de
HTTPException
.
exception http.client.UnimplementedFileMode
-
Una subclase de
HTTPException
.
exception http.client.IncompleteRead
-
Una subclase de
HTTPException
.
exception http.client.ImproperConnectionState
-
Una subclase de
HTTPException
.
exception http.client.CannotSendRequest
-
Una subclase de
ImproperConnectionState
.
exception http.client.CannotSendHeader
-
Una subclase de
ImproperConnectionState
.
exception http.client.ResponseNotReady
-
Una subclase de
ImproperConnectionState
.
exception http.client.BadStatusLine
-
Una subclase de
HTTPException
. Se genera si un servidor responde con un código de estado HTTP que no entendemos.
exception http.client.LineTooLong
-
Una subclase de
HTTPException
. Se genera si se recibe una línea excesivamente larga en el protocolo HTTP desde el servidor.
exception http.client.RemoteDisconnected
-
Una subclase de
ConnectionResetError
yBadStatusLine
. Criado porHTTPConnection.getresponse()
cuando el intento de leer la respuesta da como resultado que no se lean datos de la conexión, lo que indica que el extremo remoto ha cerrado la conexión.Nuevo en la versión 3.5: Previamente,
BadStatusLine
('')
se elevó.
Las constantes definidas en este módulo son:
http.client.HTTP_PORT
-
El puerto predeterminado para el protocolo HTTP (siempre
80
).
http.client.HTTPS_PORT
-
El puerto predeterminado para el protocolo HTTPS (siempre
443
).
http.client.responses
-
Este diccionario asigna los códigos de estado HTTP 1.1 a los nombres del W3C.
Ejemplo:
http.client.responses[http.client.NOT_FOUND]
es'Not Found'
.
Ver Códigos de estado HTTP para obtener una lista de los códigos de estado HTTP que están disponibles en este módulo como constantes.
Objetos HTTPConnection
HTTPConnection
instancias tienen los siguientes métodos:
HTTPConnection.request(method, url, body=None, headers=, *, encode_chunked=False)
-
Esto enviará una solicitud al servidor utilizando el método de solicitud HTTP método y el selector url.
Si cuerpo se especifica, los datos especificados se envían una vez finalizados los encabezados. Puede ser un
str
, a objeto similar a bytes, un abierto objeto de archivo, o un iterable debytes
. Si cuerpo es una cadena, está codificada como ISO-8859-1, el valor predeterminado para HTTP. Si es un objeto de tipo bytes, los bytes se envían tal cual. Si es un objeto de archivo, se envía el contenido del archivo; este objeto de archivo debe admitir al menos elread()
método. Si el objeto de archivo es una instancia deio.TextIOBase
, los datos devueltos por elread()
El método se codificará como ISO-8859-1; de lo contrario, los datos devueltos porread()
se envía tal cual. Si cuerpo es un iterable, los elementos del iterable se envían tal cual hasta que se agota el iterable.los encabezados El argumento debe ser un mapeo de encabezados HTTP adicionales para enviar con la solicitud.
Si encabezados no contiene Content-Length ni Transfer-Encoding, pero hay un cuerpo de solicitud, uno de esos campos de encabezado se agregará automáticamente. Si cuerpo es
None
, el encabezado Content-Length se establece en0
para métodos que esperan un cuerpo (PUT
,POST
, yPATCH
). Si cuerpo es una cadena o un objeto de tipo bytes que no es también un expediente, el encabezado Content-Length se establece en su longitud. Cualquier otro tipo de cuerpo (archivos e iterables en general) se codificarán por fragmentos y el encabezado Transfer-Encoding se establecerá automáticamente en lugar de Content-Length.los encode_chunked El argumento solo es relevante si Transfer-Encoding se especifica en encabezados. Si encode_chunked es
False
, el objeto HTTPConnection asume que toda la codificación es manejada por el código de llamada. Si esto esTrue
, el cuerpo se codificará por fragmentos.Nota
La codificación de transferencia fragmentada se ha agregado a la versión 1.1 del protocolo HTTP. A menos que se sepa que el servidor HTTP maneja HTTP 1.1, la persona que llama debe especificar la longitud del contenido o debe pasar un
str
o un objeto similar a bytes que no es también un archivo como representación del cuerpo.Nuevo en la versión 3.2: cuerpo ahora puede ser iterable.
Modificado en la versión 3.6: Si ni Content-Length ni Transfer-Encoding están configurados en encabezados, archivo e iterable cuerpo los objetos ahora están codificados por bloques. los encode_chunked se añadió el argumento. No se intenta determinar la longitud del contenido de los objetos de archivo.
HTTPConnection.getresponse()
-
Se debe llamar después de enviar una solicitud para obtener la respuesta del servidor. Devuelve un
HTTPResponse
ejemplo.Nota
Tenga en cuenta que debe haber leído la respuesta completa antes de poder enviar una nueva solicitud al servidor.
Modificado en la versión 3.5: Si un
ConnectionError
o subclase se eleva, elHTTPConnection
El objeto estará listo para volver a conectarse cuando se envíe una nueva solicitud.
HTTPConnection.set_debuglevel(level)
-
Establezca el nivel de depuración. El nivel de depuración predeterminado es
0
, lo que significa que no se imprime ninguna salida de depuración. Cualquier valor mayor que0
hará que toda la salida de depuración definida actualmente se imprima en stdout. losdebuglevel
se pasa a cualquier nuevoHTTPResponse
objetos que se crean.Nuevo en la versión 3.1.
HTTPConnection.set_tunnel(host, port=None, headers=None)
-
Configure el host y el puerto para HTTP Connect Tunneling. Esto permite ejecutar la conexión a través de un servidor proxy.
Los argumentos de host y puerto especifican el punto final de la conexión tunelizada (es decir, la dirección incluida en la solicitud CONNECT, no la dirección del servidor proxy).
El argumento de los encabezados debe ser un mapeo de extra Encabezados HTTP para enviar con la solicitud CONNECT.
Por ejemplo, para hacer un túnel a través de un servidor proxy HTTPS que se ejecuta localmente en el puerto 8080, pasaríamos la dirección del proxy al
HTTPSConnection
constructor, y la dirección del host al que eventualmente queremos llegar alset_tunnel()
método:>>>import http.client >>> conn = http.client.HTTPSConnection("localhost",8080)>>> conn.set_tunnel("www.python.org")>>> conn.request("HEAD","/index.html")
Nuevo en la versión 3.2.
HTTPConnection.connect()
-
Conéctese al servidor especificado cuando se creó el objeto. De forma predeterminada, esto se llama automáticamente al realizar una solicitud si el cliente aún no tiene una conexión.
HTTPConnection.close()
-
Cierre la conexión al servidor.
HTTPConnection.blocksize
-
Tamaño del búfer en bytes para enviar un cuerpo de mensaje similar a un archivo.
Nuevo en la versión 3.7.
Como alternativa al uso de request()
método descrito anteriormente, también puede enviar su solicitud paso a paso, utilizando las cuatro funciones a continuación.
HTTPConnection.putrequest(method, url, skip_host=False, skip_accept_encoding=False)
-
Esta debería ser la primera llamada después de que se haya realizado la conexión con el servidor. Envía una línea al servidor que consta de método cuerda, la url cadena y la versión HTTP (
HTTP/1.1
). Para deshabilitar el envío automático deHost:
oAccept-Encoding:
encabezados (por ejemplo, para aceptar codificaciones de contenido adicionales), especifique skip_host o skip_accept_encoding con valores que no sean falsos.
HTTPConnection.putheader(header, argument[, ...])
-
Mandar un RFC 822-encabezado de estilo al servidor. Envía una línea al servidor que consta del encabezado, dos puntos y un espacio, y el primer argumento. Si se dan más argumentos, se envían líneas de continuación, cada una de las cuales consta de una pestaña y un argumento.
HTTPConnection.endheaders(message_body=None, *, encode_chunked=False)
-
Envíe una línea en blanco al servidor, señalando el final de los encabezados. El opcional Cuerpo del mensaje El argumento se puede utilizar para pasar un cuerpo de mensaje asociado con la solicitud.
Si encode_chunked es
True
, el resultado de cada iteración de Cuerpo del mensaje se codificará por fragmentos como se especifica en RFC 7230, Sección 3.3.1. La forma en que se codifican los datos depende del tipo de Cuerpo del mensaje. Si Cuerpo del mensaje implementa el interfaz de búfer la codificación dará como resultado un solo fragmento. Si Cuerpo del mensaje es uncollections.abc.Iterable
, cada iteración de Cuerpo del mensaje resultará en un trozo. Si Cuerpo del mensaje es un objeto de archivo, cada llamada a.read()
resultará en un trozo. El método señala automáticamente el final de los datos codificados por fragmentos inmediatamente después Cuerpo del mensaje.Nota
Debido a la especificación de codificación fragmentada, el codificador de fragmentos ignorará los fragmentos vacíos generados por un cuerpo de iterador. Esto es para evitar la terminación prematura de la lectura de la solicitud por parte del servidor de destino debido a una codificación mal formada.
Nuevo en la versión 3.6: Soporte de codificación fragmentada. los encode_chunked se agregó el parámetro.
HTTPConnection.send(data)
-
Envía datos al servidor. Esto debe usarse directamente solo después de la
endheaders()
se ha llamado al método y antesgetresponse()
se llama.
Objetos HTTPResponse
Un HTTPResponse
instancia envuelve la respuesta HTTP del servidor. Proporciona acceso a los encabezados de la solicitud y al cuerpo de la entidad. La respuesta es un objeto iterable y se puede usar en una declaración with.
Modificado en la versión 3.5: los io.BufferedIOBase
La interfaz ahora está implementada y todas sus operaciones de lectura son compatibles.
HTTPResponse.read([amt])
-
Lee y devuelve el cuerpo de la respuesta, o sube al siguiente amt bytes.
HTTPResponse.readinto(b)
-
Lee hasta los siguientes len (b) bytes del cuerpo de la respuesta en el búfer B. Devuelve el número de bytes leídos.
Nuevo en la versión 3.3.
HTTPResponse.getheader(name, default=None)
-
Devuelve el valor del encabezado nombre, o defecto si no hay coincidencia de encabezado nombre. Si hay más de un encabezado con el nombre nombre, devuelve todos los valores unidos por ‘,’. Si ‘predeterminado’ es cualquier iterable que no sea una sola cadena, sus elementos se devuelven de manera similar unidos por comas.
HTTPResponse.getheaders()
-
Devuelve una lista de tuplas (encabezado, valor).
HTTPResponse.fileno()
-
Devuelve el
fileno
del encaje subyacente.
HTTPResponse.msg
-
A
http.client.HTTPMessage
instancia que contiene los encabezados de respuesta.http.client.HTTPMessage
es una subclase deemail.message.Message
.
HTTPResponse.version
-
Versión del protocolo HTTP utilizada por el servidor. 10 para HTTP / 1.0, 11 para HTTP / 1.1.
HTTPResponse.url
-
URL del recurso recuperado, comúnmente utilizado para determinar si se siguió una redirección.
HTTPResponse.headers
-
Encabezados de la respuesta en forma de
email.message.EmailMessage
ejemplo.
HTTPResponse.status
-
Código de estado devuelto por el servidor.
HTTPResponse.reason
-
Frase de motivo devuelta por el servidor.
HTTPResponse.debuglevel
-
Un gancho de depuración. Si
debuglevel
es mayor que cero, los mensajes se imprimirán en stdout a medida que se lea y analice la respuesta.
HTTPResponse.closed
-
Es
True
si el arroyo está cerrado.
HTTPResponse.geturl()
-
En desuso desde la versión 3.9: Desaprobado en favor de
url
.
HTTPResponse.info()
-
En desuso desde la versión 3.9: Desaprobado a favor de
headers
.
HTTPResponse.getstatus()
-
En desuso desde la versión 3.9: Desaprobado en favor de
status
.
Ejemplos de
Aquí hay una sesión de ejemplo que usa el GET
método:
>>>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()
Aquí hay una sesión de ejemplo que usa el HEAD
método. Tenga en cuenta que el HEAD
El método nunca devuelve ningún dato.
>>>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
Aquí hay una sesión de ejemplo que muestra cómo POST
peticiones:
>>>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 http://bugs.python.org/issue12524'>>> conn.close()
Lado del cliente HTTP PUT
las solicitudes son muy similares a POST
peticiones. La diferencia radica solo en el lado del servidor donde el servidor HTTP permitirá que los recursos se creen a través de PUT
solicitud. Cabe señalar que los métodos HTTP personalizados también se manejan en urllib.request.Request
estableciendo el atributo de método apropiado. Aquí hay una sesión de ejemplo que muestra cómo enviar un PUT
solicitud usando http.client:
>>># This creates an HTTP message>>># 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
Objetos HTTPMessage
Un http.client.HTTPMessage
La instancia contiene los encabezados de una respuesta HTTP. Se implementa utilizando el email.message.Message
clase.
Comentarios y puntuaciones de la guía
Si te gustó nuestro trabajo, puedes dejar un enunciado acerca de qué le añadirías a esta reseña.