前後端資料傳輸
-
-
- 1 後端——>前端
-
- 1.1 Json Marshal
- 1.2 前後端互動的json輸出規則
- 1.3 使用示例
- 2 前端——>後端
-
Json(Javascript object Nantation)
是一種資料交換格式,常用于前後端資料傳輸。任意一端将資料轉換成
json
字元串,另一端再将該字元串解析成相應的資料結構,如
string,strcut
對象等。在實際項目中,編碼成json串的資料結構,往往是切片類型
文章參考 : https://blog.csdn.net/zxy_666/article/details/80173288
go對json格式的轉化:https://go.dev/blog/json
1 後端——>前端
go語言本身為我們提供了json的工具包
”encoding/json”
。參考:https://studyglang.com/articles/6742
1.1 Json Marshal
state := &entity.AddStateoptions{
DeviceName: "d11",
Lngitude: 100.076690123,
Latitude: 10.023512345,
Altitude: 4000.023512345,
Temperature: 30.123,
Intensity: 1000.023,
}
bytes, err := json.Marshal(state) // 将struct轉化成byte格式
//[]byte類型,轉化成string類型便于檢視
fmt.Println(string(bytes))
1.2 前後端互動的json輸出規則
我們需要統一對外輸出
json
資訊
{
"code": 5000,
"message": "message",
"data":""
}
後端需要利用web架構,如gin,在controller層向前端輸出Json格式的傳回結果
// gin.H就是一個map用以簡化生成 json 的方式
// c.JSON(狀态碼,message)
c.JSON(http.StatusOK, gin.H{
"code": 0,
"message": "正常",
"dataset": gin.H{
"name": "測試接口"
},
})
code
、
message
大多數時候是預設值,隻有在特定接口傳回特定資訊,可以對接口進行封裝
package httprsp
// gin響應錯誤消息體封裝
type GinErrorRsp struct {
Code int64 `json:"code"`
Msg string `json:"msg"`
}
const (
BadRequest int64 = 4000
UnauthorizedRequest int64 = 4001
InternalServerError int64 = 5000
)
var (
// Ok OK
Ok GinErrorRsp = GinErrorRsp{2000, "ok"}
// Unauthorized 未授權請求
Unauthorized GinErrorRsp = GinErrorRsp{4001, "unauthorized request"}
// Forbidden 請求拒絕
Forbidden GinErrorRsp = GinErrorRsp{4003, "forbidden"}
)
func NewRequestParamsErrorRsp() GinErrorRsp {
return GinErrorRsp{
BadRequest, "request params error",
}
}
1.3 使用示例
func InfoTask(c *gin.Context) {
// 接收前端傳遞參數
var req task.InfoTaskReq
// 将參數與結構體進行綁定
if err := c.ShouldBind(&req); err != nil {
log.Error(err.Error())
// 綁定錯誤,直接傳回
c.JSON(http.StatusBadRequest, httprsp.ParamsErrorRsp())
return
}
res, err := 調用service層的邏輯得到傳回
// 如果後端傳回參數與前端不一緻,需要dto進一步加工
dto := assembler.ToTaskInfoDTO(params)
if err != nil {
c.JSON(http.StatusBadRequest, httprsp.NewBadRequestRsp(err.Error()))
return
}
// 執行正常,将結果從後端傳遞給前端)
c.JSON(http.StatusOK, common.NewCommonHttpRsp(dto))
}
2 前端——>後端
前端傳回了結果回來,需要将結果進行解析,一則通過assembler轉化成對應的結構體,另一則通過直接提取出需要的資訊
// 對應接收通用資料的結構
type ResponseBody struct {
Code int `json:"code"` // 傳回code 2000成功
Msg string `json:"msg"` // 傳回提示
Data interface{} `json:"data"` // 傳回資料
}
func (resp ResponseBody) IsOk() bool {
return resp.Code == 2000
}
轉化的具體操作
response,err = 前端傳回資料
if err := json.Unmarshal(response.Body(), &responseBody); err != nil {
return err
}
// Unmarshal 解析 JSON 編碼的資料并将結果存儲在 v 指向的值中。
// 如果 v 為 nil 或不是指針,則 Unmarshal 傳回 InvalidUnmarshalError