分享
  1. 首页
  2. 文章

golang 创建 restful 服务

zidea · · 4367 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

2_16x9_filtered.jpg.pagespeed.ce.zVPGFVmXTR.jpg

有关 restful 可以参看
会说话Restful

创建工程

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

package main
import (
 "encoding/json"
 "log"
 "net/http"
 "math/rand"
 "strconv"
 "github.com/gorilla/mux"
)
func main(){
 
}

设计路由

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

func main(){
 //Init Router
 r := mux.NewRouter()
 //Route Handlers / Endpoints
 r.HandleFunc("/api/tuts", getTuts).Methods("GET")
}
//Init Router
 r := mux.NewRouter()
 //Route Handlers / Endpoints
 r.HandleFunc("/api/tuts", getTuts).Methods("GET")
 r.HandleFunc("/api/tuts/{id}", getTut).Methods("GET")
 r.HandleFunc("/api/tuts", createTut).Methods("POST")
 r.HandleFunc("/api/tuts/{id}", updateTut).Methods("PUT")
 r.HandleFunc("/api/tuts/{id}", deleteTut).Methods("DELETE")

定义服务

log.Fatal(http.ListenAndServe(":4200",r))

定义数据模型结构

// tut struct (Model)
type Tut struct{
 ID string `json:"id"`
 Isbn string `json:"isbn"`
 Title string `json:"title"`
 Author *Author `json:"author"`
}
// Author Struct
type Author struct{
 Name string `json:"name"`
}

定义请求的处理句柄

func getTuts(w http.ResponseWriter, r *http.Request){
}
// get Single Tut
func getTut(w http.ResponseWriter, r *http.Request){
 
}
// create new Tut
func createTut(w http.ResponseWriter, r *http.Request){
 
}
//update tut
func updateTut(w http.ResponseWriter, r *http.Request){
 
}
//delete tut
func deleteTut(w http.ResponseWriter, r *http.Request){
 
}

模拟数据库

tuts = append(tuts, Tut{ID:"1",Isbn:"123",Title:"angular base tut",Author:&Author{
 Name:"zidea",
 }})
 tuts = append(tuts, Tut{ID:"2",Isbn:"345",Title:"vue base tut",Author:&Author{
 Name:"tina",
 }})
 tuts = append(tuts, Tut{ID:"3",Isbn:"456",Title:"react base tut",Author:&Author{
 Name:"zidea",
 }})

实现获取所有课程的列表

func getTuts(w http.ResponseWriter, r *http.Request){
 w.Header().Set("Content-Type","application/json")
 json.NewEncoder(w).Encode(tuts)
}

修改代码后我们需要重新 build 后再次启动服务。

然后可以 Postman 开测试一下我们的接口是否好用

屏幕快照 2019年04月06日 上午6.54.32.png
屏幕快照 2019年04月06日 上午6.54.26.png

实现单条查找

func getTut(w http.ResponseWriter, r *http.Request){
 w.Header().Set("Content-Type","application/json")
 params := mux.Vars(r) //Get params
 // loop through tuts and find with id
 for _, item := range tuts {
 if item.ID == params["id"]{
 json.NewEncoder(w).Encode(item)
 return 
 }
 }
 
 json.NewEncoder(w).Encode(&Tut{})
}
屏幕快照 2019年04月06日 上午7.06.51.png
屏幕快照 2019年04月06日 上午7.06.55.png

创建课程

func createTut(w http.ResponseWriter, r *http.Request){
 w.Header().Set("Content-Type","application/json")
 var tut Tut
 _ = json.NewDecoder(r.Body).Decode(&tut)
 tut.ID = strconv.Itoa(rand.Intn(1000)) // Mock Id
 tuts = append(tuts, tut)
 json.NewEncoder(w).Encode(tut)
}

测试接口


屏幕快照 2019年04月06日 上午7.17.30.png
屏幕快照 2019年04月06日 上午7.17.42.png

实现删除课程

func deleteTut(w http.ResponseWriter, r *http.Request){
 fmt.Println("call delete handler")
 w.Header().Set("Content-Type","application/json")
 params := mux.Vars(r)
 fmt.Println(params["id"])
 for index, item := range tuts{
 if item.ID == params["id"]{
 tuts = append(tuts[:index],tuts[index+1:]...)
 break
 }
 }
 json.NewEncoder(w).Encode(tuts)
}
屏幕快照 2019年04月06日 上午7.40.10.png

更新课程

func updateTut(w http.ResponseWriter, r *http.Request){
 fmt.Println("call delete handler")
 w.Header().Set("Content-Type","application/json")
 params := mux.Vars(r)
 fmt.Println(params["id"])
 for index, item := range tuts{
 if item.ID == params["id"]{
 tuts = append(tuts[:index],tuts[index+1:]...)
 var tut Tut
 _ = json.NewDecoder(r.Body).Decode(&tut)
 tut.ID = params["id"] // Mock Id
 tuts = append(tuts, tut)
 json.NewEncoder(w).Encode(tut)
 return 
 }
 }
 json.NewEncoder(w).Encode(tuts)
}
屏幕快照 2019年04月06日 上午7.40.48.png

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:zidea

查看原文:golang 创建 restful 服务

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
4367 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏