Xitrum学习笔记04

时间:2022-06-22 05:44:43

标签:

RESTful API:

符合RESTful架构的API称为RESTful API,不同的前端设备与后端进行通信的一种统一机制

什么是RESTful架构:

  (1)每一个URI代表一种资源;

  (2)客户端和服务器之间,传递这种资源的某种表现层;

  (3)客户端通过HTTP动词(GET用来获取资源,POST用来新建、更新资源,PUT用来更新资源,,DELETE用来删除资源),对服务器端资源进行操作,实现"表现层状态转化"。

REST -- REpresentational State Transfer
全称是 Resource Representational State Transfer:通俗来讲就是:资源在网络中以某种表现形式进行状态转移。分解开来:
Resource:资源,即数据(前面说过网络的核心)。比如 newsfeed,friends等;
Representational:某种表现形式,比如用JSON,XML,JPEG等;
State Transfer:状态变化。通过HTTP动词实现。

参考文档:

       --理解RESTful架构

  --RESTful API 设计指南

https://www.zhihu.com/question/28557115    

Xitrum RESTful API示例:

import xitrum.Action import xitrum.annotation.GET @GET("articles") class ArticlesIndex extends Action { def execute() {...} } @GET("articles/:id") class ArticlesShow extends Action { def execute() {...} }

POST, PUT, PATCH, DELETE, and OPTIONS的使用与GET相同,Xitrum自动把HEAD当做响应体为空的GET来处理。

对于不支持PUT和DELETE的HTTP客户端,通过发送响应体中带有 _method=put 和 _method=delete 的POST来模拟PUT和DELETE动作

Web应用程序启动时,Xitrum会扫描所有annotations,创建路径表并在Console里打印出来,如:

[INFO] Normal routes: GET /articles/new demos.action.ArticlesNew GET / demos.action.SiteIndex POST /api/articles demos.action.ApiArticlesCreate PATCH /api/articles/:id demos.action.ApiArticlesUpdate DELETE /api/articles/:id demos.action.ApiArticlesDestroy GET /articles/:id<[0-9]+>.:format demos.action.ArticlesDotShow [INFO] SockJS routes: /sockJsChat demos.action.SockJsChatActor websocket: true, cookie_needed: false /fileMonitorSocket demos.action.FileMonitorSocket websocket: true, cookie_needed: false [INFO] Error routes: 404 demos.action.NotFoundError 500 demos.action.ServerError [INFO] Xitrum routes: GET /xitrum/xitrum-3.28.3.js xitrum.js GET /xitrum/swagger.json xitrum.routing.SwaggerJson GET /xitrum/swagger xitrum.routing.SwaggerUi GET /xitrum/metrics/viewer xitrum.metrics.XitrumMetricsViewer [INFO] Xitrum SockJS routes: /xitrum/metrics/channel xitrum.metrics.XitrumMetricsChannel websocket: true, cookie_needed: false

路径(Routes)会自动被收集,不需要额外的声明工作,我们也可以以类型安全的方式重建URLs

Route cache(路径缓存)

为了加快启动速度,路径被缓存到了文件 routes.cache中。在开发过程中,在target路径下的.class中的路径不会被缓存。

如果改变了包含路径的依赖库,需要删除routes.cache。routes.cache不应该被提交到代码版本库中

使用First和Last定义Route优先级

import xitrum.annotation.{GET, First} @GET("articles/:id") class ArticlesShow extends Action { def execute() {...} } @First // This route has higher priority than "ArticlesShow" above @GET("articles/new") class ArticlesNew extends Action { def execute() {...} }

这样在定义routes表时,ArticlesNew相应的路径就会排到最前面。Last注解的使用与First相同

一个Action有多个路径

@GET("image", "image/:format") class Image extends Action { def execute() { val format = paramo("format").getOrElse("png") // ... } }

路径中有点号和正则表达式

@GET("articles/:id", "articles/:id.:format") class ArticlesShow extends Action { def execute() { val id = param[Int]("id") val format = paramo("format").getOrElse("html") // ... } } @GET("articles/:id<[0-9]+>") ...

获取其余路径

/ 斜杠是特殊字符,所以不能出现在路径的参数中。需要参数中有斜杠的话,要把参数放在最后,且要用星号,例如

GET("service/:id/proxy/:*")

这个写法可以匹配  /service/123/proxy/http://foo.com/bar

获取 :* 的部分可以用以下代码实现

val url = param("*")   // Will be "http://foo.com/bar"

通过超链接标记<a>链接到一个Action

在View中的写法

<a href=http://www.mamicode.com/{url[ArticlesShow]("id" -> myArticle.id)}>{myArticle.title}</a>

重定向和转发到另一个action 重定向和转发:

转发是服务器行为,重定向是客户端行为。为什么这样说呢,这就要看两个动作的工作流程: