AjaxREST介绍

摘自https://github.com/astaxie/build-web-application-with-golang/blob/master/8.3.md

     
RESTful,是最近极其流行的一种互联网软件架构。因为它结构清晰、符合标准、易于通晓、扩大方便,所以正得到越来越多网站的采用。本小节我们以后上学它究竟是一种何等的架构?以及在Go里面怎样来落实它。

什么是REST

REST(REpresentational State Transfer)这些定义,第一次出现是在 2000年罗伊(Roy)托马斯(Thomas)菲尔德(Field)(Field)ing(他是HTTP规范的严重性编者之一)的硕士杂文中,它指的是一组架构约束原则和规则。满足那多少个约束规范和规范的应用程序或计划就是RESTful的。

要清楚什么是REST,我们需要了然下边多少个概念:

  • 资源(Resources)
    REST是”表现层状态转化”,其实它概括了主语。”表现层”其实指的是”资源”的”表现层”。

    这就是说什么样是资源呢?就是我们平日上网访问的一张图片、一个文档、一个视频等。这个资源我们透过URI来恒定,也就是一个URI表示一个资源。

  • 表现层(Representation)

    资源是做一个实际的实体信息,他得以有多种的显示模式。而把实体展现出来就是展现层,例如一个txt文本音讯,他得以输出成html、json、xml等格式,一个图纸他得以jpg、png等格局突显,这多少个就是表现层的情致。

    URI确定一个资源,可是什么规定它的具体表现形式呢?应该在HTTP请求的头新闻中用Accept和Content-Type字段指定,这两个字段才是对”表现层”的叙说。

  • 气象转化(State Transfer)

    访问一个网站,就意味着了客户端和服务器的一个相互过程。在这多少个历程中,肯定涉及到数量和情景的扭转。而HTTP协议是无状态的,那么这么些意况自然保存在劳务器端,所以只要客户端想要公告服务器端改变多少和情状的成形,肯定要经过某种情势来打招呼它。

    客户端能通告服务器端的手腕,只好是HTTP协议。具体来说,就是HTTP协议里面,多个象征操作格局的动词:GET、POST、PUT、DELETE。它们各自对应四种基本操作:GET用来取得资源,POST用来新建资源(也足以用来立异资源),PUT用来更新资源,DELETE用来删除资源。

综述下边的说明,我们总括一下什么样是RESTful架构:

  • (1)每一个URI代表一种资源;
  • (2)客户端和服务器之间,传递这种资源的某种表现层;
  • (3)客户端通过五个HTTP动词,对劳动器端资源开展操作,实现”表现层状态转化”。

Web应用要满意REST最着重的规范是:客户端和服务器之间的相互在伸手之间是无状态的,即从客户端到服务器的各样请求都不可能不含有明白请求所必备的音讯。假若服务器在呼吁之间的另外时间点重启,客户端不会取得通告。此外此呼吁可以由其他可用服务器回答,这不行适合云总计之类的环境。因为是无状态的,所以客户端可以缓存数据以改良性能。

另一个至关首要的REST原则是系统分层,这意味着组件无法领会除了与它直接互动的层次以外的零件。通过将系统知识限制在单个层,可以限制整个系统的复杂,从而助长了底层的独立性。

下图即是REST的架构图:

Ajax 1

当REST架构的羁绊规范作为一个完全采纳时,将生成一个可以扩充到大方客户端的应用程序。它还降低了客户端和服务器之间的并行延迟。统一界面简化了百分之百系统架构,改进了子系统里头相互的可见性。REST简化了客户端和服务器的实现,而且对于使用REST开发的应用程序更加便于扩张。

下图展示了REST的增加性:

Ajax 2

RESTful的实现

Go没有为REST提供第一手辅助,不过因为RESTful是基于HTTP协议落实的,所以我们得以选用net/http包来自己实现,当然需要针对REST做一些改建,REST是依照不同的method来处理相应的资源,近日已经存在的累累自称是REST的选用,其实并从未真的的实现REST,我暂且把这多少个应用依据贯彻的method分成多少个级别,请看下图:

Ajax 3

上图突显了我们当下落实REST的六个level,大家在选拔开发的时候也不肯定全体按部就班RESTful的条条框框全部兑现他的点子,因为有点时候完全依据RESTful的主意不一定是行得通的,RESTful服务丰盛利用每一个HTTP方法,包括DELETEPUT。可有时,HTTP客户端只可以发出GETPOST请求:

  • HTML标准只好通过链接和表单协理GETPOST。在没有Ajax襄助的网页浏览器中不可以生出PUTDELETE命令

  • 稍微防火墙会遮掩HTTP PUTDELETE呼吁要绕过那么些界定,客户端需要把实际的PUTDELETE呼吁通过
    POST 请求穿透过来。RESTful 服务则要各负其责在接到的 POST
    请求中找到原来的 HTTP 方法并恢复生机。

俺们现在得以因此POST中间扩充隐藏字段_method这种方法可以来效仿PUTDELETE等格局,可是服务器端需要做转换。我现在的项目里面就依照这种办法来做的REST接口。当然Go语言里面完全依据RSETful来贯彻是很容易的,我们经过下面的事例来验证什么实现RESTful的接纳设计。

 1 package main
 2 
 3 import (
 4     "fmt"
 5     "github.com/drone/routes"
 6     "net/http"
 7 )
 8 
 9 func getuser(w http.ResponseWriter, r *http.Request) {
10     params := r.URL.Query()
11     uid := params.Get(":uid")
12     fmt.Fprintf(w, "you are get user %s", uid)
13 }
14 
15 func modifyuser(w http.ResponseWriter, r *http.Request) {
16     params := r.URL.Query()
17     uid := params.Get(":uid")
18     fmt.Fprintf(w, "you are modify user %s", uid)
19 }
20 
21 func deleteuser(w http.ResponseWriter, r *http.Request) {
22     params := r.URL.Query()
23     uid := params.Get(":uid")
24     fmt.Fprintf(w, "you are delete user %s", uid)
25 }
26 
27 func adduser(w http.ResponseWriter, r *http.Request) {
28     params := r.URL.Query()
29     uid := params.Get(":uid")
30     fmt.Fprint(w, "you are add user %s", uid)
31 }
32 
33 func main() {
34     mux := routes.New()
35     mux.Get("/user/:uid", getuser)
36     mux.Post("/user/:uid", modifyuser)
37     mux.Del("/user/:uid", deleteuser)
38     mux.Put("/user/", adduser)
39     http.Handle("/", mux)
40     http.ListenAndServe(":8088", nil)
41 }

 

上面的代码演示了如何编写一个REST的应用,我们访问的资源是用户,我们通过不同的method来访问不同的函数,这里使用了第三方库github.com/drone/routes,在前面章节我们介绍过如何实现自定义的路由器,这个库实现了自定义路由和方便的路由规则映射,通过它,我们可以很方便的实现REST的架构。通过上面的代码可知,REST就是根据不同的method访问同一个资源的时候实现不同的逻辑处理。

总结

REST是一种架构风格,汲取了WWW的成功经验:无状态,以资源为着力,充裕利用HTTP协议和URI协议,提供统一的接口定义,使得它看做一种设计Web服务的主意而变得流行。在某种意义上,通过强调URI和HTTP等中期Internet标准,REST是对大型应用程序服务器时代往日的Web格局的回归。近期Go对于REST的支撑依然很简短的,通过兑现自定义的路由规则,我们就足以为不同的method实现不同的handle,这样就实现了REST的架构。

相关文章