Scala下Play框架学习笔记(Http Routing)
admin
2023-08-01 22:20:09
0

内置的HTTP路由

路由把每一个引进来的HTTP请求对应到相应的Action去。

HTTP请求被认为是MVC框架下的一个事件,这一事件包含两部分主要信息:

(1)请求路径,包括query String

(2)HTTP方法,如get,post等

   路由被定义在经过编译的conf/routes中,因此你能在浏览器上直接看到报错信息。

Scala下Play框架学习笔记(Http Routing)

conf/routes中每一行一般由HTTP方法和相应URI组成:

GET   /clients/:id          controllers.Clients.show(id: Long)

也可加上评论:

# Display a client.

GET   /clients/:id          controllers.Clients.show(id: Long)

以下这个不太懂,请高人指教:

->      /api                        api.MyRouter

HTTP方法

HTTP方法包括get、post、patch、put、delete、head等。

URI PATTERN

URI PATTERN定义了routes的路径,部分请求路径可以是动态的。

(1)静态路径:

准确匹配请求路径,可以定义如下:

GET   /clients/all          controllers.Clients.list()

 (2)动态的部分:

如果要通过ID来搜索路径,需要用动态指定的方式。

GET   /clients/:id          controllers.Clients.show(id: Long)

The default matching strategy for a dynamic part is defined by the regular expression [^/]+, meaning that any dynamic part defined as :id will match exactly one URI path segment.

通过*id可以来匹配多个URI,如下:

GET   /files/*name          controllers.Application.download(name)

以上的router,对于GET /files/p_w_picpaths/logo.png这样的请求,name会匹配p_w_picpaths/logo.png。

用自定义正则表达式动态路由

$id可以来自定义正则表达式

GET   /items/$id<[0-9]+>    controllers.Items.show(id: Long)

 the parameter is not decoded by the router or encoded by the reverse router. You’re responsible for validating the input to make sure it makes sense in that context.

controller action method

如果方法没有参数,可以如下定义:

GET   /                     controllers.Application.homePage()

如果有参数,则从请求URI中寻找参数:

# Extract the page parameter from the path.

GET   /:page                controllers.Application.show(page)

或者如下:

# Extract the page parameter from the query string.

GET   /                     controllers.Application.show(page)

show方法的定义如下:

def show(page: String) = Action {
  loadContentFromDatabase(page).map { htmlContent =>
    Ok(htmlContent).as("text/html")
  }.getOrElse(NotFound)

}

如果要把入参转换成scala的数据类型,就要有下面的router,并且实现相应的方法:

GET   /clients/:id          controllers.Clients.show(id: Long)

def show(id: Long) = Action {
  Client.findById(id).map { client =>
    Ok(views.html.Clients.display(client))
  }.getOrElse(NotFound)

}

固定值的参数:

# Extract the page parameter from the path, or fix the value for /
GET   /                     controllers.Application.show(page = "home")

GET   /:page                controllers.Application.show(page)

默认值方式:

# Pagination links, like /clients?page=3

GET   /clients              controllers.Clients.list(page: Int ?= 1)

Option类型,不需要在每一次传参时都传入:

# The version parameter is optional. E.g. /api/list-all?version=3.0

GET   /api/list-all         controllers.Api.list(version: Option[String])

注:多个routes冲突时,使用第一个。

play.api.mvc.Call中提供了HTTP回调,提供了HTTP和URI方法,它用如下方法创建控制器:

package controllers

import play.api._
import play.api.mvc._

class Application extends Controller {

 
def hello(name: String) = Action {
   
Ok("Hello " + name + "!")
 
}

}

如果在conf/routes中有如下定义:

# Hello action
GET   
/hello/:name          controllers.Application.hello(name)

那么可以通过controllers.routes.Application实现控制反转:

// Redirect to /hello/Bob
def helloBob = Action {
 
Redirect(routes.Application.hello("Bob"))

}

默认控制器:

# Redirects to https://www.playframework.com/ with 303 See Other
GET   
/about      controllers.Default.redirect(to = "https://www.playframework.com/")

# Responds with 404 Not Found
GET   
/orders     controllers.Default.notFound

# Responds with 500 Internal Server Error
GET   
/clients    controllers.Default.error

# Responds with 501 Not Implemented
GET   
/posts      controllers.Default.todo




相关内容

热门资讯

华电科工获得实用新型专利授权:... 证券之星消息,根据天眼查APP数据显示华电科工(601226)新获得一项实用新型专利授权,专利名为“...
中集集团获得实用新型专利授权:... 证券之星消息,根据天眼查APP数据显示中集集团(000039)新获得一项实用新型专利授权,专利名为“...
原创 科... 最近科学家公布了一个让很多人感到意外的发现,陪伴了地球45亿年的月球,正在以每年3.8厘米的速度悄悄...
福建省交通运输系统全力迎战台风... 福州7月9日电 (记者 闫旭 通讯员 陈勤思)今年第9号超强台风“巴威”正逐步逼近福建省沿海,福建省...
从“简易理疗”到“智慧康复” 从“简易理疗”到“智慧康复” 彭州西郊社区卫生服务中心探索基层康复新路径 患者在中心开展康复治疗。...
这位CEO为何认为游戏数据比互... 在实现通用人工智能(AGI)的道路上,大语言模型似乎并不是最终答案。ChatGPT和Claude等模...
Meta入局AI代码大模型赛道... 来源:环球市场播报 核心要点 Meta 推出 Muse Spark 大模型重大更新,并公布定价方...
同济科技夏令营落幕,900余名... 昨天(7月7日)下午,同济大学2026年中学生科技夏令营落幕。来自同济大学各附属学校、集团校、托管县...
超级算法大幅提升暗能量测量精度 西班牙巴塞罗那大学领衔的国际团队在最新一期《自然·天文》发表一项研究成果称,他们开发出一套名为CIG...
唯一中国玩家!国星宇航入选IT... 2026年7月7日,在瑞士日内瓦举行的2026人工智能向善全球峰会(AI for Good Glob...