REST介绍

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

     
RESTful,是眼下最流行的一致种互联网软件架构。因为她结构清晰、符合标准、易于掌握、扩展方便,所以刚刚得到更进一步多网站的动。本小节咱们前上她究竟是均等种何等的架?以及以Go里面如何来兑现其。

什么是REST

REST(REpresentational State Transfer)这个概念,首涂鸦面世是当 2000年Roy
Thomas
Fielding(他是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的架构图:

当REST架构的封锁规范作为一个完好无损以时,将不胜成一个足扩大及大气客户端的应用程序。它还降低了客户端和服务器之间的相延迟。统一界面简化了全套体系架构,改进了分系里面互相的可见性。REST简化了客户端与服务器的贯彻,而且对于以REST开发之应用程序更加爱扩展。

产图展示了REST的扩展性:

RESTful的实现

Go没有为REST提供直接支持,但是盖RESTful是冲HTTP协议落实的,所以我们得以采取net/http包来自己实现,当然要对REST做片改建,REST是基于不同之method来拍卖相应的资源,目前一度是的累累自称是REST的采取,其实并无真正的贯彻REST,我小还拿这些使用根据兑现的method分成几只级别,请看下图:

直达图显示了咱们眼前兑现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的架。

相关文章