HTTP請(qǐng)求處理程序(HTTP Handler)
您可以使用HTTP請(qǐng)求處理程序更方便地處理HTTP請(qǐng)求。當(dāng)調(diào)用函數(shù)時(shí),函數(shù)計(jì)算使用您提供的執(zhí)行方法來處理HTTP請(qǐng)求。本文介紹Node.js HTTP請(qǐng)求處理程序的結(jié)構(gòu)特點(diǎn)和使用示例等。
HTTP Handler簽名
Node.js的HTTP Handler的簽名如下。您只需實(shí)現(xiàn)一個(gè)函數(shù),就能響應(yīng)HTTP請(qǐng)求。
exports.handler = (req, resp, context) => {
console.log("receive body: ", req.body.toString());
resp.setHeader("Content-Type", "text/plain");
resp.send('<h1>Hello, world!</h1>');
}
示例解析如下:
handler
:HTTP Handler名稱。req
:HTTP請(qǐng)求結(jié)構(gòu)體。resp
:HTTP返回結(jié)構(gòu)體。context
:上下文信息。具體信息,請(qǐng)參見上下文。
HTTP請(qǐng)求結(jié)構(gòu)體
字段 | 類型 | 描述 |
headers | Object | 存放來自HTTP客戶端的鍵值對(duì)。 |
path | String | 表示HTTP路徑。 |
queries | Object | 存放來自HTTP路徑中的查詢部分的鍵值對(duì),值的類型可以為字符串或數(shù)組。 |
method | String | 表示HTTP方法。 |
clientIP | String | 客戶端的IP地址。 |
url | String | 請(qǐng)求的地址。 |
Headers鍵值對(duì)中的key
中包含以下字段或以x-fc-
開頭的key
均會(huì)被忽略,因此,不支持自定義。
connection
keep-alive
HTTP響應(yīng)結(jié)構(gòu)體
方法 | 類型 | 描述 |
response.setStatusCode(statusCode) | interger | 設(shè)置狀態(tài)碼。 |
response.setHeader(headerKey, headerValue) | String,String | 設(shè)置響應(yīng)頭。 |
response.deleteHeader(headerKey) | String | 刪除響應(yīng)頭。 |
response.send(body) | Buffer,String,Stream.Readable | 發(fā)送響應(yīng)體。 |
headerKey
中包含以下字段或以x-fc-
開頭的headerKey
均會(huì)被忽略,因此,不支持自定義。
connection
content-length
date
keep-alive
server
upgrade
限制說明
請(qǐng)求限制
如果超過以下限制,會(huì)返回400狀態(tài)碼和InvalidArgument錯(cuò)誤碼。
字段
限制說明
HTTP狀態(tài)碼
錯(cuò)誤碼
headers
請(qǐng)求頭中的所有鍵和值的總大小不能超過8 KB。
400
InvalidArgument
path
請(qǐng)求路徑以及所有查詢參數(shù)的總大小不能超過4 KB。
body
同步調(diào)用請(qǐng)求的Body的總大小不能超過32 MB,異步調(diào)用請(qǐng)求的Body的總大小不能超過128 KB。
響應(yīng)限制
如果超過以下限制,會(huì)返回502狀態(tài)碼和BadResponse錯(cuò)誤碼。
字段
限制說明
HTTP狀態(tài)碼
錯(cuò)誤碼
headers
響應(yīng)頭中的所有鍵和值對(duì)的大小不能超過8 KB。
502
BadResponse
示例:獲取HTTP請(qǐng)求詳細(xì)信息并返回Body
示例代碼
module.exports.handler = function (request, response, context) {
// get request header
var reqHeader = request.headers
var headerStr = ' '
for (var key in reqHeader) {
headerStr += key + ':' + reqHeader[key] + ' '
};
// get request info
var url = request.url
var path = request.path
var queries = request.queries
var queryStr = ''
for (var param in queries) {
queryStr += param + "=" + queries[param] + ' '
};
var method = request.method
var clientIP = request.clientIP
var body = request.body
var respBody = new Buffer('requestHeader:' + headerStr + '\n' + 'url: ' + url + '\n' + 'path: ' + path + '\n' + 'queries: ' + queryStr + '\n' + 'method: ' + method + '\n' + 'clientIP: ' + clientIP + '\n' + 'body: ' + body + '\n')
response.setStatusCode(200)
response.setHeader('content-type', 'application/json')
response.send(respBody)
};
前提條件
操作步驟
- 登錄函數(shù)計(jì)算控制臺(tái),在左側(cè)導(dǎo)航欄,單擊服務(wù)及函數(shù)。
- 在頂部菜單欄,選擇地域,然后在服務(wù)列表頁面,單擊目標(biāo)服務(wù)。
在函數(shù)管理頁面,單擊創(chuàng)建函數(shù)。
創(chuàng)建運(yùn)行環(huán)境為Node.js 14.x的HTTP函數(shù)。具體操作步驟,請(qǐng)參見創(chuàng)建函數(shù)。
在函數(shù)詳情頁面,單擊函數(shù)代碼頁簽,在代碼編輯器中輸入上述示例代碼,然后單擊部署代碼。
說明上述示例代碼中函數(shù)的請(qǐng)求處理程序是
index.js
中的handler
方法。如果您的函數(shù)配置的請(qǐng)求處理程序不同,請(qǐng)獲取對(duì)應(yīng)的文件和方法進(jìn)行更新。具體信息,請(qǐng)參見函數(shù)實(shí)例生命周期回調(diào)方法。在函數(shù)代碼頁簽,單擊測(cè)試函數(shù)右側(cè)的圖標(biāo),從下拉列表中選擇配置測(cè)試參數(shù)。
在配置測(cè)試參數(shù)面板,選擇創(chuàng)建新測(cè)試請(qǐng)求或編輯已有測(cè)試請(qǐng)求,配置以下參數(shù),然后單擊確定。
請(qǐng)求名稱:輸入自定義請(qǐng)求名稱。
請(qǐng)求方式:選擇POST。
請(qǐng)求路徑:輸入?foo=bar。
請(qǐng)求 Body:在代碼框中輸入hello,fc。
單擊測(cè)試函數(shù)。
函數(shù)執(zhí)行成功后,您可以看到返回結(jié)果中包含的客戶端IP地址等信息。