c.Data(...)
是 Gin 框架提供的方法,用于通过 *gin.Context
对象发送响应。需要手动设置响应头(如 Content-Type)
w.Write(...)
是标准 Go 的 http.ResponseWriter
的方法,通常用于在不使用框架的情况下直接写响应,使用 w.Write(...)
时,您需要手动设置响应头(如 Content-Type)。
例子:
1.
w.Write(resp.JSONBytes())
未在 AJAX 请求中设置 dataType: "json"或 未
设置 Content-Type 格式,前端 AJAX 请求可能不会自动将响应视为 JSON 格式解析。
因此前端需要需要手动解析响应var resp = JSON.parse(body);
success: function (body) {
var resp = JSON.parse(body);//手动解析body
if (resp.code !== 0) {
alert(resp.msg); // 显示后端返回的错误信息
return;
}
localStorage.setItem("token",resp.data.Token);
localStorage.setItem("username", resp.data.Username);
window.location.href =resp.data.Location;
}
2.
c.Data(http.StatusOK, "application/json", resp.JSONBytes())
resp.JSONBytes()
返回的是一个JSON字节切片,Gin 将该字节切片作为响应体发送,同时将 Content-Type 设置为 application/json
在 AJAX 请求中设置 dataType: "json"或者在c.Data中将
Content-Type 设置为 application/json
时,jQuery会自动将响应解析为 JSON 对象。而不是一个 JSON 字符串
因此前端您可以直接在成功回调中使用该对象,而不需要调用 JSON.parse()
。
success: function (body) {
localStorage.setItem("token", body.data.Token);
localStorage.setItem("username", body.data.Username);
window.location.href = body.data.Location;
}
总结:
JSON 字符串一般用于传输和存储数据,然后可以在客户端或服务器端解析成对象
JSON 对象是 JavaScript 中的对象,表示一种可以直接访问和操作的键值对集合
在传输数据时,通常会先将 JSON 对象转化为 JSON 字符串,如后端将响应返回给前端时
--------------------------------------------------------------------------------------------------------------------
后端w.Write()和c.Data()中的resp.JSONBytes()是只负责将数据内容转为 JSON 格式(生成 JSON 字符串),但还是需要在在函数中设置Content-Type 或者在前端AJAX 请求中设置 dataType: "json",
来告诉前端要解析的
数据的格式是JSON,此时前端就会自动以JSON解析响应内容(将JSON字符串转换为JSON对象)。
否则前端AJAX会默认将后端发送过来的响应解释为 text/html
或 text/plain, 因此就需要在前端添加JSON.parse(body)来手动以JSON格式解析响应,将body中的内容解析为JSON对象。
一、如果以上1.2在调用w.Write和c.Data中没有设置Content-Type 则前端需要动解析响应
var resp = JSON.parse(body);//手动解析body
二、如果1.2都在调用w.Write和c.Data中设置了Content-Type则jQuery会自动将响应解析为 JSON 对象,前端不需要手动解析响应,
success: function (body) {
localStorage.setItem("token", body.data.Token);
localStorage.setItem("username", body.data.Username);
window.location.href = body.data.Location;
}
三、如果在前端的AJAX请求中设置了dataType: "json"则即使
没有设置Content-Type也无需JSONBytes()解析响应。
$.ajax({
url: "/user/signin",
type: "POST",
data: {
"username": username.value,
"password": password.value
},
dataType:"json"
error: function (err) {
alert(err);
},
success: function (body) {
var resp = JSON.parse(body);
localStorage.setItem("token", body.data.Token)
localStorage.setItem("username", body.data.Username)
}
});
错误:如果设置了Content-Type又在前端中使用JSON.parse对响应进行解析,因为回调中由于设置了设置了Content-Type因此在前端中已经是一个 JSON对象了,则会导致试图将一个JSON对象传递给 JSON.parse,而JSON.parse正是将
将 JSON 字符串转成 JSON 对象的,因此
会导致接收到 "[object Object]"
字符串 报错,在浏览器f12控制台可以看到,这会导致响应不能被正确解析