1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-24 04:22:22 +00:00

restful -> RESTFul

This commit is contained in:
Xargin 2018-12-19 11:38:38 +08:00
parent 7d2936a8fb
commit 188c1b47e3

View File

@ -2,7 +2,7 @@
在常见的Web框架中router是必备的组件。golang圈子里router也时常被称为http的multiplexer。在上一节中我们通过对Burrow代码的简单学习已经知道如何用http标准库中内置的mux来完成简单的路由功能了。如果开发Web系统对路径中带参数没什么兴趣的话用http标准库中的mux就可以。 在常见的Web框架中router是必备的组件。golang圈子里router也时常被称为http的multiplexer。在上一节中我们通过对Burrow代码的简单学习已经知道如何用http标准库中内置的mux来完成简单的路由功能了。如果开发Web系统对路径中带参数没什么兴趣的话用http标准库中的mux就可以。
restful 是几年前刮起的 API 设计风潮,在 restful 中除了 GET 和 POST 之外,还使用了 http 协议定义的几种其它的标准化语义。具体包括: RESTful是几年前刮起的API设计风潮在RESTful中除了GET和POST之外还使用了http协议定义的几种其它的标准化语义。具体包括:
```go ```go
const ( const (
@ -18,7 +18,7 @@ const (
) )
``` ```
来看看 restful 中常见的请求路径: 来看看RESTful中常见的请求路径:
```shell ```shell
GET /repos/:owner/:repo/comments/:id/reactions GET /repos/:owner/:repo/comments/:id/reactions
@ -30,13 +30,13 @@ PUT /user/starred/:owner/:repo
DELETE /user/starred/:owner/:repo DELETE /user/starred/:owner/:repo
``` ```
相信聪明的你已经猜出来了,这是 github 官方文档中挑出来的几个 api 设计。restful 风格的 API 重度依赖请求路径。会将很多参数放在请求 URI 中。除此之外还会使用很多并不那么常见的 HTTP 状态码,不过本节只讨论路由,所以先略过不谈。 相信聪明的你已经猜出来了,这是github官方文档中挑出来的几个api设计。RESTful风格的API重度依赖请求路径。会将很多参数放在请求URI中。除此之外还会使用很多并不那么常见的HTTP状态码不过本节只讨论路由所以先略过不谈。
如果我们的系统也想要这样的URI设计使用标准库的mux显然就力不从心了。 如果我们的系统也想要这样的URI设计使用标准库的mux显然就力不从心了。
## 5.2.1 httprouter ## 5.2.1 httprouter
较流行的开源 golang Web 框架大多使用 httprouter或是基于 httprouter 的变种对路由进行支持。前面提到的 github 的参数式路由在 httprouter 中都是可以支持的。 较流行的开源go Web框架大多使用httprouter或是基于httprouter的变种对路由进行支持。前面提到的github的参数式路由在httprouter中都是可以支持的。
因为httprouter中使用的是显式匹配所以在设计路由的时候需要规避一些会导致路由冲突的情况例如 因为httprouter中使用的是显式匹配所以在设计路由的时候需要规避一些会导致路由冲突的情况例如
@ -69,7 +69,7 @@ main.main()
exit status 2 exit status 2
``` ```
还有一点需要注意,因为 httprouter 考虑到字典树的深度,在初始化时会对参数的数量进行限制,所以在路由中的参数数目不能超过 255否则会导致 httprouter 无法识别后续的参数。不过这一点上也不用考虑太多,毕竟 URI 是人设计且给人来看的,相信没有变态的 URI 能在一条路径中带有 200 个以上的参数。 还有一点需要注意因为httprouter考虑到字典树的深度在初始化时会对参数的数量进行限制所以在路由中的参数数目不能超过255否则会导致httprouter无法识别后续的参数。不过这一点上也不用考虑太多毕竟URI是人设计且给人来看的相信没有长得夸张的URI能在一条路径中带有200个以上的参数。
除支持路径中的wildcard参数之外httprouter还可以支持`*`号来进行通配,不过`*`号开头的参数只能放在路由的结尾,例如下面这样: 除支持路径中的wildcard参数之外httprouter还可以支持`*`号来进行通配,不过`*`号开头的参数只能放在路由的结尾,例如下面这样:
@ -81,7 +81,7 @@ Pattern: /src/*filepath
/src/subdir/somefile.go filepath = "subdir/somefile.go" /src/subdir/somefile.go filepath = "subdir/somefile.go"
``` ```
这种设计在 restful 中可能不太常见,主要是为了能够使用 httprouter 来做简单的 http 静态文件服务器。 这种设计在RESTful中可能不太常见主要是为了能够使用httprouter来做简单的http静态文件服务器。
除了正常情况下的路由支持httprouter也支持对一些特殊情况下的回调函数进行定制例如404的时候 除了正常情况下的路由支持httprouter也支持对一些特殊情况下的回调函数进行定制例如404的时候
@ -105,7 +105,7 @@ r.PanicHandler = func(w http.ResponseWriter, r *http.Request, c interface{}) {
## 5.2.2 原理 ## 5.2.2 原理
httprouter 和众多衍生 router 使用的数据结构被称为 radix tree压缩字典树。读者可能没有接触过压缩字典树但对字典树 trie tree 应该有所耳闻。下图是一个典型的字典树结构: httprouter和众多衍生router使用的数据结构被称为压缩字典树(Radix Tree)。读者可能没有接触过压缩字典树,但对字典树(Trie Tree)应该有所耳闻。下图是一个典型的字典树结构:
![trie tree](../images/ch6-02-trie.png) ![trie tree](../images/ch6-02-trie.png)
@ -138,7 +138,7 @@ GET /marketplace_listing/plans/ohyes
### 5.2.3.1 root 节点创建 ### 5.2.3.1 root 节点创建
httprouter 的 Router struct 中存储压缩字典树使用的是下述数据结构: httprouter的Router结构体中存储压缩字典树使用的是下述数据结构:
```go ```go
// 略去了其它部分的 Router struct // 略去了其它部分的 Router struct