• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    基于Go语言构建RESTful API服务

    在实际开发项目中,你编写的服务可以被其他服务使用,这样就组成了微服务的架构;也可以被前端调用,这样就可以前后端分离。那么,本文主要介绍什么是 RESTful API,以及 Go 语言是如何玩转 RESTful API 的。

    什么是 RESTful API

    RESTful API 是一套规范,它可以规范我们如何对服务器上的资源进行操作。在了解 RESTful API 之前,我先为你介绍下 HTTP Method,因为 RESTful API 和它是密不可分的。

    说起 HTTP Method,最常见的就是POST和GET,其实最早在 HTTP 0.9 版本中,只有一个GET方法,该方法是一个幂等方法,用于获取服务器上的资源,也就是我们在浏览器中直接输入网址回车请求的方法。

    在 HTTP 1.0 版本中又增加了HEAD和POST方法,其中常用的是 POST 方法,一般用于给服务端提交一个资源,导致服务器的资源发生变化。

    随着网络越来越复杂,发现这两个方法是不够用的,就继续新增了方法。所以在 HTTP1.1 版本的时候,一口气增加到了 9 个,新增的方法有 HEAD、OPTIONS、PUT、DELETE、TRACE、PATCH 和 CONNECT。下面我为你一一介绍它们的作用。

    从以上每个方法的介绍可以看到,HTTP 规范针对每个方法都给出了明确的定义,所以我们使用的时候也要尽可能地遵循这些定义,这样我们在开发中才可以更好地协作。

    理解了这些 HTTP 方法,就可以更好地理解 RESTful API 规范了,因为 RESTful API 规范就是基于这些 HTTP 方法规范我们对服务器资源的操作,同时规范了 URL 的样式和 HTTP Status Code。

    在 RESTful API 中,使用的主要是以下五种 HTTP 方法:

    以上 HTTP 方法在 RESTful API 规范中是一个操作,操作的就是服务器的资源,服务器的资源通过特定的 URL 表示。

    现在我们通过一些示例让你更好地理解 RESTful API,如下所示:

    HTTP GET http://localhost:1000/users
    
    HTTP GET http://localhost:1000/user/123
    
    

    以上是两个 GET 方法的示例:

    下面再看一个 POST 方法的示例,如下所示:

    HTTP POST http://localhost:1000/user

    这个示例表示创建一个用户,通过 POST 方法给服务器提供创建这个用户所需的全部信息。

    现在你已经知道了如何创建一个用户,那么如果要更新某个特定的用户怎么做呢?其实也非常简单,示例代码如下所示:

    HTTP PUT http://localhost:1000/user/123
    
    

    这表示要更新 / 替换 ID 为 123 的这个用户,在更新的时候,会通过 PUT 方法提供更新这个用户需要的全部用户信息。这里 PUT 方法和 POST 方法不太一样的是,从 URL 上看,PUT 方法操作的是单个资源,比如这里 ID 为 123 的用户。

    看到这里,相信你已经知道了如何删除一个用户,示例代码如下所示:

    HTTP DELETE http://localhost:1000/user/123
    
    

    DELETE 方法的使用和 PUT 方法一样,也是操作单个资源,这里是删除 ID 为 123 的这个用户。

    一个简单的 RESTful API

    相信你已经非常了解什么是 RESTful API 了,现在开始,我会带你通过一个使用 Golang 实现 RESTful API 风格的示例,加深 RESTful API 的理解。

    Go 语言的一个很大的优势,就是可以很容易地开发出网络后台服务,而且性能快、效率高。在开发后端 HTTP 网络应用服务的时候,我们需要处理很多 HTTP 的请求访问,比如常见的RESTful API 服务,就要处理很多 HTTP 请求,然后把处理的信息返回给使用者。对于这类需求,Golang 提供了内置的 net/http 包帮我们处理这些 HTTP 请求,让我们可以比较方便地开发一个 HTTP 服务。

    下面我们来看一个简单的 HTTP 服务的 Go 语言实现,代码如下所示:

    func main() {
    
       http.HandleFunc("/users",handleUsers)
    
       http.ListenAndServe(":1000", 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:王五")
    
    }
    
    

    这个示例运行后,你在浏览器中输入http://localhost:1000/users, 就可以看到如下内容信息:

    ID:1,Name:张三

    ID:2,Name:李四

    ID:3,Name:王五

    也就是获取所有的用户信息,但是这并不是一个 RESTful API,因为使用者不仅可以通过 HTTP GET 方法获得所有的用户信息,还可以通过 POST、DELETE、PUT 等 HTTP 方法获得所有的用户信息,这显然不符合 RESTful API 的规范。

    现在我对以上示例进行修改,使它符合 RESTful API 的规范,修改后的示例代码如下所示:

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

    这里我只修改了 handleUsers 函数,在该函数中增加了只在使用 GET 方法时,才获得所有用户的信息,其他情况返回 not found。

    现在再运行这个示例,会发现只能通过 HTTP GET 方法进行访问了,使用其他方法会提示 not found。

    RESTful JSON API

    在项目中最常见的是使用 JSON 格式传输信息,也就是我们提供的 RESTful API 要返回 JSON 内容给使用者。

    同样用上面的示例,我把它改造成可以返回 JSON 内容的方式,示例代码如下所示:

    //数据源,类似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 int
    
       Name string
    
    }
    
    

    从以上代码可以看到,这次的改造主要是新建了一个 User 结构体,并且使用 users 这个切片存储所有的用户,然后在 handleUsers 函数中把它转化为一个 JSON 数组返回。这样,就实现了基于 JSON 数据格式的 RESTful API。

    运行这个示例,在浏览器中输入http://localhost:1000/users,可以看到如下信息:

    [{"ID":1,"Name":"张三"},{"ID":2,"Name":"李四"},{"ID":3,"Name":"王五"}]

    这已经是 JSON 格式的用户信息,包含了所有用户。

    Gin 框架

    虽然 Go 语言自带的 net/http 包,可以比较容易地创建 HTTP 服务,但是它也有很多不足:

    引入 Gin 框架

    Gin 框架是一个在 Github 上开源的 Web 框架,封装了很多 Web 开发需要的通用功能,并且性能也非常高,可以让我们很容易地写出 RESTful API。

    Gin 框架其实是一个模块,也就是 Go Mod,所以采用 Go Mod 的方法引入即可。首先需要下载安装 Gin 框架,安装代码如下:

    go get -u github.com/gin-gonic/gin

    然后就可以在 Go 语言代码中导入使用了,导入代码如下:

    import "github.com/gin-gonic/gin"
    
    

    通过以上安装和导入这两个步骤,就可以在你的 Go 语言项目中使用 Gin 框架了。

    使用 Gin 框架

    现在,已经引入了 Gin 框架,下面我就是用 Gin 框架重写上面的示例,修改的代码如下所示:

    func main() {
    
       r:=gin.Default()
    
       r.GET("/users", listUser)
    
       r.Run(":1000")
    
    }
    
    func listUser(c *gin.Context)  {
    
       c.JSON(200,users)
    
    }

    相比 net/http 包,Gin 框架的代码非常简单,通过它的 GET 方法就可以创建一个只处理 HTTP GET 方法的服务,而且输出 JSON 格式的数据也非常简单,使用 c.JSON 方法即可。

    最后通过 Run 方法启动 HTTP 服务,监听在 1000 端口。现在运行这个 Gin 示例,在浏览器中输入http://localhost:1000/users,看到的信息和通过 net/http 包实现的效果是一样的。

    新增一个用户

    现在你已经可以使用 Gin 获取所有用户,还可以获取特定的用户,那么你也应该知道如何新增一个用户了,现在我通过 Gin 实现如何新增一个用户,看和你想的方案是否相似。

    根据 RESTful API 规范,实现新增使用的是 POST 方法,并且 URL 的格式为http://localhost:1000/users,向这个 URL 发送数据,就可以新增一个用户,然后返回创建的用户信息。

    现在我使用 Gin 框架实现新增一个用户,示例代码如下:

    func main() {
    
       //省略没有改动的代码
    
       r.POST("/users", createUser)
    
    }
    
    func createUser(c *gin.Context) {
    
       name := c.DefaultPostForm("name", "")
    
       if name != "" {
    
          u := User{ID: len(users) + 1, Name: name}
    
          users = append(users, u)
    
          c.JSON(http.StatusCreated,u)
    
       } else {
    
          c.JSON(http.StatusOK, gin.H{
    
             "message": "请输入用户名称",
    
          })
    
       }
    
    }
    
    

    以上新增用户的主要逻辑是获取客户端上传的 name 值,然后生成一个 User 用户,最后把它存储到 users 集合中,达到新增用户的目的。

    在这个示例中,使用 POST 方法来新增用户,所以只能通过 POST 方法才能新增用户成功。

    现在运行这个示例,然后通过如下命令发送一个新增用户的请求,查看结果:

    ➜ curl -X POST -d 'name=Ele' http://localhost:1000/users

    {"ID":4,"Name":"Ele"}

    可以看到新增用户成功,并且返回了新增的用户,还有分配的 ID。

    获取特定的用户

    现在你已经掌握了如何使用 Gin 框架创建一个简单的 RESTful API,并且可以返回所有的用户信息,那么如何获取特定用户的信息呢?

    下面我通过 Gin 框架 Path 路径参数来实现获得特定用户的信息功能,示例代码如下:

    func main() {
    
       //省略没有改动的代码
    
       r.GET("/users/:id", getUser)
    
    }
    
    func getUser(c *gin.Context) {
    
       id := c.Param("id")
    
       var user User
    
       found := false
    
       //类似于数据库的SQL查询
    
       for _, u := range users {
    
          if strings.EqualFold(id, strconv.Itoa(u.ID)) {
    
             user = u
    
             found = true
    
             break
    
          }
    
       }
    
       if found {
    
          c.JSON(200, user)
    
       } else {
    
          c.JSON(404, gin.H{
    
             "message": "用户不存在",
    
          })
    
       }
    
    }
    
    

    在 Gin 框架中,路径中使用冒号表示 Path 路径参数,比如示例中的 :id,然后在 getUser 函数中可以通过 c.Param("id") 获取需要查询用户的 ID 值。PS:Param 方法的参数要和 Path 路径参数中的一致,比如示例中都是 ID。

    现在运行这个示例,通过浏览器访问http://localhost:1000/users/4,就可以获得 ID 为 4 的用户,输出信息如下所示:

    {"ID":4,"Name":"Ele"}

    可以看到,已经正确的获取到了 ID 为 4 的用户,他的名字叫Ele。

    假如我们访问一个不存在的 ID,会得到什么结果呢?比如 99,示例如下所示:

    curl http://localhost:1000/users/99

    {"message":"用户不存在"}

    从以上示例输出可以看到,返回了『用户不存在』的信息,和我们代码中处理的逻辑一样。

    总结

    Go 语言已经给我们提供了比较强大的 SDK,让我们可以很容易地开发网络服务的应用,而借助第三方的 Web 框架,可以让这件事情更容易、更高效。比如这篇文章介绍的 Gin 框架,就可以很容易让我们开发出 RESTful API。在我们做项目开发的时候,要善于借助已经有的轮子,让自己的开发更有效率,也更容易实现。

    到此这篇关于基于Go语言构建RESTful API服务的文章就介绍到这了,更多相关Go语言构建RESTful API 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • Django开发RESTful API实现增删改查(入门级)
    • go 原生http web 服务跨域restful api的写法介绍
    • Django restful framework生成API文档过程详解
    • Django JWT Token RestfulAPI用户认证详解
    • Python利用Django如何写restful api接口详解
    • 详解Django rest_framework实现RESTful API
    • 详解Go语言RESTful JSON API创建
    上一篇:Golang 标准库 tips之waitgroup详解
    下一篇:Go语言应该什么情况使用指针
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    基于Go语言构建RESTful API服务 基于,语言,构建,RESTful,API,