0

0

如何使用Golang实现RESTful API_使用net/http和JSON解析构建接口

P粉602998670

P粉602998670

发布时间:2025-12-15 09:41:34

|

466人浏览过

|

来源于php中文网

原创

用Go标准库实现RESTful API的关键是:定义带json标签的导出结构体解析请求,用ServeMux结合路径截取模拟REST路由,封装writeJSON/writeError统一响应,最后通过http.ListenAndServe启动服务。

如何使用golang实现restful api_使用net/http和json解析构建接口

用 Go 的 net/http 和标准库 encoding/json 实现 RESTful API 并不复杂,关键在于合理组织路由、正确处理请求/响应、统一错误反馈,以及保持代码可读和可维护。

定义结构体并绑定 JSON 请求

Go 中解析 JSON 请求体最常用方式是通过结构体标签(json:)映射字段。注意导出字段(首字母大写)才能被 JSON 包访问。

例如用户注册接口需要接收 JSON:

type UserCreateRequest struct {
    Name  string `json:"name"`
    Email string `json:"email"`
    Age   int    `json:"age"`
}

在 handler 中解析:

立即学习go语言免费学习笔记(深入)”;

func createUser(w http.ResponseWriter, r *http.Request) {
    var req UserCreateRequest
    if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
        http.Error(w, "Invalid JSON", http.StatusBadRequest)
        return
    }
    // 处理业务逻辑,比如存入内存或数据库
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(map[string]string{"status": "created"})
}

用 ServeMux 或自定义路由实现 REST 风格

net/http.ServeMux 支持基础路径匹配,适合小型 API。RESTful 路由建议按资源设计,如 /users/users/{id}

  • GET /users → 列出所有用户
  • POST /users → 创建用户
  • GET /users/123 → 获取 ID 为 123 的用户
  • PUT /users/123 → 更新用户
  • DELETE /users/123 → 删除用户

由于 ServeMux 不支持路径参数(如 {id}),可用简单字符串截取或升级为轻量路由器(如 gorilla/mux)。但纯 net/http 也能应付:

SpeechEasy
SpeechEasy

SpeechEasy是一种合成语音解决方案,可以让用户从文本生成高质量、易于理解的音频。

下载
http.HandleFunc("/users/", func(w http.ResponseWriter, r *http.Request) {
    parts := strings.Split(r.URL.Path, "/")
    if len(parts) < 3 {
        http.Error(w, "Bad path", http.StatusBadRequest)
        return
    }
    id := parts[2]
    switch r.Method {
    case "GET":
        getUserByID(w, r, id)
    case "PUT":
        updateUserByID(w, r, id)
    case "DELETE":
        deleteUserByID(w, r, id)
    default:
        http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
    }
})

统一响应格式与错误处理

避免每个 handler 都手动设 header 和状态码。封装一个响应工具函数更清晰:

func writeJSON(w http.ResponseWriter, status int, v interface{}) {
    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(status)
    json.NewEncoder(w).Encode(v)
}

func writeError(w http.ResponseWriter, msg string, status int) {
    writeJSON(w, status, map[string]string{"error": msg})
}

使用示例:

if req.Name == "" {
    writeError(w, "name is required", http.StatusBadRequest)
    return
}

启动服务并监听端口

最后启动 HTTP 服务,建议加日志和基本 panic 恢复(生产环境推荐用 http.Server 配置超时等):

func main() {
    http.HandleFunc("/users", listUsers)
    http.HandleFunc("/users/", func(w http.ResponseWriter, r *http.Request) {
        // 如上路由分发逻辑
    })

    fmt.Println("Server starting on :8080")
    if err := http.ListenAndServe(":8080", nil); err != nil {
        log.Fatal(err)
    }
}

运行后即可用 curl 测试:

curl -X POST http://localhost:8080/users \
  -H "Content-Type: application/json" \
  -d '{"name":"Alice","email":"alice@example.com","age":30}'

基本上就这些。不用框架也能写出干净、符合 REST 原则的 API,重点是结构体映射准确、路由逻辑清晰、错误反馈及时——其余就是 Go 本身简洁有力的风格在起作用。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

180

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

228

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

341

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

209

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

393

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

199

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

191

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

273

2025.06.17

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

17

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.5万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号