Sobes.tech
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 a request.get_json(), mas retornará None se 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 for application/x-www-form-urlencoded ou multipart/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_body usando json.loads().
  • request.POST: Obtém dados do corpo da requisição se o tipo de conteúdo for application/x-www-form-urlencoded ou multipart/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.