Enviando e Recebendo Headers em FastAPI
Enviando Headers
No FastAPI, para incluir um header em uma resposta, utilizamos o parâmetro headers
do construtor da classe Response
(ou de suas subclasses). Esse parâmetro recebe um dicionário onde as chaves representam os nomes dos headers e os valores correspondem ao conteúdo dos mesmos. Veja o exemplo:
from fastapi import FastAPI, Response
app = FastAPI()
@app.get("/")
def root():
data = "Hello Programício!"
return Response(content=data, media_type="text/plain", headers={"Secret-Code": "061636"})
No exemplo acima, o cliente recebe um header personalizado chamado Secret-Code com o valor 061636
.
Outra maneira de adicionar headers é utilizando diretamente o atributo headers da classe Response
. Esse atributo funciona como um dicionário no qual as chaves representam os nomes dos headers. Veja como fazer:
from fastapi import FastAPI, Response
app = FastAPI()
@app.get("/")
def root(response: Response):
response.headers["Secret-Code"] = "061636"
return {"message": "Hello Programício!"}
Nessa abordagem, o objeto Response
é passado explicitamente como um parâmetro para a função que processa a rota.
Recebendo Headers
Para acessar os headers de uma requisição no FastAPI, utilizamos a classe fastapi.Header
. Essa abordagem permite mapear os valores dos headers diretamente para os parâmetros da função que processa a rota. Por exemplo, para capturar o valor do header User-Agent
, usamos o seguinte código:
from fastapi import FastAPI, Header
app = FastAPI()
@app.get("/")
def root(user_agent: str = Header()):
return {"User-Agent": user_agent}
Nesse caso, o nome do parâmetro da função (user_agent
) deve refletir o nome do header esperado, mas com uma diferença importante: traços no nome do header (como em User-Agent
) são substituídos por underscores (_
).
Se o header esperado não estiver presente na requisição, podemos definir um valor padrão para o parâmetro, como None
. Isso garante que a aplicação continue funcionando mesmo que o header não seja enviado:
from fastapi import FastAPI, Header
app = FastAPI()
@app.get("/")
def root(secret_code: str | None = Header(default=None)):
return {"Secret-Code": secret_code}
No exemplo acima, caso o header Secret-Code
não seja enviado pelo cliente, o valor padrão None
será utilizado.
Documentação oficial: