前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang 创建 restful 服务

golang 创建 restful 服务

作者头像
李海彬
发布2019-05-08 10:52:07
6250
发布2019-05-08 10:52:07
举报
文章被收录于专栏:Golang语言社区

作者:zidea 链接:https://www.jianshu.com/p/6c46c45c4bb6 来源:简书

有关 restful 可以参看 会说话Restful

创建工程

创建工程,然后创建 main 文件,引用所需包。

代码语言:javascript
复制
 1package main
 2
 3import (
 4    "encoding/json"
 5    "log"
 6    "net/http"
 7    "math/rand"
 8    "strconv"
 9    "github.com/gorilla/mux"
10)
11
12func main(){
13
14}

设计路由

这里引用一个 Mux 的包用于创建路由\

代码语言:javascript
复制
1func main(){
2    //Init Router
3    r := mux.NewRouter()
4    //Route Handlers / Endpoints
5    r.HandleFunc("/api/tuts", getTuts).Methods("GET")
6}
代码语言:javascript
复制
1//Init Router
2    r := mux.NewRouter()
3    //Route Handlers / Endpoints
4    r.HandleFunc("/api/tuts", getTuts).Methods("GET")
5    r.HandleFunc("/api/tuts/{id}", getTut).Methods("GET")
6    r.HandleFunc("/api/tuts", createTut).Methods("POST")
7    r.HandleFunc("/api/tuts/{id}", updateTut).Methods("PUT")
8    r.HandleFunc("/api/tuts/{id}", deleteTut).Methods("DELETE")

定义服务

代码语言:javascript
复制
1log.Fatal(http.ListenAndServe(":4200",r))

定义数据模型结构

代码语言:javascript
复制
 1// tut struct (Model)
 2type Tut struct{
 3    ID string `json:"id"`
 4    Isbn string `json:"isbn"`
 5    Title string `json:"title"`
 6    Author *Author `json:"author"`
 7}
 8
 9// Author Struct
10type Author struct{
11    Name string `json:"name"`
12}

定义请求的处理句柄

代码语言:javascript
复制
 1func getTuts(w http.ResponseWriter, r *http.Request){
 2
 3}
 4// get Single Tut
 5func getTut(w http.ResponseWriter, r *http.Request){
 6
 7}
 8// create new Tut
 9func createTut(w http.ResponseWriter, r *http.Request){
10
11}
12//update tut
13func updateTut(w http.ResponseWriter, r *http.Request){
14
15}
16//delete tut
17func deleteTut(w http.ResponseWriter, r *http.Request){
18
19}

模拟数据库

代码语言:javascript
复制
 1tuts = append(tuts, Tut{ID:"1",Isbn:"123",Title:"angular base tut",Author:&Author{
 2        Name:"zidea",
 3    }})
 4
 5    tuts = append(tuts, Tut{ID:"2",Isbn:"345",Title:"vue base tut",Author:&Author{
 6        Name:"tina",
 7    }})
 8
 9    tuts = append(tuts, Tut{ID:"3",Isbn:"456",Title:"react base tut",Author:&Author{
10        Name:"zidea",
11    }})

实现获取所有课程的列表

代码语言:javascript
复制
1func getTuts(w http.ResponseWriter, r *http.Request){
2    w.Header().Set("Content-Type","application/json")
3    json.NewEncoder(w).Encode(tuts)
4}

修改代码后我们需要重新 build 后再次启动服务。 然后可以 Postman 开测试一下我们的接口是否好用

实现单条查找

代码语言:javascript
复制
 1func getTut(w http.ResponseWriter, r *http.Request){
 2    w.Header().Set("Content-Type","application/json")
 3    params := mux.Vars(r) //Get params
 4    // loop through tuts and find with id
 5    for _, item := range tuts {
 6        if item.ID == params["id"]{
 7            json.NewEncoder(w).Encode(item)
 8            return 
 9        }
10    }
11
12    json.NewEncoder(w).Encode(&Tut{})
13}

创建课程

代码语言:javascript
复制
1func createTut(w http.ResponseWriter, r *http.Request){
2    w.Header().Set("Content-Type","application/json")
3    var tut Tut
4    _ = json.NewDecoder(r.Body).Decode(&tut)
5    tut.ID = strconv.Itoa(rand.Intn(1000)) // Mock Id
6    tuts = append(tuts, tut)
7    json.NewEncoder(w).Encode(tut)
8}

测试接口

实现删除课程

代码语言:javascript
复制
 1func deleteTut(w http.ResponseWriter, r *http.Request){
 2    fmt.Println("call delete handler")
 3    w.Header().Set("Content-Type","application/json")
 4    params := mux.Vars(r)
 5    fmt.Println(params["id"])
 6    for index, item := range tuts{
 7        if item.ID == params["id"]{
 8            tuts = append(tuts[:index],tuts[index+1:]...)
 9            break
10        }
11    }
12
13    json.NewEncoder(w).Encode(tuts)
14}

更新课程

代码语言:javascript
复制
 1func updateTut(w http.ResponseWriter, r *http.Request){
 2    fmt.Println("call delete handler")
 3    w.Header().Set("Content-Type","application/json")
 4    params := mux.Vars(r)
 5    fmt.Println(params["id"])
 6    for index, item := range tuts{
 7        if item.ID == params["id"]{
 8            tuts = append(tuts[:index],tuts[index+1:]...)
 9            var tut Tut
10            _ = json.NewDecoder(r.Body).Decode(&tut)
11            tut.ID = params["id"] // Mock Id
12            tuts = append(tuts, tut)
13            json.NewEncoder(w).Encode(tut)
14            return 
15        }
16    }
17
18    json.NewEncoder(w).Encode(tuts)
19}

版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 创建工程
  • 设计路由
  • 定义服务
  • 定义数据模型结构
  • 定义请求的处理句柄
  • 模拟数据库
  • 实现获取所有课程的列表
  • 实现单条查找
  • 创建课程
  • 实现删除课程
  • 更新课程
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档