Junior
Como obter o corpo da requisição em Python?
sobes.tech IA
Resposta da IA
Em Python, pode obter o corpo de uma requisição de várias maneiras, dependendo do framework web utilizado.
Flask:
from flask import Flask, request
app = Flask(__name__)
@app.route('/my_endpoint', methods=['POST'])
def handle_post():
# Obter o corpo da requisição em bytes
raw_body = request.data
# Obter o corpo da requisição como dicionário (para JSON)
try:
json_body = request.get_json() # ou request.json
except:
json_body = None # Tratamento de erro se não for JSON
# Obter dados do formulário
form_data = request.form # ImmutableMultiDict
return "OK", 200
if __name__ == '__main__':
app.run()
request.data: Obtém o corpo bruto da requisição em bytes. Útil quando o tipo de conteúdo é desconhecido ou não é um formato habitual.request.get_json(): Tenta analisar o corpo da requisição como JSON e devolvê-lo como um dicionário Python. Pode aceitar argumentos, por exemplo, para uma verificação rigorosa do tipo de conteúdo.request.json: Semelhante arequest.get_json(), mas retornaráNonese o corpo não for um JSON válido.request.form: Obtém dados do corpo da requisição se o tipo de conteúdo forapplication/x-www-form-urlencodedoumultipart/form-data.
Django:
from django.http import HttpResponse
import json
def my_view(request):
if request.method == 'POST':
# Obter o corpo da requisição em bytes
raw_body = request.body
# Obter o corpo da requisição como dicionário (para JSON)
try:
json_body = json.loads(raw_body)
except:
json_body = None # Tratamento de erro se não for JSON
# Os dados do formulário são tratados de forma diferente (em request.POST)
form_data = request.POST # QueryDict
return HttpResponse("OK")
return HttpResponse("Method not allowed", status=405)
request.body: Obtém o corpo bruto da requisição em bytes.- Para JSON, é necessário desserializar manualmente
raw_bodyusandojson.loads(). request.POST: Obtém dados do corpo da requisição se o tipo de conteúdo forapplication/x-www-form-urlencodedoumultipart/form-data.
FastAPI:
from fastapi import FastAPI, Request
app = FastAPI()
@app.post("/my_endpoint")
async def handle_post(request: Request):
# Obter o corpo da requisição em bytes (async)
raw_body = await request.body()
# Obter o corpo da requisição como dicionário (para JSON) (async)
try:
json_body = await request.json()
except:
json_body = None # Tratamento de erro se não for JSON
# Obter dados do formulário (async)
form_data = await request.form() # FormData
return {"status": "OK"}
await request.body(): Obtém assíncronamente o corpo bruto da requisição.await request.json(): Tenta analisar assíncronamente o corpo como JSON.await request.form(): Assíncronamente obtém os dados do formulário.
Abordagem geral (independentemente do framework, por exemplo, em aplicações WSGI):
# Exemplo para aplicação WSGI
def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/plain')])
try:
content_length = int(environ.get('CONTENT_LENGTH', 0))
except (ValueError):
content_length = 0
# Leitura do corpo da requisição a partir do fluxo de entrada
raw_body = environ['wsgi.input'].read(content_length)
# Para JSON, pode-se desserializar raw_body
# json_body = json.loads(raw_body)
return [raw_body]
Em aplicações WSGI, o corpo da requisição está acessível através do objeto de arquivo semelhante a um arquivo environ['wsgi.input']. É necessário obter o tamanho do corpo do cabeçalho CONTENT_LENGTH.