专栏首页Golang语言社区golang 创建 restful 服务

golang 创建 restful 服务

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

有关 restful 可以参看 会说话Restful

创建工程

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

 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 的包用于创建路由\

1func main(){
2    //Init Router
3    r := mux.NewRouter()
4    //Route Handlers / Endpoints
5    r.HandleFunc("/api/tuts", getTuts).Methods("GET")
6}
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")

定义服务

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

定义数据模型结构

 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}

定义请求的处理句柄

 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}

模拟数据库

 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    }})

实现获取所有课程的列表

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 开测试一下我们的接口是否好用

实现单条查找

 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}

创建课程

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}

测试接口

实现删除课程

 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}

更新课程

 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}

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

本文分享自微信公众号 - Golang语言社区(Golangweb)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 50. RESTful API的简单实现 | 厚土Go学习笔记

    RESTfull API是现在很流行的 API 设计风格。众所周知的 HTTP 1.1规范正是基于 REST 架构风格的指导原理来设计的。需要注意的是,REST...

    李海彬
  • Go语言的网络编程简介

    本文通过 Go 语言写几个简单的通信示例,从 TCP 服务器过渡到 HTTP 开发,从而简单介绍 net 包的运用。 TCP 服务器 首先来看一个 TCP 服务...

    李海彬
  • Golang语言 Cookie的使用

    首先看看Cookie的结构体 type Cookie struct { Name string Value string Path ...

    李海彬
  • 查询已备案的未注册域名

    身在天朝,没办法,没备案很多事都搞不了。 备案是麻烦,但申请一个已备案的域名倒还没那么麻烦,好吧。下面是我的方法:

    用户1272546
  • 你敢信?四行Python代码就能知道你那的天气!

    今天给大家带来的Python实战项目是四行Python代码获取所在城市的天气预报,我们隐隐听到唏嘘声,不信四行Python代码可以获取是吗?那我们一起来看看:

    小小科
  • AI如何能比人类的眼睛看得更清楚?通俗的解释卷积神经网络

    本文介绍了现代计算机视觉的主要思想。我们探索如何将数百个学习图像中低级特征的神经元堆叠成几层。

    deephub
  • 借助 TensorFlow 工具来学习 CNN 和计算机视觉

    卷积神经网络(CNN)是计算机视觉应用的基础框架。在这篇文章中,你将会学到 CNNs 的基础和计算机视觉的基础(例如卷积,填充,卷积步长和池化层)。我们将使用T...

    AI研习社
  • TeaWeb – 可视化的Web代理服务

    最新版下载:http://teaos.cn/download#tunnel 相关文档:http://teaos.cn/doc/main/Summary.md

    Erwin
  • ASP.NET Ajax AsyncFileUpload 控件用法

    AsyncFileUpload控件,就是用来对文件进行异步上传的,示例看这里:http://www.asp.net/ajax/ajaxcontroltoolki...

    thz
  • 神经网络“天生”就会驾驶虚拟赛车

    众所周知,动物与生俱来就有独特能力和倾向,马出生后几个小时就能走路,鸭子孵化后很快就能游泳,而人类婴儿会自动被脸吸引。大脑已经进化到只需很少或根本没有经验就能承...

    大数据文摘

扫码关注云+社区

领取腾讯云代金券