天天看點

後端開發總結(1):前後端資料傳輸

前後端資料傳輸

      • 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