# 表單資料 { #form-data } 當你需要接收表單欄位而不是 JSON 時,可以使用 `Form`。 /// info 要使用表單,請先安裝 [`python-multipart`](https://github.com/Kludex/python-multipart)。 請先建立並啟用一個[虛擬環境](../virtual-environments.md),然後再安裝,例如: ```console $ pip install python-multipart ``` /// ## 匯入 `Form` { #import-form } 從 `fastapi` 匯入 `Form`: {* ../../docs_src/request_forms/tutorial001_an_py310.py hl[3] *} ## 定義 `Form` 參數 { #define-form-parameters } 以與 `Body` 或 `Query` 相同的方式建立表單參數: {* ../../docs_src/request_forms/tutorial001_an_py310.py hl[9] *} 例如,在 OAuth2 規範的一種用法(稱為「password flow」)中,必須以表單欄位傳送 `username` 與 `password`。 該 規範 要求欄位名稱必須正好是 `username` 和 `password`,而且必須以表單欄位傳送,而不是 JSON。 使用 `Form` 時,你可以宣告與 `Body`(以及 `Query`、`Path`、`Cookie`)相同的設定,包括驗證、範例、別名(例如用 `user-name` 取代 `username`)等。 /// info `Form` 是一個直接繼承自 `Body` 的類別。 /// /// tip 要宣告表單的請求本文,你需要明確使用 `Form`,否則這些參數會被解讀為查詢參數或請求本文(JSON)參數。 /// ## 關於「表單欄位」 { #about-form-fields } HTML 表單(`
`)向伺服器傳送資料時,通常會使用一種「特殊」的編碼方式,與 JSON 不同。 **FastAPI** 會從正確的位置讀取那些資料,而不是從 JSON。 /// note | 技術細節 表單資料通常會使用「媒體類型」`application/x-www-form-urlencoded` 進行編碼。 但當表單包含檔案時,會使用 `multipart/form-data`。你會在下一章閱讀如何處理檔案。 若想進一步了解這些編碼與表單欄位,請參考 [MDN web docs 的 `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST)。 /// /// warning 你可以在一個 *路徑操作(path operation)* 中宣告多個 `Form` 參數,但不能同時再宣告期望以 JSON 接收的 `Body` 欄位,因為該請求的本文會使用 `application/x-www-form-urlencoded` 編碼,而不是 `application/json`。 這不是 **FastAPI** 的限制,而是 HTTP 協定本身的規定。 /// ## 回顧 { #recap } 使用 `Form` 來宣告表單資料的輸入參數。