Cómo realizar solicitudes HTTP con Python - Parte 2 - La biblioteca de solicitudes

Cómo realizar solicitudes HTTP con Python - Parte 2 - La biblioteca de solicitudes

En el artículo anterior vimos cómo realizar solicitudes HTTP básicas utilizando la biblioteca estándar Python3. Cuando las solicitudes se vuelven más complejas, o solo queremos usar menos código, y no nos importa agregar una dependencia a nuestro proyecto, es posible (y a veces incluso recomendado) usar el externo peticiones módulo. La biblioteca, que adoptó el lema "http para humanos", será el foco de este artículo.

En este tutorial aprenderás:

  • Cómo realizar solicitudes HTTP con Python3 y la biblioteca de 'solicitudes'
  • Cómo administrar las respuestas del servidor
  • Cómo trabajar con sesiones


Solicitudes HTTP con Python - PT. II: la biblioteca de solicitudes

Requisitos y convenciones de software utilizados

Requisitos de software y convenciones de línea de comandos de Linux
Categoría Requisitos, convenciones o versión de software utilizada
Sistema INDEPENDO DEL OS
Software Python3 y la biblioteca "solicitudes"
Otro Conocimiento de los conceptos básicos de programación orientada a objetos y Python
Convenciones # - requiere que los comandos de Linux dados se ejecuten con privilegios raíz directamente como un usuario raíz o mediante el uso de sudo dominio
ps - Requiere que los comandos de Linux dados se ejecuten como un usuario regular no privilegiado

Realizar solicitudes con la biblioteca "Solicitudes"

En la primera parte de esta serie, realizamos solicitudes HTTP básicas utilizando solo la biblioteca estándar. Cuando las solicitudes se vuelven más complejas, por ejemplo, cuando necesitamos preservar las cookies entre una solicitud y otra, podemos usar el peticiones Biblioteca externa, que simplifica nuestro trabajo, realizando muchas operaciones debajo del capó para nosotros. Dado que la biblioteca no está incluida en una instalación predeterminada de Python3, debemos instalarla en nuestro sistema antes de poder usarla. Un método independiente de la distribución para lograr la tarea es usar pepita, The Python Package Manager:

$ PIP3 Solicitudes de instalación -Usor


Ahora que instalamos la biblioteca, veamos algunos ejemplos de cómo usarla.

Realizar una solicitud GET

Recuerde la solicitud que hicimos con las API de la NASA, para recuperar la "imagen del día" para una fecha específica? Construir y enviar la misma solicitud con el peticiones La biblioteca requiere solo una línea de código:

>>> solicitudes de importación >>> respuesta = solicitudes.Get ("https: // API.NASA.Gov/Planetary/Apod ", Params = " API_KEY ":" Demo_Key "," Date ":" 2019-04-11 ") 
Copiar

Pasamos la URL y los parámetros de consulta (aún como un diccionario), respectivamente como el primer y segundo argumento del conseguir función. ¿Qué devuelve esta función?? Devuelve una instancia del peticiones.modelos.Respuesta clase. Interactuar con instancias de esta clase es muy fácil. ¿Queremos recuperar el contenido codificado por JSON de la respuesta?? Fácil! Solo necesitamos llamar al json Método del objeto:

>>> Respuesta.json () 'date': '2019-04-11', 'explicación': '¿Cómo se ve un agujero negro?? Para averiguarlo, los telescopios de radio '' de las observaciones coordinadas de la Tierra de '' agujeros negros con los horizontes de eventos más grandes conocidos en el ' ... 'Vecindad inmediata del agujero negro en el centro de nuestra' 'Galaxia de la Vía Láctea.',' hdurl ':' https: // apod.NASA.Gov/Apod/Image/1904/M87BH_EHT_2629.jpg ',' Media_Type ':' Image ',' Service_Version ':' V1 ',' Title ':' First Horizon-Scale de un agujero negro ',' url ':' https: // apod.NASA.Gov/Apod/Image/1904/M87BH_EHT_960.jpg ' 
Copiar

¿Queremos obtener la respuesta del servidor como una cadena?? Todo lo que tenemos que hacer es acceder al texto propiedad:

respuesta.texto

De la misma manera podemos acceder a la razón, código de estado y encabezado de la solicitud. Solo tenemos que acceder a las propiedades respectivas:

>>> Respuesta.Razón 'OK' >>> Respuesta.status_code 200 >>> respuesta.encabezados 'servidor': 'OpenResty', 'Date': 'Thu, 18 de abril de 2019 10:46:26 GMT', 'Content-type': 'Application/JSson', 'Transfer-Engoding': 'Chunked', 'Connection': 'Keep-Alive', 'Vary': 'Aceptar-Engoding', 'X-ratelimit-limit': '40', 'X-ratelimit-relein': '39', 'vía': 1.1 Vegur, http/1.1 api-umbrella (apachetrafficserver [cmssf]) ',' edad ':' 0 ',' x-cache ':' fish ',' access-confontrol-allow-origin ':'*',' Strict-transport-Security ':' Max-Age = 31536000; precarga ',' codificación de contenido ':' gzip ' 
Copiar

Descargar un archivo

Descargar un archivo también es muy fácil. En primer lugar, tenemos que usar el arroyo Parámetro del conseguir función. Por defecto, este parámetro se establece en FALSO, y esto significa que el cuerpo de la respuesta se descargará a la vez. Como es posible que deseemos descargar un archivo grande, queremos configurarlo en Verdadero: De esta manera, solo los encabezados de la respuesta se descargarán inmediatamente y la conexión permanecerá abierta para que podamos procesarlo como queramos:



>>> ortat_kernel_tarball = "https: // cdn.núcleo.org/pub/linux/kernel/v5.X/Linux-5.0.7.alquitrán.xz ">>> con solicitudes.get (ortat_kernel_tarball, stream = true) como respuesta: ... con Open ("Último kernel.alquitrán.xz "," wb ") como tarball: ... para fragmento en respuesta.iter_content (16384): ... tarball.Escribir (trozo) 
Copiar

El código es similar a su contraparte de la biblioteca estándar: lo que cambió es el uso del iter_content Método del objeto de respuesta. En un ejemplo anterior, operamos dentro de un bucle de tiempo, que interrumpimos solo cuando se consumió el contenido de la respuesta. Usando este método, podemos escribir en el archivo de destino de una manera más elegante, ya que podemos iterar en el contenido de la respuesta. El iter_content El método acepta el argumento opcional tamaño de porción, un entero Indicando el tamaño de la fragmentación en bytes (los datos a leer en la memoria en cada iteración).

Enviar datos codificados por formulario o JSON en una solicitud

El envío de datos codificados por formulario (por ejemplo en una solicitud de publicación) con la biblioteca "Solicitudes", requiere menos código que la misma operación realizada solo utilizando la biblioteca estándar:

>>> request_data =  ... "Variable1": "Value1", ... "Variable2": "Value2" ... >>> respuesta = solicitudes.post ("https: // httpbin.org/post ", data = request_data) 
Copiar

Para pasar los mismos datos, pero como JSON:

respuesta = solicitudes.post ("https: // httpbin.org/post ", json = request_data)

Mediante el uso del json Parámetro de la función, ni siquiera tenemos que preocuparnos por codificar la cadena usando json.deshecho: se hará para usar debajo del capó.

Cargar un archivo

Cargar un archivo usando la biblioteca estándar puede ser una tarea muy tediosa, pero es muy fácil usar el peticiones biblioteca. Digamos que queremos subir una imagen:

>>> respuesta = solicitudes.correo( ... "https: // httpbin.org/post ", archivos = 'file': open ('nasa_black_hole.png ',' rb ')) 
Copiar

Código impresionante! Realizamos un correo Solicitud, esta vez usando el archivos argumento. Este argumento debe ser un diccionario en el que la clave sea el "nombre" del campo y el valor es un objeto de archivo, en este caso devuelto por el abierto función.

¿Qué pasa con los otros verbos HTTP?? Cada uno de ellos se usa con la función de consecuencia con nombre: poner, borrar, cabeza o opción. Todos ellos se pueden usar con básicamente la misma interfaz que las que vimos antes.

Trabajando con sesiones

El peticiones La biblioteca nos permite usar sesiones: Cuando se envían solicitudes desde un contexto de sesión, las cookies se conservan entre una solicitud y otra. Esta es la forma recomendada de realizar múltiples solicitudes al mismo host, ya que incluso lo mismo TCP La conexión se reutilizará. Veamos cómo crear una sesión y enviar una solicitud con ella:

>>> sesión = solicitudes.Sesión () >>> respuesta = sesión.Get ("https: // httpbin.org/cookies/set?LastName = Skywalker ") 
Copiar

Creamos una instancia del peticiones.Sesión clase, y, en lugar de ejecutar una solicitud por sí misma, como lo hicimos en ejemplos anteriores, utilizamos el método que lleva el nombre del verbo http, ((conseguir en este caso) que se usa de la misma manera. La url de solicitud, esta vez, fue http: // httpbin.org/cookies/set, un punto final que nos permite establecer los parámetros de cookie que enviamos a la cadena de consulta. La llamada que hicimos estableció una cookie que ahora se almacena en la sesión y se utilizará en todas las solicitudes enviadas desde el sesión contexto. Para enumerar todas las cookies asociadas con una sesión, podemos acceder al galletas propiedad, que es una instancia del peticiones.galletas.Requestscookiejar ' clase:

>>> Sesión.galletas  >>> # Acceda a las teclas de las cookies ...sesión.galletas.Keys () ['LastName'] >>> >>> # Acceda a los valores de las cookies ...sesión.galletas.valores () ['Skywalker'] >>> >>> # El método IterKeys devuelve un iterador de nombres de cookies ...sesión.galletas.iterkeys ()  >>> # El método de Itervalues ​​hace lo mismo pero para los valores ...sesión.galletas.Itervalues ​​()  
Copiar

Para limpiar las cookies almacenadas en la sesión, podemos usar el claro método:

>>> Sesión.galletas.Clear () >>> Sesión.galletas  
Copiar

Crear un objeto de solicitud

Hasta ahora acabamos de usar funciones como conseguir, correo o poner que básicamente crea y envía solicitudes "sobre la marcha". Hay casos en los que queremos construir un Pedido objeto pero no queremos enviarlo de inmediato. Así es como podemos hacerlo:

>>> solicitud = solicitudes.Solicitar ("Get", "https: // httpbin.org/get ")

El primer argumento del Pedido El constructor es el verbo que queremos usar y el segundo, la URL de destino. Se pueden usar los mismos parámetros que usamos cuando enviamos una solicitud directamente: encabezado, parámetros, datos, json y archivos. Una vez que creamos un Pedido Debemos "prepararlo" antes de poder enviarlo:



>>> sesión = solicitudes.Sesión () >>> solicitud = solicitudes.Solicitar ("Get", "https: // httpbin.org/get ") >>> preparado_request = sesión.prepare_request (solicitud) >>> respuesta = sesión.enviar (preparado_request) 
Copiar

También podríamos preparar un Pedido utilizando el preparar método del Pedido objeto en sí, en lugar de llamar sesión.preparar_request, Pero en este caso, la solicitud perdería las ventajas de ser parte de la sesión.

Plantear una excepción cuando el código de estado de respuesta no es 200

El código de estado devuelto por un servidor cuando una solicitud es exitosa es 200. Cuando ocurre algún error, por ejemplo, cuando no se encuentra un recurso o cuando no estamos autorizados para acceder a él, se devuelven otros códigos (en este caso 404 y 403 respectivamente). Cuando esto sucede y queremos que nuestro código plantee una excepción, debemos llamar al Raise_for_status método del peticiones.modelos.Respuesta objeto. Veamos cómo se comporta el código de manera diferente cuando lo usamos. Enviamos una solicitud de publicación a un punto final que acepta solo el verbo Get:

>>> respuesta = solicitudes.post ('https: // httpbin.org/get ') >>> respuesta.status_code 405 >>> respuesta.Razón 'Método no permitido' 
Copiar

Como se esperaba, dado que usamos el verbo HTTP incorrecto, el código de estado de respuesta fue 405, y la "razón" correspondiente es MÉTODO NO PERMITIDO, Sin embargo, no se planteó ninguna excepción. Para dejar que una mala solicitud plantee un excepción debemos llamar al Raise_for_status método después de enviar la solicitud:

>>> respuesta = solicitudes.post ('https: // httpbin.org/get ') >>> respuesta.rais_for_status () traza (la última llamada reciente): archivo "", línea 1, en el archivo "/usr/lib/python3.7/Packages de sitio/solicitudes/modelos.py ", línea 940, en Rais_for_status Raise Httperror (http_error_msg, respuesta = self) solicitudes.excepciones.Httperror: 405 Error del cliente: método no permitido para la URL: https: // httpbin.org/get 
Copiar

Desde que llamamos Raise_for_status, Esta vez la solicitud planteó un peticiones.excepciones.Error HTTP excepción.

Conclusiones

En este artículo, la segunda de las series sobre realizar una solicitud HTTP con Python, nos centramos
Sobre el uso de lo externo peticiones Biblioteca, que nos permite realizar solicitudes simples y complejas
En pocas líneas de código. Quieres saber más acerca de eso? La documentación oficial está a solo un clic de distancia!

Tutoriales de Linux relacionados:

  • Una introducción a la automatización, herramientas y técnicas de Linux
  • Cómo configurar un servidor OpenVPN en Ubuntu 20.04
  • Mastering Bash Script Loops
  • Cómo trabajar con la API REST de WooCommerce con Python
  • Cosas para instalar en Ubuntu 20.04
  • Mint 20: Mejor que Ubuntu y Microsoft Windows?
  • Bucles anidados en guiones Bash
  • Cómo construir una aplicación Tkinter utilizando un objeto orientado ..
  • Sistema colgado de Linux? Cómo escapar a la línea de comando y ..
  • Cómo iniciar procesos externos con Python y el ..