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

简介: 本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。

 

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 main import (  "encoding/json"  "fmt"  "log"  "net/http"  "strconv"  "strings"  "sync" ) type User struct {  ID int `json:"id"`  Name string `json:"name"` } var (  users = []User{}  nextID = 1  userMux 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 User  if err := json.NewDecoder(r.Body).Decode(&u); err != nil {  http.Error(w, "Invalid JSON", http.StatusBadRequest)  return  }  userMux.Lock()  u.ID = nextID  nextID++  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 User  if 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.Name  json.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 等。


 

相关文章
|
5月前
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
312 61
|
3月前
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。
|
6月前
|
Go
在golang中发起http请求以获取访问域名的ip地址实例(使用net, httptrace库)
这只是追踪我们的行程的简单方法,不过希望你跟着探险家的脚步,即使是在互联网的隧道中,也可以找到你想去的地方。接下来就是你的探险之旅了,祝你好运!
290 26
|
7月前
|
中间件 Go
Golang | Gin:net/http与Gin启动web服务的简单比较
总的来说,`net/http`和 `Gin`都是优秀的库,它们各有优缺点。你应该根据你的需求和经验来选择最适合你的工具。希望这个比较可以帮助你做出决策。
301 35
|
7月前
|
存储 网络协议 API
Cpp网络编程Winsock API
本文详细介绍了使用Winsock API进行C++网络编程的过程,通过具体实例实现了一个基于TCP协议的C/S架构通信demo。文章从服务端与客户端两方面展开,涵盖网络库初始化、套接字创建、绑定IP与端口、监听与连接、数据收发到关闭连接等关键步骤。重点解析了`WSAStartup`、`socket`、`bind`、`listen`、`accept`、`connect`、`send`和`recv`等函数的使用方法及注意事项,并对比了标准库与Winsock库在链接时的区别。适合初学者了解Winsock网络编程基础。
309 35
|
11月前
|
JSON 数据格式
.net HTTP请求类封装
`HttpRequestHelper` 是一个用于简化 HTTP 请求的辅助类,支持发送 GET 和 POST 请求。它使用 `HttpClient` 发起请求,并通过 `Newtonsoft.Json` 处理 JSON 数据。示例展示了如何使用该类发送请求并处理响应。注意事项包括:简单的错误处理、需安装 `Newtonsoft.Json` 依赖,以及建议重用 `HttpClient` 实例以优化性能。
277 2
|
11月前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
252 17
|
11月前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
217 10
|
11月前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。
|
11月前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
在数字化时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的内容,并提供一些实用的代码示例。通过阅读本文,您将了解到如何保护自己的网络安全,以及如何提高自己的信息安全意识。
224 10

热门文章

最新文章

下一篇