浅谈HTTP routing

来源:互联网 发布:网络歌手伤感歌曲大全 编辑:程序博客网 时间:2024/04/30 12:51
http路由
在一般的网站框架中,http路由(以下简称路由)是一个组件。而它的功能是将每个从客户端获得的http请求转化为相应action(指Controler的一个方法,一般是静态的)呼唤-CALL。
 对于MVC框架来说,一个http请求会被视为一个事件。这个事件包含种信息。
1.请求路径,举例说(/clients/list) ,当然也包括查询字段。
2.http请求方法(GET,POST,PUT......),在下面会有详细的介绍。

编译好的路由在MVC框架中会存放在conf/routs文件里面

。这样你就可以在浏览器里看到错误信息。 

 路由文件:
 所谓路由文件,在大多数的web框架中,都是conf/routes这个文件。它是一个供路由而设的配置文件。在这个文件里面,主要是一个列表,它列出了所有app的路径。每一个路径都包括一个请求方法和一个与呼唤action有关的URI。举例:
 
GET /clients/:id controllers.Clients.show(id: Long)
如上:一个路由定义包括GET(请求方法)、URI(
clients/:id)、一个对呼唤定义(controllers.Clients.show(id: Long))
当然,你也可以在路由文件中添加组件,只需要在前面加一个#
#Display a client
GET /clients/:id controllers.Clients.show(id: Long)

 http方法:
http方法有(GET,POST,PUT,DELETE,HEAD),其中,前面两个最常见。 
HTTP请求格式
当浏览器向Web服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息,HTTP请求信息由3部分组成:
l   请求方法URI协议/版本
l   请求头(Request Header)
l   请求正文
下面是一个HTTP请求的例子:
GET/sample.jspHTTP/1.1
Accept:image/gif.image/jpeg,*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate
username=jinqiao&password=1234

URI模式:
URI模式是路由里面的请求路径。可以有动态的请求路径。
对于静态的URI: 
GET /clients/all controllers.Clients.list()
对于动态的URI: 
GET /clients/:id controllers.Clients.show(id: Long)
动态路由需要在方法后加上一个client的参数,在上例的路径前面有。一个动态的URI是可以有多个动态部分的。
如果你想你的动态部分更加,你可以使用斜杠“/”分割,比如:
GET /files/*name controllers.Application.download(name) 
 在这里,请求包括了name文件里面的所有文件。
同样,你也可以用正则表达式来定义你的动态部分,语法:$id<regex>
例如: 
GET /clients/$id<[0-9]+> controllers.Clients.show(id: Long)
GET /clients/$id<[0-9]+> controllers.Clients.show(id: Long) 
 
 呼唤一个action
路由的最后一部分是一个呼唤。这个部分是必须定义而且能有效地去呼唤一个action方法。
如果该方法没有任何参数,只需要定义整一个方法名即可。
GET / controllers.Application.homePage()
如果该方法定义了参数,则这些参数将会从请求URI或者查询字段中找到。

# Extract the page parameter from the path.
# i.e. http://myserver.com/index
GET /:page controllers.Application.show(page)
或者
# Extract the page parameter from the query string.
# i.e. http://myserver.com/?page=index
GET / controllers.Application.show(page)

具体的show方法定义如下

 
public static Result show(String page) {
 
   String content = Page.getContentOf(page);
   
 response().setContentType("text/html");
   
 return ok(content);
 
}
参数类型:
 上述例子中的参数是String类型,事实上参数可以多种类型的。
如基本的(int,float,double,long等),对象(Interger,double等)
参数可以同时赋值,例如:
# Pagination links, like /clients?page=3
GET /clients controllers.Clients.list(page: Integer ?= 1)
甚至,可以不需要用上所有在组件中已经定义的参数。比如:
# The version parameter is optional. E.g. /api/list-all?version=3.0
GET /api/list-all controllers.Api.list(version ?= null)

反向路由:
我们已经知道,路由可以通过一个JAVA CALL来产生一个URI。这样,所有的URI模式都可以放到一个简单的configuration文件里面。对于每一个Controller,路由都会产生对应的反向路由。它和路由一样有同样的action方法,同样的标记,但返回的是一个CALL而不是RESULT。

最后,我们举个例子:
如果有一个Controller:
package controllers;
import play.*;
import play.mvc.*;
   
public class Application extends Controller {
 
      public static Result hello(String name){
        
 return ok("Hello " + name + "!"); 
       } 
   }


在conf/rotues文件里面:
# Hello action
GET /hello/:name controllers.Application.hello(name)
0 0