
本文详解在 jquery ajax 请求中设置 content-type: application/json 请求头的方法,并说明其对 go 后端解析的影响,强调 contenttype 与 headers 的区别及常见误区。
本文详解在 jquery ajax 请求中设置 content-type: application/json 请求头的方法,并说明其对 go 后端解析的影响,强调 contenttype 与 headers 的区别及常见误区。
在前端通过 jQuery 发起 AJAX 请求并与 Go 语言编写的后端服务通信时,正确设置请求头(尤其是 Content-Type)是确保数据被后端准确解析的关键前提。许多开发者误以为仅在 headers 对象中添加自定义字段(如 "listkey": {...})就足以让服务器以 JSON 方式处理请求体,但事实并非如此。
✅ 正确做法:显式声明 contentType
jQuery 的 $.ajax() 提供了专用的 contentType 选项,用于指定 HTTP 请求体的 MIME 类型。若你希望将 JavaScript 对象作为 JSON 字符串发送(即请求体为 {"key1":"val1","key2":"val2"}),必须设置:
contentType: 'application/json'
该配置会自动触发两个关键行为:
- 将请求头 Content-Type 设置为 application/json;
- 自动调用 JSON.stringify() 序列化 data 参数(若存在)。
⚠️ 注意:你原示例中未提供 data 字段,但若需发送 JSON 数据,应配合使用:
$.ajax({
url: '/api/submit',
type: 'POST',
contentType: 'application/json', // ← 必须声明
data: JSON.stringify({ // ← 手动或由 jQuery 自动序列化
key1: "val1",
key2: "val2",
key3: "val3"
}),
headers: {
"X-List-Key": '{"key1":"val1","key2":"val2","key3":"val3"}' // 自定义 header 值必须是字符串
},
dataType: 'json',
cache: false,
success: function(data) {
console.log('Success:', data);
}
});? 关于自定义 Header(如 listkey)的重要说明
你在问题中使用的 headers: { "listkey": {...} } 存在严重问题:
❌ HTTP 头部值必须是字符串,不能是对象。浏览器会直接报错或静默忽略该 header。
✅ 正确方式是手动序列化为 JSON 字符串,并建议使用语义清晰的命名(避免小写开头或保留字冲突):
headers: {
"X-List-Key": JSON.stringify({ key1: "val1", key2: "val2", key3: "val3" })
}Go 后端可据此安全解析:
// Go 示例(使用 net/http)
func handler(w http.ResponseWriter, r *http.Request) {
listKeyHeader := r.Header.Get("X-List-Key")
var listKey map[string]string
if err := json.Unmarshal([]byte(listKeyHeader), &listKey); err != nil {
http.Error(w, "Invalid X-List-Key header", http.StatusBadRequest)
return
}
// 使用 listKey...
}? 总结要点
- contentType: 'application/json' 是告知服务器“请求体是 JSON”的必要且标准方式,不可省略;
- headers 中所有值必须为字符串,对象需先 JSON.stringify();
- 不要混淆 contentType(描述请求体格式)与自定义 header(传递元数据);
- Go 后端需主动读取并解析自定义 JSON header,不会自动绑定;
- 开发时建议使用浏览器 DevTools 的 Network 面板验证实际发出的请求头与请求体内容。
遵循以上规范,即可实现 jQuery 前端与 Go 后端之间稳定、可预测的 JSON 数据交互。










