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 請求

 

瀏覽器訪問該接口

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM