当前位置: 首页 > news >正文

Go语言网络编程:使用 net/http 构建 RESTful API

Go语言网络编程 - 使用 net/http 构建 RESTful API 的内容。本章节将带你使用标准库构建一个简单清晰、符合 REST 风格的 API 接口服务。

一、什么是 RESTful API

REST(Representational State Transfer)是一种风格,通常遵循以下规范:

动作方法描述
获取资源GET/users/users/1
创建资源POST/users
更新资源PUT/users/1
删除资源DELETE/users/1

二、准备数据结构和模拟数据库

package mainimport ("encoding/json""fmt""log""net/http""strconv""strings""sync"
)type User struct {ID   int    `json:"id"`Name string `json:"name"`
}var (users   = []User{}nextID  = 1userMux sync.Mutex
)

三、实现核心的 HTTP 路由处理函数

1. 获取所有用户(GET /users)
func getUsers(w http.ResponseWriter, r *http.Request) {w.Header().Set("Content-Type", "application/json")userMux.Lock()defer userMux.Unlock()json.NewEncoder(w).Encode(users)
}
2. 获取单个用户(GET /users/{id})
func getUser(w http.ResponseWriter, r *http.Request) {id := getIDFromPath(r.URL.Path)userMux.Lock()defer userMux.Unlock()for _, u := range users {if u.ID == id {json.NewEncoder(w).Encode(u)return}}http.NotFound(w, r)
}
3. 创建用户(POST /users)
func createUser(w http.ResponseWriter, r *http.Request) {var u Userif err := json.NewDecoder(r.Body).Decode(&u); err != nil {http.Error(w, "Invalid JSON", http.StatusBadRequest)return}userMux.Lock()u.ID = nextIDnextID++users = append(users, u)userMux.Unlock()w.WriteHeader(http.StatusCreated)json.NewEncoder(w).Encode(u)
}
4. 更新用户(PUT /users/{id})
func updateUser(w http.ResponseWriter, r *http.Request) {id := getIDFromPath(r.URL.Path)var update Userif err := json.NewDecoder(r.Body).Decode(&update); err != nil {http.Error(w, "Invalid JSON", http.StatusBadRequest)return}userMux.Lock()defer userMux.Unlock()for i, u := range users {if u.ID == id {users[i].Name = update.Namejson.NewEncoder(w).Encode(users[i])return}}http.NotFound(w, r)
}
5. 删除用户(DELETE /users/{id})
func deleteUser(w http.ResponseWriter, r *http.Request) {id := getIDFromPath(r.URL.Path)userMux.Lock()defer userMux.Unlock()for i, u := range users {if u.ID == id {users = append(users[:i], users[i+1:]...)w.WriteHeader(http.StatusNoContent)return}}http.NotFound(w, r)
}

四、辅助函数:路径中提取 ID

func getIDFromPath(path string) int {parts := strings.Split(path, "/")idStr := parts[len(parts)-1]id, _ := strconv.Atoi(idStr)return id
}

五、设置路由器并启动服务

func main() {http.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) {switch r.Method {case http.MethodGet:getUsers(w, r)case http.MethodPost:createUser(w, r)default:http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed)}})http.HandleFunc("/users/", func(w http.ResponseWriter, r *http.Request) {switch r.Method {case http.MethodGet:getUser(w, r)case http.MethodPut:updateUser(w, r)case http.MethodDelete:deleteUser(w, r)default:http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed)}})fmt.Println("Listening on :8080...")log.Fatal(http.ListenAndServe(":8080", nil))
}

六、测试示例(使用 curl 或 Postman)

# 创建用户
curl -X POST -d '{"name":"Alice"}' http://localhost:8080/users -H "Content-Type: application/json"# 获取所有用户
curl http://localhost:8080/users# 获取单个用户
curl http://localhost:8080/users/1# 更新用户
curl -X PUT -d '{"name":"Bob"}' http://localhost:8080/users/1 -H "Content-Type: application/json"# 删除用户
curl -X DELETE http://localhost:8080/users/1

七、小结

本章展示了如何使用 Go 的标准库构建一套完整的 RESTful API 服务,包括:

  • • 路由分发
  • • JSON 编解码
  • • 方法区分(GET/POST/PUT/DELETE)
  • • 并发安全的数据结构管理
  • • 简单的路径参数解析

如需更复杂的功能(如认证、中间件、自动路由注册),可引入第三方库如 GinEchoChi 等。


http://www.lryc.cn/news/573218.html

相关文章:

  • React JSX语法
  • 分布式锁的四种实现方式:从原理到实践
  • 【Linux仓库】进程概念与基本操作【进程·贰】
  • 使用 Telegraf 向 TDengine 写入数据
  • HarmonyOS 5的分布式通信矩阵是如何工作的?
  • Flink流水线+Gravitino+Paimon集成
  • 5.2 Qt Creator 使用FFmpeg库
  • ffmpeg(六):图片与视频互转命令
  • 项目练习:Jaspersoft Studio制作PDF报表时,detail和column footer之间存在很大的空白区
  • VR油库虚拟仿真系统:开启智慧油库新时代
  • 广州华锐互动:以技术创新引领虚拟现实体验新高度
  • 蚂蚁百宝箱快速创建智能体AI小程序
  • 【Node】最佳Node.js后端开发模板推荐
  • win环境使用openssl创建p12证书
  • 18年磨一剑!开利科技启动数字化增量投资新时代
  • 软件工程概述:核心概念、模型与方法全解析
  • (详细介绍)线性代数中的零空间(Null Space)
  • Java、PHP、C++ 三种语言实现爬虫的核心技术对比与示例
  • Mac电脑-触摸板增强工具-BetterTouchTool
  • Sublime text启用vim
  • Science Advances:皮肤附着触觉贴片,实现多功能和增强的触觉交互
  • 【Docker基础】Docker镜像管理:docker pull详解
  • Cursor汉化
  • Tesla T4 安装 Audio2face
  • 大模型在急性弥漫性腹膜炎预测及治疗方案制定中的应用研究
  • 一站式了解责任链模式
  • Taro 跨端应用性能优化全攻略:从原理到实践
  • 抖音的视频怎么下载下来——下载狗解析工具
  • 【StarRocks系列】StarRocks vs Mysql
  • 【StarRocks系列】join查询优化