新闻中心
Golang如何处理JSON HTTP请求与响应_Golang JSON HTTP请求响应实践详解
Go语言通过encoding/json和net/http包处理JSON请求与响应,需定义带标签的结构体映射JSON字段,使用json.NewDecoder解析请求体并校验Content-Type,利用json.NewEncoder编码响应数据并设置正确Header,完整示例包含POST创建用户及返回JSON结果,注意方法、媒体类型检查与错误处理。

在Go语言开发中,处理JSON格式的HTTP请求与响应是构建现代Web服务的基础能力。Golang标准库提供了encoding/json和net/http包,配合使用可以高效地完成序列化、反序列化以及网络通信。本文将通过实际示例讲解如何正确处理JSON请求与响应。
定义结构体映射JSON数据
要处理JSON数据,第一步是定义与JSON字段对应的Go结构体。使用结构体标签(struct tags)来指定JSON字段名,确保字段可导出(首字母大写)以便json包能正确读取。
例如,假设客户端发送用户注册信息:
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email"`
}
这里的json:"name"告诉json.Unmarshal将JSON中的name字段映射到结构体的Name字段。如果字段为空或不匹配,解析会忽略该字段而不报错。
解析JSON请求体(Unmarshal)
在HTTP处理器中,从*http.Request读取请求体并解析为结构体对象。需要检查内容类型、读取Body并进行反序列化。
func createUser(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "content type must be application/json", http.StatusUnsupportedMediaType)
return
}
var user User
decoder := json.NewDecoder(r.Body)
defer r.Body.Close()
if err := decoder.Decode(&user); err != nil {
http.Error(w, "invalid JSON", http.StatusBadRequest)
return
}
// 处理逻辑:保存用户等
fmt.Printf("Received user: %+v\n", user)
}
关键点:
Pinokio
Pinokio是一款开源的AI浏览器,可以安装运行各种AI模型和应用
232
查看详情
-
json.NewDecoder直接从r.Body流式读取,适合大体积数据且性能较好。 - 记得调用
defer r.Body.Close()释放资源。 - 对解析错误返回
400 Bad Request,内容类型错误返回415 Unsupported Media Type。
返回JSON响应(Marshal)
向客户端返回JSON数据时,使用json.Marshal将结构体编码为JSON字节流,并设置正确的响应头。
func getUser(w http.ResponseWriter, r *http.Request) {
user := User{ID: 1, Name: "Alice", Email: "alice@example.com"}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
if err := json.NewEncoder(w).Encode(user); err != nil {
http.Error(w, "failed to encode response", http.StatusInternalServerError)
return
}
}
说明:
-
w.Header().Set("Content-Type", "application/json")告知客户端返回的是JSON数据。 -
json.NewEncoder(w).Encode直接写入响应流,避免中间内存分配,效率更高。 - 若编码失败(如包含不可序列化字段),应返回
500 Internal Server Error。
完整HTTP服务示例
将上述部分整合成一个简单服务:
package main
import (
"encoding/json"
"log"
"net/http"
)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email"`
}
func createUser(w http.ResponseWriter, r *http.Request) {
if r.Method != "POST" {
http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
return
}
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "content type must be application/json", http.StatusUnsupportedMediaType)
return
}
var user User
decoder := json.NewDecoder(r.Body)
defer r.Body.Close()
if err := decoder.Decode(&user); err != nil {
http.Error(w, "invalid JSON", http.StatusBadRequest)
return
}
// 模拟创建成功,返回带ID的结果
user.ID = 123
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusCreated)
json.NewEncoder(w).Encode(user)
}
func main() {
http.HandleFunc("/users", createUser)
log.Println("Server starting on :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
运行后可通过curl测试:
curl -X POST http://localhost:8080/users \
-H "Content-Type: application/json" \
-d '{"name":"Bob","email":"bob@example.com"}'
基本上就这些。掌握结构体标签、请求体解析、响应编码和错误处理,就能在Golang中稳健地处理JSON HTTP通信。不复杂但容易忽略细节,比如Content-Type校验和资源释放。
以上就是Golang如何处理JSON HTTP请求与响应_Golang JSON HTTP请求响应实践详解的详细内容,更多请关注其它相关文章!
# 郑州快速网站排名优化
# 如何使用
# 如何实现
# 复用
# 的是
# 如何在
# 能在
# 推广套餐营销方案模板范文
# 和龙网站优化排名
# 客户端
# seo的概念和特点
# 建材网站seo优化案例
# 网站企业店铺优化方案
# 盘锦网站优化电话
# 青岛网络推广论坛网站
# 品牌营销推广岗位怎么样
# 做美甲网站免费推广
# golang
# 如何处理
# 序列化
# 标准库
# 用户注册
# ai
# curl
# usb
# 字节
# app
# 编码
# go语言
# 处理器
# go
# js
# json
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Win11怎么开启高性能模式_Windows 11电源计划优化设置
优化Log4j2控制台输出性能:解决异步日志瓶颈
php源码怎么看淘宝客系统_看php源码淘宝客系统技巧
苹果手机如何防止被恶意App追踪
2306选座时如何选靠窗位置_12306选座靠窗座位查看方法解析
离线运行Go语言之旅:本地部署与GOPATH配置指南
使用CSS更改登录屏幕输入框中PNG图标颜色的策略与局限性
优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题
写好的html代码怎么运行出来_运行写好的html代码方法【教程】
妖精动漫免费平台 妖精动漫官网资源观看网址
Golang如何使用net/url解析URL_Golang URL解析与处理方法
c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解
想当下一个《2077》?《心之眼》Steam评价升至"多半好评"
Python多版本共存与虚拟环境管理深度指南
狙击外星人小游戏开始_狙击外星人小游戏立即开始
win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】
12306选座系统怎么选连座_12306选座多人连坐操作方法
支付宝如何设置安全保护_支付宝安全设置的全面教程
知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法
Composer如何处理Git子模块(submodule)依赖_Composer与Git Submodule的对比与选择
vivo手机参数配置怎么增强信号_vivo手机参数配置信号增强方法
LINUX怎么设置定时任务_LINUX crontab配置教程
C++如何生成随机数_C++ random库使用方法与范围设置
J*a 递归快速排序中静态变量的状态管理与陷阱
一加Ace 6T实拍样张首次公布!李杰:主摄实力完全看齐4K档性能旗舰
J*aScript设计模式实践_j*ascript代码优化
C++ map遍历方法大全_C++ map迭代器使用总结
mysql密码锁定怎么解锁_mysql密码锁定解锁后修改密码步骤
服务端验证_j*ascript输入检查
QQ邮箱官方邮箱登录入口 QQ邮箱网页版快速访问
漫蛙网页登录入口 漫蛙漫画官方授权网址
树莓派传感器触发:通过Twilio API发送WhatsApp消息教程
快手极速版在线观看 官方网页版登录地址
漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口
excel如何生成目录 excel一键生成工作表目录超链接
Shopware订单对象中获取产品自定义字段的正确方法
响应式图片在网页设计中的正确实现方法
Go语言中动态执行代码字符串的策略与实践
可靠CSGO开箱平台解析 CSGO开箱网合集
深入理解J*a合成构造器:何时以及为何阻止其生成
b站怎么取消点赞_b站点赞取消操作方法
将HTML Canvas内容转换为可上传的图像文件(File对象)
BetterDiscord插件中安全更新用户简介的实践指南
ACG动漫手机版官网入口 手机ACG动漫APP在线观看正版
顺丰快递查单号物流信息 顺丰快递小程序查询入口
如何在J*a中实现统一对象行为接口_项目大型化时的接口规范化
Lar*el Excel导入时生成自定义递增ID的策略与实践
百度网盘网页版入口 百度网盘网页版官方登录网址
Promise错误处理:在catch后终止链式then执行的策略
解决 MongoDB 聚合查询中对象数组 _id 匹配问题


2025-10-29
浏览次数:次
返回列表
p包处理JSON请求与响应,需定义带标签的结构体映射JSON字段,使用json.NewDecoder解析请求体并校验Content-Type,利用json.NewEncoder编码响应数据并设置正确Header,完整示例包含POST创建用户及返回JSON结果,注意方法、媒体类型检查与错误处理。