Request
更新時間 2023-12-13 15:33:06
最近更新時間: 2023-12-13 15:33:06
分享文章
本文介紹函數運行時中Request的定義與用法。
Request接口表示一個HTTP請求,并且是Fetch API的一部分。詳細定義請參見MDN官方文檔Request。
最常用到Request對象的方式是FetchEvent的傳入對象。
addEventListener("fetch", event => {
let request = event.request // Request object
// ...
})
需要修改Request請求對象時,可以構造一個新的請求對象,因為FetchEvent的request屬性是只讀的。
addEventListener("fetch", event => {
const request = event.request
const url = "//www.daliqc.cn"
const modifiedRequest = new Request(url, {
body: request.body,
headers: request.headers,
method: request.method,
redirect: request.redirect
})
// ...
})
構造函數
let request = new Request(input [, init])
- 參數
- input
string|Request- 包含URL的字符串或Request對象。
- init
RequestInit- 可選,包含要應用于的設置Request。
- input
- RequestInit
- method
string- 可選,請求的方法 (GET, POST等)
- headers
Headers- 可選,Headers對象。
- body
string|ReadableStream|FormData|URLSearchParams- 可選,請求正文。
- redirect
string- 可選,請求重定向策略,可取值為follow,error或者manual,默認值為undefined。
- method
屬性
FetchEvent傳入的Request對象(即event.request)的所有屬性均為只讀。如果要修改請求必須創建一個新Request對象,然后將要修改的選項傳遞給構造函數。
- body
ReadableStream- 只讀,請求正文流。
- bodyUsed
Boolean- 只讀,判斷是否已在響應中使用該正文。
- headers
Headers- 只讀,Headers對象。
- method
string- 只讀,請求的方法 (GET,POST等)。
- url
string- 只讀,這個請求的URL。
說明Request對象的以下屬性對于函數計算沒有意義,暫時不考慮實現:context、credentials、destination、integrity、mode、referrer、referrerPolicy、cache。
方法
這些方法僅在Request對象實例上可用。
- clone()
Promise<Request>- 創建Request對象的副本。
- arrayBuffer()
Promise<ArrayBuffer>- 返回以ArrayBuffer請求正文的表示形式。
- formData()
Promise<FormData>- 返回以FormData請求正文的表示形式(即將支持)。
- json()
Promise<Object>- 返回使用請求正文的JSON表示形式的Promise。
- text()
Promise<string>- 返回使用請求正文的字符串表示形式的Promise。
示例
常見用法
- 獲得請求方法:request.method。
- 獲得請求url:request.url。
- 獲得請求頭:request.header。
- 獲得請求負載:request.body,body是一個ReadableStream對象。
- 獲得JSON:await request.json()。
- 獲得表單數據:await request.formData()。
- 獲得UTF8字符串:await request.text()。
嘗試訪問非活動Request上下文時將出錯
在腳本啟動期間嘗試使用fetch()或訪問Request上下文的任何嘗試都會引發異常:
const promise = fetch("//www.daliqc.cn/") // Error
async function eventHandler(event){..}
注意此代碼段將在腳本啟動期間拋出異常,并且"fetch"事件偵聽器將永遠不會被注冊。