La bibliothèque de requêtes de Python est un outil de bibliothèque client http puissant qui simplifie la communication API, en particulier pour effectuer des requêtes POST. Que vous créiez une application qui interagit avec des API distantes ou du web scraping, maîtriser la méthode POST avec des requêtes est une compétence fondamentale pour un développement Web efficace.
Ce guide fournit une présentation complète de l'utilisation des requêtes Python pour effectuer des requêtes POST, une méthode cruciale pour envoyer des données aux serveurs. Nous aborderons des exemples, des défis courants et des meilleures pratiques.
Pour ceux qui découvrent la bibliothèque, vous pouvez commencer par l'installer avec les demandes d'installation pip à suivre avec ce guide.
HTTP est l'épine dorsale de la communication entre les clients Web (comme les navigateurs ou les applications) et les serveurs. Ce protocole utilise des requêtes pour échanger des données et il peut y avoir plusieurs types de méthodes :
L'utilisation des requêtes POST en Python est essentielle pour les interactions qui envoient des données aux serveurs et il peut y avoir de nombreux cas d'utilisation pour cette méthode — jetons-y un coup d'œil ensuite.
Comprendre quand utiliser POST par rapport à d'autres méthodes HTTP est essentiel dans le développement Web. Contrairement à GET, qui envoie des données dans le cadre de paramètres d'URL limités, POST envoie des données via le corps de la requête. Cela permet de prendre en charge des charges utiles plus importantes et de garder les données cachées pour des raisons de sécurité. Cela rend la méthode POST idéale pour :
Avec une compréhension claire de ce que sont les requêtes POST, explorons maintenant comment les envoyer en Python à l'aide de la bibliothèque de requêtes, couvrant les formats essentiels tels que JSON, les données de formulaire et les téléchargements de fichiers.
La fonction request.post() est votre principal outil pour envoyer des requêtes POST en Python. Il permet un envoi de données personnalisable et simple en spécifiant l'URL, les en-têtes et les données elles-mêmes. Les types de données les plus courants incluent JSON, les données de formulaire ou les données de corps bruts, tous gérés facilement avec la méthode POST des requêtes Python. Par exemple :
Exemple de publication de requêtes Python de base pour l'envoi d'une requête POST :
import requests response = requests.post('https://httpbin.dev/post', data={'key': 'value'}) # or start a persisten session: session = requests.Session() response = session.post('https://httpbin.dev/post', data={'key': 'value'}) # Check response content print(response.status_code) print(response.text)
L'utilisation de request.Session() vous permet de conserver certains paramètres (tels que les cookies ou les en-têtes) sur plusieurs requêtes. Cela peut être crucial lorsque vous travaillez avec des requêtes POST, car le serveur suit souvent l'état actuel du client et peut renvoyer différentes données ou même bloquer les requêtes POST manquant d'en-têtes ou de cookies spécifiques.
L'en-tête HTTP Content-Type est essentiel dans les requêtes POST car il spécifie le format des données envoyées, ce qui garantit que le serveur peut interpréter correctement la requête.
Certains serveurs prennent en charge plusieurs types de contenu POST, tandis que d'autres nécessitent des formats spécifiques. Voici quelques en-têtes Content-Type courants et à quoi ils servent :
Pour définir l'en-tête Content-Type dans les requêtes python, utilisez le paramètre headers :
import requests response = requests.post( 'https://httpbin.dev/post', headers={ "Content-Type": "application/json", }, data='{ "key": "value" }' )
Dans cet esprit, examinons ensuite les formats de données les plus couramment utilisés dans les requêtes POST.
JSON (JavaScript Object Notation) est un format couramment utilisé pour la communication API car il est facilement structuré et analysé. Il est disponible nativement en JavaScript et en Python, il peut être facilement converti en dictionnaire Python à l'aide du module json.
Utiliser la bibliothèque de requêtes pour envoyer des requêtes Python POST avec des données JSON est simple. Utilisez le paramètre json dans request.post(), qui gère automatiquement l'encodage et définit l'en-tête Content-Type :
import requests response = requests.post('https://httpbin.dev/post', data={'key': 'value'}) # or start a persisten session: session = requests.Session() response = session.post('https://httpbin.dev/post', data={'key': 'value'}) # Check response content print(response.status_code) print(response.text)
JSON est de loin le type de données POST le plus populaire, souvent rencontré dans des scénarios tels que :
Les données de formulaire sont utilisées lorsque les utilisateurs interagissent avec les champs de saisie d'une page Web comme :
Les données du formulaire envoient des données avec l'en-tête Content-Type application/x-www-form-urlencoded et encodent les données URL dans un format clé-valeur. Voyons un exemple de POST de données de formulaire avec des requêtes Python pour mieux comprendre ce format :
import requests response = requests.post( 'https://httpbin.dev/post', headers={ "Content-Type": "application/json", }, data='{ "key": "value" }' )
Dans l'exemple ci-dessus, l'en-tête Content-Type est automatiquement défini lorsque nous utilisons un dictionnaire Python comme paramètre de données. Sinon, si nous transmettons une chaîne, nous devons définir manuellement l'en-tête Content-Type.
Pour envoyer des fichiers à l'aide de la bibliothèque de requêtes de Python, le paramètre files peut être utilisé. Ce paramètre prend des octets de données et définit automatiquement l'en-tête Content-Type sur multipart/form-data. Ceci est utile pour télécharger des images, des documents ou du contenu multimédia. Jetons un coup d'œil à quelques exemples de comment télécharger un fichier à l'aide de requêtes Python POST :
import requests data = {'username': 'ziad', 'password': '1234'} response = requests.post('https://httpbin.dev/api', json=data)
Ci-dessus, nous voyons que nous pouvons soit fournir un objet fichier pour les demandes de diffusion des données vers le serveur, soit fournir directement des données d'octets.
Après avoir effectué une requête POST, c'est une bonne pratique de vérifier la réponse pour détecter les erreurs ou les méta-notes. Pour cela, l'objet Response des requêtes fournit des attributs tels que status_code, headers et json() qui aident à évaluer le succès ou à diagnostiquer les problèmes.
Pour commencer, inspectez réponse.status_code pour vérifier si une requête POST réussie a été effectuée avec la réponse 200 OK. Sinon, référez-vous à ce tableau pratique ci-dessous.
Status Code | Issue | Description | Solution |
---|---|---|---|
400 Bad Request | Incorrect data or syntax error | The server couldn't process the request due to data format issues. | Check the data format and headers (e.g., Content-Type) for correctness. |
401 Unauthorized | Missing or invalid authentication | The request lacks valid authentication credentials. | Include valid API keys or tokens in headers. |
403 Forbidden | Access denied | The server refuses to authorize the request. | Verify permissions and check the API documentation for access requirements. |
404 Not Found | Incorrect URL | The server cannot find the requested endpoint. | Double-check the endpoint URL for typos and ensure it’s valid. |
405 Method Not Allowed | Unsupported HTTP method | The endpoint does not support the HTTP method used. | Confirm the correct HTTP method is used by consulting the API documentation. |
500 Internal Server Error | Server-side error | A generic error indicating an internal server issue. | Retry the request; contact API support if the issue persists. |
503 Service Unavailable | Temporary overload/maintenance | The server is temporarily unavailable due to high traffic or maintenance. | Wait and retry later; consider implementing retry logic for critical applications. |
En surveillant Response.status_code et en incorporant une logique de gestion des erreurs, vous pouvez garantir des interactions robustes et fiables lors des requêtes POST.
Voici un exemple de gestion des codes d'état de réponse :
import requests response = requests.post('https://httpbin.dev/post', data={'key': 'value'}) # or start a persisten session: session = requests.Session() response = session.post('https://httpbin.dev/post', data={'key': 'value'}) # Check response content print(response.status_code) print(response.text)
Savoir comment interpréter ces réponses permet de gérer efficacement les erreurs, garantissant ainsi une expérience utilisateur fluide et un dépannage dans les interactions avec l'API.
Pour optimiser la bande passante de transfert de données, vous pouvez POST des données compressées Gzip ou Brotli. Voici un exemple de compression gzip :
import requests response = requests.post( 'https://httpbin.dev/post', headers={ "Content-Type": "application/json", }, data='{ "key": "value" }' )
Pour la compression Brotli, le package brotli peut être utilisé :
import requests data = {'username': 'ziad', 'password': '1234'} response = requests.post('https://httpbin.dev/api', json=data)
L'utilisation de la compression réduit la taille de la charge utile considérablement, optimisant la bande passante et améliorant la vitesse des requêtes. Ceci est particulièrement applicable aux formats comme JSON qui peuvent être bien compressés.
Les requêtes POST, en particulier celles impliquant de grands ensembles de données ou des volumes élevés, peuvent être lentes en raison du temps nécessaire à la transmission des données et au traitement côté serveur. La simultanéité peut atténuer ces retards en permettant à plusieurs requêtes de s'exécuter simultanément, accélérant ainsi les tâches telles que les téléchargements groupés de données ou les interactions API.
Malheureusement, la bibliothèque de requêtes de Python ne prend pas en charge les opérations asynchrones avec asyncio, ce qui limite sa capacité à gérer efficacement de nombreuses requêtes POST simultanées.
C'est là qu'intervient httpx, car il propose un AsyncClient qui s'intègre parfaitement à la boucle d'événements asyncio de Python. Cela signifie que vous pouvez envoyer de nombreuses requêtes simultanément sans blocage, ce qui fait de httpx un choix puissant pour les applications hautes performances qui nécessitent une véritable prise en charge asynchrone.
Vous pouvez également utiliser le threading pour activer les requêtes parallèles dans les requêtes Python. Voici un exemple utilisant un package de threading intégré avec des requêtes :
form_data = {'search': 'product 1 & 2', 'count': 10} response = requests.post( 'https://httpbin.dev/post', data=form_data, ) # this will automatically add the Content-Type header # and convert data from dictionary to URL encoded format print(response.request.body) 'search=product+1+%26+2&count=10' print(response.request.headers['Content-Type']) 'application/x-www-form-urlencoded' # alternatively if we POST data as string # we need to manually identify Content-Type response = requests.post( 'https://httpbin.dev/post', data='search=product+1+%26+2&count=10' headers={ "Content-Type": "application/x-www-form-urlencoded" } ) print(response.request.body) 'search=product+1+%26+2&count=10' print(response.request.headers['Content-Type']) 'application/x-www-form-urlencoded'
En utilisant le threading, plusieurs requêtes POST peuvent être lancées en parallèle, permettant à chaque thread de gérer une seule requête.
Vous pouvez en savoir plus sur la concurrence et le parallélisme dans notre article dédié :
Concurrence vs Parallélisme
(https://scrapfly.io/blog/concurrency-vs-parallelism/)
Les requêtes HTTP peuvent être difficiles et se compliquer rapidement en raison des exigences du navigateur sans tête ou du blocage du client. Pour cela, Scrapfly peut vous donner un coup de main !
ScrapFly fournit des API de scraping Web, de capture d'écran et d'extraction pour la collecte de données à grande échelle.
Pour conclure ce guide, voici les réponses à quelques questions fréquemment posées sur les requêtes python POST.
Passez les en-têtes sous forme de dictionnaire en utilisant le paramètre headers. Notez que les requêtes génèrent automatiquement certains en-têtes tels que User-Agent, Content-Length et Content-Type, alors soyez prudent lorsque vous les remplacez.
les données sont destinées aux données codées sous forme de formulaire (par défaut) ou brutes (lorsque l'en-tête Content-Type est remplacé). Alors que json est spécifiquement destiné aux données au format JSON et définit automatiquement Content-Type sur application/json.
Malheureusement, la bibliothèque de requêtes ne prend pas en charge les requêtes asynchrones. Cependant, la bibliothèque httpx est une alternative qui offre des fonctionnalités asynchrones, ce qui la rend adaptée aux applications nécessitant une simultanéité.
Dans cet article, nous avons examiné en profondeur la méthode POST des requêtes en Python et appris :
Il y a beaucoup plus à apprendre sur les requêtes Python et les requêtes POST, mais avec ce guide, vous êtes bien équipé pour commencer à créer des applications robustes et des grattoirs Web qui interagissent efficacement avec les API et les serveurs.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!