Golang: RESTful 小案例

讲真,我听了很多关于 Rest 的解释,这个算是让我最懂的。

千万别去找 Restful 的全拼写,这就好像:

你看到一个人在谈代码格式,然后你跑过去加入其中;这只能说明你跟这群人一样low

go fmt code/path

开个玩笑,下面是正题。

Rest 和 HTTP 紧密联系是因为,这种协议(protocol) 一般用于 web 开发。(具体原因看下面)
Rest 更多的应该是和 CRUD (create, read, update, delete)关联,对应 HTTP的多种方法。

Restful协议为什么和HTTP联系这么紧密?

  1. REST 的架构组成和 HTTP应用协议的应用类似:

可以看做抽象的 web-server 模型,就好像你点击超链接(hyperlink)然后返回得到的网页信息。

  1. 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) //handler: 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 协议,点到为止

文章目录
|