1. 程式人生 > 其它 >FastAPI(18)- 詳解 Header,獲取請求頭

FastAPI(18)- 詳解 Header,獲取請求頭

FastAPI(18)- 詳解 Header,獲取請求頭

檢視一個介面的 Header

進到某個網站,右鍵檢查元素;或者直接 F12

找到 Network,選擇一個請求,就能看到 Request Header、Response Header 啦

FastAPI 提供的 Header

  • Header 是 Path、Query、Cookie 的“姐妹”類
  • 它也繼承自相同的通用 Param 類
  • 注意:從 fastapi 匯入 Query、Path、Cookie、Header 等時,這些實際上是返回特殊類的函式

新增了一個引數,預設值是 True,盲猜是跟轉換下換線有關係

獲取 Header 的栗子

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
# author: 小菠蘿測試筆記
# blog:  https://www.cnblogs.com/poloyy/
# time: 2021/9/21 2:39 下午
# file: 15_cookies.py
"""
from typing import Optional
import uvicorn
from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(accept_encoding: Optional
[str] = Header(None)
):
return {"Accept-Encoding": accept_encoding} if __name__ == "__main__": uvicorn.run(app="16_Header:app", host="127.0.0.1", port=8080, reload=True, debug=True)

瀏覽器訪問該介面

可以看到,獲取的是 Request Header 裡面的值

提出疑問:函式引數命名為 accept_encoding 為什麼能識別到 Accept-Encoding?

  • 首先,Accept-Encoding 這種變數名在 Python 是無效的
  • 因此, Header 預設情況下,會用下劃線_代替-,這就是 convert_underscores 引數的作用
  • 重點:HTTP Header 是不區分大小寫的,所以寫 accept_encoding 還是 Accept_Encoding 是一樣效果的

多個重名 Header

假設一個 Request Header 裡面有多個重名的 Header,那可以用 List[str] 來宣告引數型別

@app.get("/items/")
async def read_items(x_token: Optional[List[str]] = Header(None)):
    return {"X-Token values": x_token}

假設 Request Header 有兩個重名的 Header

X-Token: foo
X-Token: bar

訪問 /items/ 介面得到的響應體會是

x_token 就是一個列表

{
    "X-Token values": [
        "bar",
        "foo"
    ]
}

設定 Response Header

from starlette.responses import JSONResponse

@app.get("/header/")
def Login():
    content = {
        "name": "poloyy",
        "age": 10
    }
    response = JSONResponse(content=content)
    token = {
        "x-token-name": "token",
        "x-token-value": "test_header"
    }
    # 設定 Header
    response.init_headers(token)
    return response

這裡會用到 FastAPI 提供的響應模型,後面會詳解,這裡先做了解

方便演示,這裡用 get 請求

瀏覽器訪問該介面