讲真,我听了很多关于 Rest 的解释,这个算是让我最懂的。
千万别去找 Restful 的全拼写,这就好像:
你看到一个人在谈代码格式,然后你跑过去加入其中;这只能说明你跟这群人一样low
go fmt code/path
开个玩笑,下面是正题。
Rest 和 HTTP 紧密联系是因为,这种协议(protocol) 一般用于 web 开发。(具体原因看下面)
Rest 更多的应该是和 CRUD (create, read, update, delete)关联,对应 HTTP的多种方法。
Restful协议为什么和HTTP联系这么紧密?
- REST 的架构组成和 HTTP应用协议的应用类似:

可以看做抽象的 web-server 模型,就好像你点击超链接(hyperlink)然后返回得到的网页信息。
- REST操作基于 CRUD, 它和 HTTP 操作可以对应
HTTP 兼容了 REST 的各种操作(mapping): GET/POST/PUT/DELTE/OPTIONS. (映射并不固定)
(至于请求时通过 URL 头,还是 body发送出去, REST并没与规定,这是HTTP的工作)
但是资源的 URL 并不包含具体的HTP Method 名字,而是通过具体的资源是元素还是集合给出不同的链接。
同时, REST 也可以对应 SQL操作 (Web 应用一定会有持久化动作)。
RESTful API?
其实说白了,REST/HTTP API 做了那部分工作呢? URL/ROUTER 对应具体的 API
把本地资源的 CRUD 操作,通过类似HTTP协议的形式映射出去,链接就是其表现形式,绑定的方法才是实质
例如:
URL /note/:id 可以绑定具体的 handler 处理,就像这样:
1 2
| router.GET("url格式", 具体方法) router.PUT("url格式", 具体方法)
|
具体案例:(需要借助 httprouter 这个 golang 库)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| package main
import ( "flag" "fmt" "github.com/julienschmidt/httprouter" "log" "net/http" )
var ( addr = flag.String("addr", ":8080", "http service address") data map[string]string )
func main() { flag.Parse() data = map[string]string{}
r := httprouter.New() r.GET("/entry/:key", show) r.GET("/list", show) r.PUT("/entry/:key/:value", update) err := http.ListenAndServe(*addr, r)
if err != nil { log.Fatal("ListenAndServer:", err) } }
func show(w http.ResponseWriter, r *http.Request, p httprouter.Params) { k := p.ByName("key") if k == "" { fmt.Fprintf(w, "Read list :%v", data) return } fmt.Fprintf(w, "Read entry: data[%s] = %s", k, data[k]) }
func update(w http.ResponseWriter, r *http.Request, p httprouter.Params) { k := p.ByName("key") v := p.ByName("value")
data[k] = v fmt.Fprintf(w, "Update : data[%s] = %s", k, data[k]) }
|
(代码存储在: 《宝库-cases》)
运行一下, 然后 curl 调试:

Merlin 通过 golang 解释了一下 RESTful 协议,点到为止