四时宝库

程序员的知识宝库

GO语言(十二):使用 Go 和 Gin 开发 RESTful API(上)

本教程介绍了使用 Go 和Gin Web 框架(Gin) 编写 RESTful Web 服务 API 的基础知识。

Gin 简化了许多与构建 Web 应用程序(包括 Web 服务)相关的编码任务。在本教程中,您将使用 Gin 来路由请求、检索请求详细信息以及编组 JSON 以获取响应。

在本教程中,您将构建一个具有两个端点的 RESTful API 服务器。您的示例项目将是有关老式爵士乐唱片的数据存储库。


先决条件

  • Go 1.16 或更高版本的安装。有关安装说明,请参阅 安装 Go。
  • 用于编辑代码的工具。您拥有的任何文本编辑器都可以正常工作。
  • 一个命令终端。Go 在 Linux 和 Mac 上的任何终端以及 Windows 中的 PowerShell 或 cmd 上都能很好地工作。
  • curl工具。在 Linux 和 Mac 上,这应该已经安装了。在 Windows 上,它包含在 Windows 10 Insider build 17063 及更高版本中。对于早期的 Windows 版本,您可能需要安装它。


设计 API 端点

您将构建一个 API,该 API 可让您访问出售老式黑胶唱片的商店。因此,您需要提供端点,客户端可以通过这些端点为用户获取和添加相册。

在开发 API 时,您通常从设计端点开始。如果端点易于理解,您的 API 用户将获得更大的成功。

以下是您将在本教程中创建的端点。

/专辑

  • GET– 获取所有专辑的列表,以 JSON 形式返回。
  • POST– 从作为 JSON 发送的请求数据中添加新专辑。


/专辑/:id

  • GET– 通过 ID 获取专辑,将专辑数据作为 JSON 返回。



为您的代码创建一个文件夹

首先,为您要编写的代码创建一个项目。

1、打开命令提示符并切换到您的主目录。

在 Linux 或 Mac 上:

$ cd

在 Windows 上:

C:\> cd %HOMEPATH%


2、使用命令提示符,为您的代码创建一个名为 web-service-gin 的目录。

$ mkdir web-service-gin
$ cd web-service-gin


3、创建一个模块,您可以在其中管理依赖项。

运行go mod init命令,给它你的代码所在的模块的路径。

$ go mod init example/web-service-gin
go: creating new go.mod: module example/web-service-gin

此命令创建一个 go.mod 文件,您添加的依赖项将在其中列出以供跟踪。


创建数据

为了使教程简单,您将数据存储在内存中。更典型的 API 将与数据库交互。

请注意,将数据存储在内存中意味着每次停止服务器时,相册集都会丢失,然后在启动时重新创建。


1、编写代码

使用您的文本编辑器,在 web-service 目录中创建一个名为 main.go 的文件。您将在此文件中编写您的 Go 代码。

进入 main.go,在文件顶部,粘贴以下包声明。

package main

独立程序(与库相反)始终位于 package 中main。

在包声明下,粘贴以下 album结构声明。您将使用它在内存中存储专辑数据。

// album represents data about a record album.
type album struct {
    ID     string  `json:"id"`
    Title  string  `json:"title"`
    Artist string  `json:"artist"`
    Price  float64 `json:"price"`
}

在您刚刚添加的结构声明下,粘贴以下 album结构片段,其中包含您将用于启动的数据。

// albums slice to seed record album data.
var albums = []album{
    {ID: "1", Title: "Blue Train", Artist: "John Coltrane", Price: 56.99},
    {ID: "2", Title: "Jeru", Artist: "Gerry Mulligan", Price: 17.99},
    {ID: "3", Title: "Sarah Vaughan and Clifford Brown", Artist: "Sarah Vaughan", Price: 39.99},
}


编写一个处理程序以返回所有项目

当客户端在发出GET /albums请求时,您希望将所有专辑以 JSON 格式返回。

为此,您将编写以下内容:

  • 准备响应的逻辑
  • 将请求路径映射到您的逻辑的代码

请注意,这与它们在运行时的执行方式相反,但您首先添加依赖项,然后是依赖于它们的代码。


1、编写代码

(a)在上一节中添加的结构代码下方,粘贴以下代码以获取专辑列表。

// getAlbums responds with the list of all albums as JSON.
func getAlbums(c *gin.Context) {
    c.IndentedJSON(http.StatusOK, albums)
}

在此代码中:

1)编写一个getAlbums带 gin.Context 参数的函数。请注意,你可以给这个函数起任何名字——Gin 和 Go 都不需要特定的函数名格式。

gin.Context是Gin最重要的部分。它携带请求详细信息、验证和序列化 JSON 等。(尽管名称相似,但这与 Go 的内置 context包不同。)

2)调用Context.IndentedJSON 以将结构序列化为 JSON 并将其添加到响应中。

该函数的第一个参数是您要发送给客户端的 HTTP 状态代码。在这里,您 从net/http包中传递StatusOK常量来指示200 OK.

请注意,您可以替换Context.IndentedJSON为发送更紧凑的 Context.JSON的调用 。在实践中,缩进形式在调试时更容易使用,并且大小差异通常很小。


(b)在 main.go 顶部附近,就在albumsslice 声明的下方,粘贴下面的代码以将处理函数分配给端点路径。

这会建立一个关联,在该关联中getAlbums处理对 /albums端点路径的请求。

func main() {
    router := gin.Default()
    router.GET("/albums", getAlbums)

    router.Run("localhost:8080")
}

在此代码中:

1)使用Default初始化 Gin 路由器 。

2)使用GET 函数将GET HTTP 方法和/albums路径与处理函数相关联。

请注意,您正在传递函数的名称。getAlbums这与传递函数的结果不同,您可以通过传递来完成getAlbums()(注意括号)。

3)使用Run 功能将路由器连接到http.Server并启动服务器。


(c)在 main.go 顶部附近,就在包声明的下方,导入您需要支持您刚刚编写的代码的包。

第一行代码应如下所示:

package main

import (
    "net/http"

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


(d)保存 main.go。


2、运行代码

a.开始跟踪 Gin 模块作为依赖项。

在命令行中,使用go get 将 github.com/gin-gonic/gin 模块添加为您的模块的依赖项。使用点参数表示“获取当前目录中代码的依赖项”。

$ go get .
go get: added github.com/gin-gonic/gin v1.7.2

解决并下载此依赖项以满足import 您在上一步中添加的声明。


b.从包含 main.go 的目录中的命令行,运行代码。使用点参数表示“在当前目录中运行代码”。

$ go run .

代码运行后,您就有了一个正在运行的 HTTP 服务器,您可以向其发送请求。


c.在新的命令行窗口中,用于curl向正在运行的 Web 服务发出请求。

$ curl http://localhost:8080/albums


该命令应显示您为服务准备的数据。

[
        {
                "id": "1",
                "title": "Blue Train",
                "artist": "John Coltrane",
                "price": 56.99
        },
        {
                "id": "2",
                "title": "Jeru",
                "artist": "Gerry Mulligan",
                "price": 17.99
        },
        {
                "id": "3",
                "title": "Sarah Vaughan and Clifford Brown",
                "artist": "Sarah Vaughan",
                "price": 39.99
        }
]


你已经启动了一个 API!在下一部分中,您将使用代码创建另一个端点来处理POST添加项目的请求。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接