§HTTP 要求處理常式
Play 提供一系列抽象化,用於將要求路由至動作,提供路由器和濾鏡以滿足最常見的需求。然而,有時應用程式會有更進階的需求,而 Play 的抽象化無法滿足。當發生這種情況時,應用程式可以提供 Play 最低層級 HTTP 管線 API 的自訂實作,即 HttpRequestHandler
。
提供自訂 HttpRequestHandler
應該是最後的行動方案。大多數自訂需求都可以透過實作自訂路由器或 篩選器 來滿足。
§實作自訂要求處理常式
HttpRequestHandler
特質有一個方法要實作,handlerForRequest
。這會取得要求以取得處理常式,並傳回 RequestHeader
和 Handler
的組元。
傳回要求標頭的原因是,這樣可以將資訊新增至要求,例如路由資訊。透過這種方式,路由器可以標記要求並附上路由資訊,例如哪個路由與要求相符,這對於監控或甚至注入跨切功能都很有用。
一個很簡單的僅委派至路由器的要求處理常式可能會像這樣
import javax.inject.Inject
import play.api.http._
import play.api.mvc._
import play.api.routing.Router
class SimpleHttpRequestHandler @Inject() (router: Router, action: DefaultActionBuilder) extends HttpRequestHandler {
def handlerForRequest(request: RequestHeader) = {
router.routes.lift(request) match {
case Some(handler) => (request, handler)
case None => (request, action(Results.NotFound))
}
}
}
§擴充預設要求處理常式
在多數情況下,您可能不想從頭建立新的要求處理常式,您會想要建立在預設的基礎上。這可以透過擴充 DefaultHttpRequestHandler 來完成。預設要求處理常式提供許多可以覆寫的方法,這讓您可以實作自訂功能,而不用重新實作標記要求、處理錯誤等的程式碼。
自訂要求處理常式的一個使用案例可能是您想要委派至不同的路由器,具體取決於要求的主機為何。以下是一個說明如何這樣做的範例
import javax.inject.Inject
import javax.inject.Provider
import play.api.http._
import play.api.mvc.RequestHeader
class VirtualHostRequestHandler @Inject() (
webCommands: WebCommands,
optionalDevContext: OptionalDevContext,
errorHandler: HttpErrorHandler,
configuration: HttpConfiguration,
filters: HttpFilters,
fooRouter: Provider[foo.Routes],
barRouter: Provider[bar.Routes]
) extends DefaultHttpRequestHandler(
webCommands,
optionalDevContext,
fooRouter,
errorHandler,
configuration,
filters
) {
override def routeRequest(request: RequestHeader): Option[Handler] = {
request.host match {
case "foo.example.com" => fooRouter.get.routes.lift(request)
case "bar.example.com" => barRouter.get.routes.lift(request)
case _ => super.routeRequest(request)
}
}
}
§設定 http 要求處理常式
如果您使用 BuiltInComponents
來建構您的應用程式,請覆寫 httpRequestHandler
方法以傳回自訂處理常式的執行個體。
如果您使用執行時期依賴性注入(例如 Guice),則可以在執行時期動態載入要求處理常式。最簡單的方法是在根目錄中建立一個稱為 RequestHandler
的類別,實作 HttpRequestHandler
。
如果您不想將要求處理常式放在根目錄中,或者您想要針對不同的環境設定不同的要求處理常式,您可以在 application.conf
中設定 play.http.requestHandler
設定屬性來執行此動作
play.http.requestHandler = "com.example.RequestHandler"
下一步:基本動作
在這個文件檔中找到錯誤?此頁面的原始碼可以在 這裡 找到。在閱讀 文件檔指南 後,請隨時貢獻一個 pull request。有問題或建議要分享嗎?請前往 我們的社群論壇 與社群展開對話。