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

     
RESTful,是眼前极端流行的一种互连网软件架构。因为它结构清晰、符合标准、易于掌握、扩充方便,所以正获得进一步多网站的使用。本小节大家以往求学它到底是一种什么的架构?以及在Go里面如何来促成它。

什么是REST

REST(REpresentational State Transfer)那个定义,第二回面世是在 3000年Roy托马斯Fielding(他是HTTP规范的首要编者之一)的硕士故事集中,它指的是一组架构约束规范和标准化。知足那一个约束原则和标准的应用程序或安插就是RESTful的。

要明了什么是REST,大家须求知道上面多少个概念:

  • 能源(Resources)
    REST是”表现层状态转化”,其实它差不离了主语。”表现层”其实指的是”能源”的”表现层”。

    那正是说什么样是能源呢?正是大家经常上网访问的一张图纸、二个文书档案、1个录制等。那个财富大家因而U奥迪Q3I来稳定,也等于3个U途睿欧I表示一个能源。

  • 表现层(Representation)

    财富是做2个切实的实体信息,他得以有多样的变现格局。而把实体呈现出来就是彰显层,例如1个txt文本音信,他得以输出成html、json、xml等格式,1个图片他得以jpg、png等格局突显,那些正是显现层的意趣。

    ULANDI明确一个资源,然而怎么明显它的具体表现方式吗?应该在HTTP请求的头音讯中用Accept和Content-Type字段钦赐,那八个字段才是对”表现层”的叙述。

  • 处境转化(State Transfer)

    做客2个网站,就代表了客户端和服务器的三个互相进程。在这几个历程中,肯定涉及到数量和情景的转移。而HTTP协议是无状态的,那么那么些意况必然保存在劳务器端,所以只要客户端想要公告服务器端改变多少和情形的成形,肯定要经过某种格局来打招呼它。

    客户端能通告服务器端的一手,只好是HTTP协议。具体来说,就是HTTP协议里面,多个代表操作方法的动词:GET、POST、PUT、DELETE。它们各自对应多样基本操作:GET用来获得财富,POST用来新建财富(也足以用来创新能源),PUT用来更新财富,DELETE用来删除财富。

归结上边的分解,大家总括一下怎么是RESTful架构:

  • (1)每贰个U昂科威I代表一种能源;
  • (2)客户端和服务器之间,传递那种能源的某种表现层;
  • (3)客户端通过多个HTTP动词,对劳务器端财富进行操作,达成”表现层状态转化”。

Web应用要满足REST最重点的标准化是:客户端和服务器之间的互动在呼吁之间是无状态的,即从客户端到服务器的种种请求都不能够不包涵驾驭请求所必不可少的新闻。如若服务器在呼吁之间的任哪天刻点重启,客户端不会获得公告。其余此恳请能够由其他可用服务器回答,那13分适合云计算之类的环境。因为是无状态的,所以客户端能够缓存数据以革新质量。

另二个首要的REST原则是系统一分配层,那象征组件不大概精通除了与它直接互动的层系以外的零件。通过将系统知识限制在单个层,能够限制整个系统的复杂性,从而推进了底层的独立性。

下图便是REST的架构图:

json 1

当REST架构的束缚原则作为2个一体化选取时,将生成2个能够扩展到大方客户端的应用程序。它还下落了客户端和服务器之间的互相延迟。统一界面简化了整套系统架构,立异了子系统里面互相的可知性。REST简化了客户端和服务器的落到实处,而且对于使用REST开发的应用程序越发便于扩充。

下图显示了REST的扩张性:

json 2

RESTful的实现

Go没有为REST提供第三手帮助,不过因为RESTful是基于HTTP协议落实的,所以大家得以应用net/httpjson,包来本人达成,当然须要针对REST做一些改建,REST是依照不一致的method来拍卖相应的能源,近年来曾经存在的大队人马自称是REST的利用,其实并没有真正的落到实处REST,我一时把这一个使用依据兑现的method分成几个级别,请看下图:

json 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语言里面完全遵照福睿斯SETful来兑现是很简单的,我们因而下边包车型大巴事例来表明怎么着贯彻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协议和U奥迪Q7I协议,提供联合的接口定义,使得它当作一种设计Web服务的措施而变得流行。在某种意义上,通过强调U途锐I和HTTP等前期Internet标准,REST是对大型应用程序服务器时代从前的Web方式的回归。最近Go对于REST的支撑照旧相当的粗略的,通超过实际现自定义的路由规则,大家就足以为分歧的method达成不一致的handle,那样就达成了REST的架构。

相关文章

网站地图xml地图