Go语言:RESTful API 服务,急速入门!

简介: REST即表述性状态传递(英文:Representational State Transfer,简称REST),它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性

RESTful API

EST即表述性状态传递(英文:Representational State Transfer,简称REST),它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。(引用自百度百科)。

HTTP Method

  1. 早在 HTTP 0.9 版本中,只有一个GET方法,该方法是一个幂等方法,用于获取服务器上的资源;
  2. HTTP 1.0 版本中又增加了HEAD和POST方法,其中常用的是 POST 方法,一般用于给服务端提交一个资源。
  3. HTTP1.1 版本的时,又增加了几个方法。总共加起来有9个。
    它们的作用:
  • GET 方法可请求一个指定资源的表示形式,使用 GET 的请求应该只被用于获取数据。
  • HEAD 方法用于请求一个与 GET 请求的响应相同的响应,但没有响应体。
  • POST 方法用于将实体提交到指定的资源,通常导致服务器上的状态变化或副作用。
  • PUT 方法用于请求有效载荷替换目标资源的所有当前表示。
  • DELETE 方法用于删除指定的资源。
  • CONNECT 方法用于建立一个到由目标资源标识的服务器的隧道。
  • OPTIONS 方法用于描述目标资源的通信选项。
  • TRACE 方法用于沿着到目标资源的路径执行一个消息环回测试。
  • PATCH 方法用于对资源应用部分修改。

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

  • GET,表示读取服务器上的资源;
  • POST,表示在服务器上创建资源;
  • PUT,表示更新或者替换服务器上的资源;
  • DELETE,表示删除服务器上的资源;
  • PATCH,表示更新 / 修改资源的一部分。

一个简单的 RESTful API

Golang 提供了内置的 net/http 包,用来处理这些 HTTP 请求,可以比较方便地开发一个 HTTP 服务。

示例:

package main
import (
  "fmt"
  "net/http"
)
func main() {
  http.HandleFunc("/users",handleUsers)
  http.ListenAndServe(":8080", 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:8080/users, 就可以看到如下内容信息:

ID:1,Name:张三
ID:2,Name:李四
ID:3,Name:王五
复制代码

示例中,不光可以用 GET 能进行访问,POST、PUT等也可以,接下来对示例进行改进,使它使它符合 RESTful API 的规范:

package main
import (
  "fmt"
  "net/http"
)
func main() {
  http.HandleFunc("/users",handleUsers)
  http.ListenAndServe(":8080", nil)
}
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。

RESTful JSON API

在项目接口中,数据大多数情况下会使用 json 格式来传输,再次对示例进行改造,使它返回 json 格式的内容:

package main
import (
  "encoding/json"
  "fmt"
  "net/http"
)
func main() {
  http.HandleFunc("/users",handleUsers)
  http.ListenAndServe(":8080", nil)
}
//数据源,模拟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
}
复制代码

运行结果:

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

这次,我们新建了一个 User 结构体,使用 users 这个切片存储所有的用户,然后在 handleUsers 函数中把它转化为一个 JSON 数组返回。

Gin 框架

上面我们使用的是 Go 语言自带的  net/http 包,写法比较简单,但是它也有许多不足之处:

  • 不能单独地对请求方法(POST、GET 等)注册特定的处理函数;
  • 不支持 Path 变量参数;
  • 不能自动对 Path 进行校准;
  • 性能一般,扩展性不足;
  • ……

基于以上的不足,我们可以使用其它的 Golang Web 框架,例如今天要介绍的 Gin 框架。

引入 Gin 框架

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

Gin 框架其实是一个模块,采用 Go Mod 的方法引入即可:

  1. 下载安装 Gin 框架go get -u github.com/gin-gonic/gin
  2. 在 Go 语言代码中导入使用import "github.com/gin-gonic/gin"

使用 Gin 框架

我们使用 Gin 框架来重写上面的示例:

package main
import "github.com/gin-gonic/gin"
func main() {
  r := gin.Default()
  r.GET("/users", listUser)
  r.Run(":8080")
}
func listUser(c *gin.Context) {
  c.JSON(200, users)
}
//数据源,模拟MySQL中的数据
var users = []User{
  {ID: 1, Name: "张三"},
  {ID: 2, Name: "李四"},
  {ID: 3, Name: "王五"},
}
//用户
type User struct {
  ID   int
  Name string
}
复制代码

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

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

获取一个用户

获取一个用户的信息,我们使用 GET 方法,设计的 URL 格式为 :

http://localhost:8080/users/1

url中的数字1为用户id,我们通过id来获取一个指定的用户:

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,然后通过 c.Param("id") 获取需要查询用户的 ID 值。

运行示例,访问地址 http://localhost:8080/users/1 ,便可以获取 ID 为1 的用户:{"ID":1,"Name":"张三"}

新增一个用户

新增一个用户的 URL 格式为:

http://localhost:8080/users

向这个 URL 发送数据,就可以新增一个用户.

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 集合中。

我们使用 curl 命令发送一个新增用户请求:

curl -X POST -d 'name=无尘' http://localhost:8080/users
{"ID":4,"Name":"无尘"}
复制代码

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


相关文章
|
4月前
|
JSON 安全 Java
API 一键转换 MCP 服务!Higress 助今日投资快速上线 MCP 市场
今日投资的技术负责人介绍了如何通过Higress MCP 市场完善的解决方案,快捷地将丰富的金融数据 API 转化为 MCP 工具,帮助用户通过 MCP 的方式非常轻松地调用专业金融数据,自由快速地构建自己的金融大模型应用。
643 23
|
1月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟蒋星熠Jaxonic,Go语言探索者。深耕云计算、微服务与并发编程,以代码为笔,在二进制星河中书写极客诗篇。分享Go核心原理、性能优化与实战架构,助力开发者掌握云原生时代利器。#Go语言 #并发编程 #性能优化
344 43
Go语言深度解析:从入门到精通的完整指南
|
2月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟 蒋星熠Jaxonic,执着的星际旅人,用Go语言编写代码诗篇。🚀 Go语言以简洁、高效、并发为核心,助力云计算与微服务革新。📚 本文详解Go语法、并发模型、性能优化与实战案例,助你掌握现代编程精髓。🌌 从goroutine到channel,从内存优化到高并发架构,全面解析Go的强大力量。🔧 实战构建高性能Web服务,展现Go在云原生时代的无限可能。✨ 附技术对比、最佳实践与生态全景,带你踏上Go语言的星辰征途。#Go语言 #并发编程 #云原生 #性能优化
|
5月前
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
319 61
|
3月前
|
人工智能 算法 API
国产化用于单导联和六导联的心电算法及API服务
随着智能设备普及,心电图功能逐渐应用于智能手表、体脂仪等设备。苏州唯理推出单导联及6导联心电算法API服务,由AI驱动,1分钟内快速评估心律失常、房颤、早搏等问题,已广泛用于医疗设备及三甲医院。其算法还可评估压力、疲劳、情绪状态,筛查效率远超进口设备。唯理率先实现国产医疗级心电芯片,支持快速集成与私有化部署,适用于多种智能硬件。
|
5月前
|
开发框架 安全 前端开发
Go Web开发框架实践:模板渲染与静态资源服务
Gin 是一个功能强大的 Go Web 框架,不仅适用于构建 API 服务,还支持 HTML 模板渲染和静态资源托管。它可以帮助开发者快速搭建中小型网站,并提供灵活的模板语法、自定义函数、静态文件映射等功能,同时兼容 Go 的 html/template 引擎,具备高效且安全的页面渲染能力。
|
5月前
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
|
5月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:使用 Gin 快速构建 Web 服务
Gin 是一个高效、轻量级的 Go 语言 Web 框架,支持中间件机制,非常适合开发 RESTful API。本文从安装到进阶技巧全面解析 Gin 的使用:快速入门示例(Hello Gin)、定义 RESTful 用户服务(增删改查接口实现),以及推荐实践如参数校验、中间件和路由分组等。通过对比标准库 `net/http`,Gin 提供更简洁灵活的开发体验。此外,还推荐了 GORM、Viper、Zap 等配合使用的工具库,助力高效开发。
|
5月前
|
人工智能 自然语言处理 API
硅基流动入驻阿里云云市场,核心API服务将全面接入阿里云百炼平台💐
2025年6月18日,AI Infra企业硅基流动与阿里云达成战略合作,加入“繁花计划”并入驻云市场。其大模型推理平台SiliconCloud核心API将接入阿里云百炼平台,依托灵骏智能计算集群为客户提供高效服务。作为国内领先的MaaS平台,SiliconCloud已集成百余款开源大模型,服务600万用户及众多企业。双方将在算力协同、行业解决方案等领域深化合作,推动AI生态发展。
681 0
【Go语言入门100题】026 I Love GPLT (5 分) Go语言 | Golang
L1-026 I Love GPLT (5 分) Go语言|Golang 这道超级简单的题目没有任何输入。 你只需要把这句很重要的话 —— “I Love GPLT”——竖着输出就可以了。 所谓“竖着输出”,是指每个字符占一行(包括空格),即每行只能有1个字符和回车。
698 0

热门文章

最新文章