Golang作为高性能的后端开发语言,其标准库已经提供了完善的HTTP服务支持,不需要依赖第三方框架就能快速实现JSON API接口。下面我们通过完整的示例来演示具体的实现过程。

基础环境准备
实现JSON API只需要Go语言的基础环境,不需要额外安装第三方依赖。我们首先创建一个简单的项目目录,初始化Go模块即可:
# 创建项目目录 mkdir go-json-api cd go-json-api # 初始化模块 go mod init go-json-api
实现基础HTTP服务
使用net/http标准库可以快速启动一个HTTP服务,我们先实现一个返回固定JSON数据的接口作为示例。
定义响应结构体
Go语言中通过结构体标签来定义JSON序列化后的字段名,我们可以定义一个通用的响应结构体:
package main
import (
"encoding/json"
"net/http"
)
// 通用响应结构体
type Response struct {
Code int `json:"code"` // 状态码
Message string `json:"message"` // 提示信息
Data interface{} `json:"data"` // 响应数据
}
实现第一个JSON接口
接下来编写一个处理GET请求的函数,返回JSON格式的响应数据:
// 处理获取用户列表的请求
func getUserList(w http.ResponseWriter, r *http.Request) {
// 只允许GET请求
if r.Method != http.MethodGet {
http.Error(w, "只支持GET请求", http.StatusMethodNotAllowed)
return
}
// 构造响应数据
userList := []map[string]interface{}{
{"id": 1, "name": "张三", "age": 25},
{"id": 2, "name": "李四", "age": 28},
}
resp := Response{
Code: 0,
Message: "请求成功",
Data: userList,
}
// 设置响应头为JSON格式
w.Header().Set("Content-Type", "application/json; charset=utf-8")
// 序列化响应数据并返回
json.NewEncoder(w).Encode(resp)
}
注册路由并启动服务
在main函数中注册路由,启动HTTP服务:
func main() {
// 注册路由
http.HandleFunc("/api/users", getUserList)
// 启动服务,监听8080端口
println("服务启动成功,监听端口: 8080")
err := http.ListenAndServe(":8080", nil)
if err != nil {
println("服务启动失败:", err.Error())
}
}
解析请求参数
实际开发中接口往往需要接收请求参数,下面演示如何解析URL查询参数和POST请求的JSON参数。
解析URL查询参数
对于GET请求,参数通常放在URL的查询字符串中,可以通过r.URL.Query()获取:
// 处理带查询参数的用户查询请求
func getUserById(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
http.Error(w, "只支持GET请求", http.StatusMethodNotAllowed)
return
}
// 获取查询参数id
id := r.URL.Query().Get("id")
if id == "" {
resp := Response{
Code: -1,
Message: "缺少id参数",
Data: nil,
}
w.Header().Set("Content-Type", "application/json; charset=utf-8")
json.NewEncoder(w).Encode(resp)
return
}
// 模拟查询数据
resp := Response{
Code: 0,
Message: "请求成功",
Data: map[string]interface{}{"id": id, "name": "测试用户", "age": 30},
}
w.Header().Set("Content-Type", "application/json; charset=utf-8")
json.NewEncoder(w).Encode(resp)
}
解析POST请求的JSON参数
对于POST请求,参数通常放在请求体中,需要读取请求体并反序列化JSON数据:
// 定义接收POST参数的结构体
type CreateUserRequest struct {
Name string `json:"name"`
Age int `json:"age"`
}
// 处理创建用户的POST请求
func createUser(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "只支持POST请求", http.StatusMethodNotAllowed)
return
}
// 解析请求体中的JSON数据
var req CreateUserRequest
err := json.NewDecoder(r.Body).Decode(&req)
if err != nil {
resp := Response{
Code: -1,
Message: "参数解析失败",
Data: nil,
}
w.Header().Set("Content-Type", "application/json; charset=utf-8")
json.NewEncoder(w).Encode(resp)
return
}
// 模拟创建用户逻辑
resp := Response{
Code: 0,
Message: "用户创建成功",
Data: map[string]interface{}{"id": 3, "name": req.Name, "age": req.Age},
}
w.Header().Set("Content-Type", "application/json; charset=utf-8")
json.NewEncoder(w).Encode(resp)
}
完整路由注册与测试
我们把所有接口注册到路由中,然后测试接口是否正常可用:
func main() {
// 注册所有路由
http.HandleFunc("/api/users", getUserList)
http.HandleFunc("/api/user", getUserById)
http.HandleFunc("/api/user/create", createUser)
// 启动服务
println("服务启动成功,监听端口: 8080")
println("可用接口:")
println("GET /api/users 获取用户列表")
println("GET /api/user?id=1 获取指定用户")
println("POST /api/user/create 创建用户")
err := http.ListenAndServe(":8080", nil)
if err != nil {
println("服务启动失败:", err.Error())
}
}
启动服务后,可以使用curl或者postman测试接口:
- 测试获取用户列表:curl http://127.0.0.1:8080/api/users
- 测试获取指定用户:curl http://127.0.0.1:8080/api/user?id=1
- 测试创建用户:curl -X POST -H "Content-Type: application/json" -d '{"name":"王五","age":22}' http://127.0.0.1:8080/api/user/create
接口设计注意事项
在实际的JSON API设计中,还需要注意以下几点:
- 统一响应格式,所有接口都返回相同结构的响应数据,方便前端处理
- 合理设计HTTP状态码,成功请求返回200,参数错误返回400,服务端错误返回500等
- 对请求参数做好校验,避免无效数据进入业务逻辑
- 如果需要处理跨域请求,可以添加对应的响应头,允许指定的域名访问接口