gin框架的c.Data(...) 方法和GO的w.Write(...)的注意事项

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/htmltext/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控制台可以看到,这会导致响应不能被正确解析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值