Go语言教程第十集 如何玩转Restful和RPC网络编程( 二 )


小提示:如果要更新一个用户的部分信息,使用 PATCH 方法更恰当 。
看到这里,相信你已经知道了如何删除一个用户,示例代码如下所示:
HTTP DELETE https://www.flysnow.org/users/123
方法的使用和 PUT 方法一样,也是操作单个资源,这里是删除 ID 为 123 的这个用户 。
一个简单的API
相信你已经非常了解什么是API 了,现在开始,我会带你通过一个使用实现API 风格的示例,加深API 的理解 。
Go 语言的一个很大的优势,就是可以很容易地开发出网络后台服务,而且性能快、效率高 。在开发后端 HTTP 网络应用服务的时候,我们需要处理很多 HTTP 的请求访问,比如常见的 API 服务,就要处理很多 HTTP 请求,然后把处理的信息返回给使用者 。对于这类需求,提供了内置的 net/http 包帮我们处理这些 HTTP 请求,让我们可以比较方便地开发一个 HTTP 服务 。
下面我们来看一个简单的 HTTP 服务的 Go 语言实现,代码如下所示:
ch21/main.go
func main() {http.HandleFunc("/users",handleUsers)http.ListenAndServe(":8080", nil)}func handleUsers(w http.ResponseWriter, r *http.Request){fmt.Fprintln(w,"ID:1,Name:张三")fmt.Fprintln(w,"ID:2,Name:李四")fmt.Fprintln(w,"ID:3,Name:王五")}
这个示例运行后,你在浏览器中输入 :8080/users, 就可以看到如下内容信息:
ID:1,Name:张三ID:2,Name:李四ID:3,Name:王五
也就是获取所有的用户信息,但是这并不是一个API,因为使用者不仅可以通过 HTTP GET 方法获得所有的用户信息,还可以通过 POST、、PUT 等 HTTP 方法获得所有的用户信息,这显然不符合API 的规范 。
现在我对以上示例进行修改,使它符合API 的规范,修改后的示例代码如下所示:
ch20/main.go
func handleUsers(w http.ResponseWriter, r *http.Request){switch r.Method {case "GET":w.WriteHeader(http.StatusOK)fmt.Fprintln(w,"ID:1,Name:张三")fmt.Fprintln(w,"ID:2,Name:李四")fmt.Fprintln(w,"ID:3,Name:王五")default:w.WriteHeader(http.StatusNotFound)fmt.Fprintln(w,"not found")}}
这里我只修改了函数,在该函数中增加了只在使用 GET 方法时,才获得所有用户的信息,其他情况返回 not found 。
现在再运行这个示例,会发现只能通过 HTTP GET 方法进行访问了,使用其他方法会提示 not found 。
JSON API
在项目中最常见的是使用 JSON 格式传输信息,也就是我们提供的API 要返回 JSON 内容给使用者 。
同样用上面的示例,我把它改造成可以返回 JSON 内容的方式,示例代码如下所示:
ch20/main.go
//数据源,类似MySQL中的数据var users = []User{{ID: 1,Name: "张三"},{ID: 2,Name: "李四"},{ID: 3,Name: "王五"},}func handleUsers(w http.ResponseWriter, r *http.Request){switch r.Method {case "GET":users,err:=json.Marshal(users)if err!=nil {w.WriteHeader(http.StatusInternalServerError)fmt.Fprint(w,"{\"message\": \""+err.Error()+"\"}")}else {w.WriteHeader(http.StatusOK)w.Write(users)}default:w.WriteHeader(http.StatusNotFound)fmt.Fprint(w,"{\"message\": \"not found\"}")}}//用户type User struct {ID intName string}
从以上代码可以看到,这次的改造主要是新建了一个 User 结构体,并且使用 users 这个切片存储所有的用户,然后在函数中把它转化为一个 JSON 数组返回 。这样,就实现了基于 JSON 数据格式的API 。
运行这个示例,在浏览器中输入 :8080/users,可以看到如下信息:
[{"ID":1,"Name":"张三"},{"ID":2,"Name":"李四"},{"ID":3,"Name":"王五"}]
这已经是 JSON 格式的用户信息,包含了所有用户 。