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: