前端请求
异步请求
前端可以使用try+await代替promise+then,实现串流编码的异步处理。
Axios 和 Ajax
axios和ajax的区别: axios是通过Promise实现对ajax技术的一种封装,就像jquery对ajax的封装一样,简单来说就是ajax技术实现了局部数据的刷新,axios实现了对ajax的封装,axios有的ajax都有,ajax有的axios不一定有,总结一句话就是axios是ajax,ajax不止axios。
Axois 发送 POST 请求前会发送 OPTIONS 请求进行预检。
- form-data、x-www-form-urlencoded:不可以用@RequestBody;可以用@RequestParam。
- application/json:json字符串部分可以用@RequestBody;url中的?后面参数可以用@RequestParam。
跨域
// 跨域中间件
func CorsMiddleware() gin.HandlerFunc {
return func(gctx *gin.Context) {
method := gctx.Request.Method
origin := gctx.Request.Header.Get("Origin") //请求头部
if origin != "" {
// 接收客户端发送的origin
gctx.Writer.Header().Set("Access-Control-Allow-Origin", origin)
// 服务器支持的所有跨域请求的方法
gctx.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, UPDATE")
// 允许跨域设置可以返回其他子段,可以自定义字段
gctx.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, Content-Type, X-CSRF-Token, Token, session")
// 允许浏览器(客户端)可以解析的头部
gctx.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers")
// 设置缓存时间
gctx.Header("Access-Control-Max-Age", "172800")
// 允许客户端传递校验信息比如 cookie
gctx.Header("Access-Control-Allow-Credentials", "true")
}
// 允许类型校验,不经过网关,放行所有 OPTIONS 请求
if method == "OPTIONS" {
gctx.JSON(http.StatusOK, "ok!")
gctx.Abort()
return
}
gctx.Next()
}
}
后端处理
axios 请求为 RequestBody, ajax 请求为 PostForm。
var err error
var reqDataJsonMap map[string]string
var reqDataJsonString string
err = gctx.BindJSON(&reqDataJsonMap) // 解析 axios json: data, _ := ioutil.ReadAll(gctx.Request.Body)
if err != nil || util.IsNil(reqDataJsonMap["data"]) {
reqDataJsonString = gctx.PostForm("data") // 解析 ajax x-www-form-urlencoded
} else {
reqDataJsonString = reqDataJsonMap["data"]
}