有關(guān)三種流行的HTTP路由模式的高級(jí)概述,在文中,當(dāng)Azure Functions上下文中引用HTTP路由時(shí),是指基于路徑的路由。Azure Functions中的HTTP路由負(fù)責(zé)將請(qǐng)求URI映射到終結(jié)點(diǎn),并將HTTP請(qǐng)求路由到那些終結(jié)點(diǎn)。此外,Azure Functions可以從請(qǐng)求中包含的URI中提取值,并將這些值用于請(qǐng)求處理。后者是將多個(gè)參數(shù)傳遞給HTTP觸發(fā)器的有用方法。
路由前綴
顧名思義,您可以在Azure Functions中為HTTP觸發(fā)器自定義或刪除默認(rèn)的“ api”路由前綴。要對(duì)其進(jìn)行更改,請(qǐng)修改host.json文件并添加以下配置設(shè)置:
{
"extensions": {
"http": {
"routePrefix": "foo"
}
}
}
在上面的示例中,我們將路由前綴設(shè)置為“ foo”。請(qǐng)注意:此設(shè)置是“全局”設(shè)置,因?yàn)槿绻诠δ軕?yīng)用程序中托管多個(gè)功能,則此設(shè)置將適用于所有功能。考慮到該設(shè)置的全局性質(zhì),在修改默認(rèn)設(shè)置方面我沒有發(fā)現(xiàn)太多價(jià)值。
路線參數(shù)
如上所述,HTTP路由可以在Azure功能中用于兩個(gè)目的:將請(qǐng)求URI映射到終結(jié)點(diǎn)或請(qǐng)求處理。路由在function.json文件中定義,并在啟動(dòng)功能應(yīng)用程序時(shí)進(jìn)行配置。根據(jù)文檔,路由參數(shù)名稱必須為非空并且不能包含以下字符:{,},/。
將請(qǐng)求URI映射到端點(diǎn)
到目前為止,這種模式最容易實(shí)現(xiàn)。讓我們來看一個(gè)示例,在該示例中,您希望在同一函數(shù)應(yīng)用程序中托管兩個(gè)版本的HTTP觸發(fā)函數(shù)。
在此示例中,我們有一個(gè)名為“ FirstName”的HTTP觸發(fā)函數(shù)。要將版本添加到路由,只需修改function.json文件并添加以下配置設(shè)置:
"route": "v1/FirstName",
現(xiàn)在,您可以創(chuàng)建一個(gè)類似的名為“ FirstName2”的HTTP觸發(fā)函數(shù),修改function.json文件并添加以下配置設(shè)置:
"route": "v2/FirstName",
您可以使用此功能來確保不破壞與您發(fā)布的功能的兼容性或?qū)⒘髁柯酚傻浇o定的端點(diǎn)。
使用HTTP路由參數(shù)進(jìn)行請(qǐng)求處理
讓我們來看一個(gè)使用route參數(shù)來自定義請(qǐng)求處理的示例。考慮默認(rèn)的HTTP觸發(fā)器模板,該模板將傳遞給“ name”參數(shù)的數(shù)據(jù)作為輸入,然后輸出傳遞給函數(shù)的數(shù)據(jù)。假設(shè)您要擴(kuò)展此功能以同時(shí)使用名字和姓氏,則可以將以下內(nèi)容添加到function.json文件中:
"route": "FirstNameLastName/{firstname}/{lastname}"
然后,您將修改功能代碼以反映以下內(nèi)容:
def main(req: func.HttpRequest) -> func.HttpResponse:
logging.info('Python HTTP trigger function processed a request.')
firstname = req.route_params.get('firstname')
lastname = req.route_params.get('lastname')
return func.HttpResponse(f"Hello {firstname} {lastname}! ")
請(qǐng)注意,您使用“ route_params”屬性而不是“ params”屬性。Python的HTTPRequest類的完整文檔在這里。
在本地運(yùn)行函數(shù)時(shí),您會(huì)注意到URL已從默認(rèn)值修改:
FirstNameLastName: [GET]
路線約束
在route參數(shù)中添加約束可以使您限制如何匹配function.json中的路由。通用語法為“ {parameter:constraint}”。例如,如果我們想限制我們的FirstNameLastName 該函數(shù)僅接受我們先前定義的兩條路由的字母字符,我們將在function.json中對(duì)其進(jìn)行配置,如下所示:
"route": "FirstNameLastName/{firstname:alpha}/{lastname:alpha}",
考慮到Azure Functions的按交易付費(fèi)性質(zhì),這是一種確保您的功能應(yīng)用程序僅處理有效交易的絕佳方法。
請(qǐng)注意:路由約束的處理不是由功能應(yīng)用程序執(zhí)行,而是由Azure功能主機(jī)執(zhí)行。如果您提供的URI錯(cuò)誤,Azure函數(shù)主機(jī)將返回404。我將在以后的博客文章中介紹有關(guān)調(diào)試路由參數(shù)的內(nèi)容。
強(qiáng)制與可選路由參數(shù)
您可以將HTTP路由參數(shù)標(biāo)記為可選,從而在代碼中提供一些靈活性。'?' 字符將參數(shù)標(biāo)記為可選參數(shù),并且只能出現(xiàn)在參數(shù)末尾。例如,如果我們想在上一個(gè)示例中將姓氏路由參數(shù)標(biāo)記為可選,則可以在function.json中對(duì)其進(jìn)行配置,如下所示:
"route": "FirstNameLastName/{firstname:alpha}/{lastname:alpha?}",
請(qǐng)注意,如果您沒有將lastname傳遞給上述URI,則功能代碼中l(wèi)astname變量的值將為None。
以上就是關(guān)于如何使用Python在Azure Functions 2.x中配置HTTP路由參數(shù)的全部?jī)?nèi)容,想了解更多關(guān)于Python的信息,請(qǐng)繼續(xù)關(guān)注中培偉業(yè)。