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 等。


 

相关文章
|
4月前
|
Cloud Native 算法 区块链
站在巨人的肩膀上:gRPC通过HTTP/2构建云原生时代的通信标准
gRPC是云原生时代高效通信标准,基于HTTP/2实现,支持四种服务方法。通过.proto文件定义接口,生成多语言Stub,实现跨语言调用。其请求响应结构清晰,结合Headers、Data帧与Trailers,保障高性能与可扩展性,广泛应用于微服务架构中。
224 0
|
4月前
|
存储 网络协议 算法
从HPACK到多路复用,揭秘HTTP/2如何终结网络拥堵
HTTP/2通过HPACK压缩头部冗余信息,提升传输效率;并利用多路复用技术,在单个TCP连接上并行处理多个请求,避免队头阻塞,显著提升性能。同时支持服务器推送和流优先级设置,优化资源加载体验。
264 7
|
7月前
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
402 61
|
6月前
|
监控 安全 Go
使用Go语言构建网络IP层安全防护
在Go语言中构建网络IP层安全防护是一项需求明确的任务,考虑到高性能、并发和跨平台的优势,Go是构建此类安全系统的合适选择。通过紧密遵循上述步骤并结合最佳实践,可以构建一个强大的网络防护系统,以保障数字环境的安全完整。
150 12
|
7月前
|
运维 网络协议 Go
Go网络编程:基于TCP的网络服务端与客户端
本文介绍了使用 Go 语言的 `net` 包开发 TCP 网络服务的基础与进阶内容。首先简述了 TCP 协议的基本概念和通信流程,接着详细讲解了服务端与客户端的开发步骤,并提供了简单回显服务的示例代码。同时,文章探讨了服务端并发处理连接的方法,以及粘包/拆包、异常检测、超时控制等进阶技巧。最后通过群聊服务端的实战案例巩固知识点,并总结了 TCP 在高可靠性场景中的优势及 Go 并发模型带来的便利性。
|
8月前
|
安全 网络协议 Linux
Linux网络应用层协议展示:HTTP与HTTPS
此外,必须注意,从HTTP迁移到HTTPS是一项重要且必要的任务,因为这不仅关乎用户信息的安全,也有利于你的网站评级和粉丝的信心。在网络世界中,信息的安全就是一切,选择HTTPS,让您的网站更加安全,使您的用户满意,也使您感到满意。
235 18
|
Go API Python
Go 装饰器模式在 API 服务程序中的使用
Golang 开发 API server   Go 语言是由谷歌主导并开源的编程语言,和 C 语言有不少相似之处,都强调执行效率,语言结构尽量简单,也都主要用来解决相对偏底层的问题。
1641 0
|
3月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
240 1
|
5月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
325 1
|
5月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
418 0