requests.post() în Python

HTTP și rețea requests 2.4.2+ (pentru json=)

Trimite date la un server prin HTTP POST: JSON pentru API-uri sau câmpuri de formular.

Sintaxă
requests.post(url, json=None, data=None, files=None, headers=None, timeout=None)

Ce face requests.post()

requests.post() trimite date spre server, de exemplu o comandă nouă către un API. Cu json=dicționar, requests transformă dicționarul în JSON și pune antetul Content-Type: application/json. Cu data=dicționar, datele pleacă codificate ca un formular HTML (application/x-www-form-urlencoded).

Pentru fișiere folosești files={"factura": open("factura.pdf", "rb")}. Răspunsul se citește la fel ca la get(): status_code (la creare, multe API-uri răspund cu 201), json(), headers. Există și requests.put(), patch() și delete(), cu aceiași parametri.

Parametri

Parametru Descriere
json Obiect Python trimis ca JSON.
data Dicționar trimis ca formular, sau text/bytes trimise așa cum sunt.
files Dicționar cu fișiere de încărcat (multipart/form-data).
headers Antete în plus, de exemplu un token: {"Authorization": "Bearer ..."}.
timeout Secunde de așteptare.

Ce returnează

Un obiect requests.Response.

Exemple

Exemplul 1: JSON spre un API și date de formular

httpbin.org/post trimite înapoi datele primite: câmpul json pentru prima cerere și form pentru a doua.

import requests

comanda = {"client": "Ana Popescu", "produs": "laptop", "pret": 3499.99}
r = requests.post("https://httpbin.org/post", json=comanda, timeout=10)
print(r.status_code)
raspuns = r.json()
print(raspuns["json"])
print(raspuns["headers"]["Content-Type"])

r = requests.post("https://httpbin.org/post", data={"nume": "Mihai", "oras": "Cluj"}, timeout=10)
print(r.json()["form"])

Rezultat posibil (diferă la fiecare rulare)

200
{'client': 'Ana Popescu', 'pret': 3499.99, 'produs': 'laptop'}
application/json
{'nume': 'Mihai', 'oras': 'Cluj'}

Exemplul 2: Cerere cu token de autentificare

Tokenul se citește dintr-o variabilă de mediu, nu se scrie în cod.

import os
import requests

token = os.environ["MAGAZIN_TOKEN"]
r = requests.post(
    "https://api.magazin-exemplu.ro/v1/comenzi",
    json={"produs": "mouse", "cantitate": 2},
    headers={"Authorization": f"Bearer {token}"},
    timeout=10,
)
print(r.status_code, r.json())

Rezultat posibil (diferă la fiecare rulare)

201 {'id': 1042, 'produs': 'mouse', 'cantitate': 2, 'status': 'primita'}

Greșeli frecvente

  • Trimiți un dicționar cu data= unui API care așteaptă JSON. Serverul primește un formular și răspunde cu 400 sau 415; folosește json=.
  • Scrii json=json.dumps(comanda). Datele ajung codificate de două ori (un text JSON în interiorul JSON-ului). Dă direct dicționarul.
  • Pui tokenul sau parola direct în cod și apoi codul ajunge în Git. Citește-le din variabile de mediu.

Comenzi înrudite

  • requests.get(): Trimite o cerere HTTP GET și returnează răspunsul: cod de stare, antete, text sau JSON.
  • raise_for_status() și timeout: Transformă răspunsurile de eroare (4xx, 5xx) în excepții și limitează cât așteaptă o cerere.
  • json.dumps(): Transformă un dicționar, o listă sau alte valori Python în text JSON.