• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    go 原生http web 服务跨域restful api的写法介绍

    错误写法

    func main() {
        openHttpListen()
    }
    func openHttpListen() {
        http.HandleFunc("/", receiveClientRequest)
        fmt.Println("go server start running...")
        err := http.ListenAndServe(":9090", nil)
        if err != nil {
            log.Fatal("ListenAndServe: ", err)
        }
    }
    func receiveClientRequest(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Access-Control-Allow-Origin", "*")             //允许访问所有域
        w.Header().Add("Access-Control-Allow-Headers", "Content-Type") //header的类型
        w.Header().Set("content-type", "application/json")             //返回数据格式是json
        r.ParseForm()
        fmt.Println("收到客户端请求: ", r.Form)
    

    这样还是会报错:

    说没有得到响应跨域的头,chrome的network中确实没有响应Access-Control-Allow-Origin

    正确写法:

    func LDNS(w http.ResponseWriter, req *http.Request) {
        if origin := req.Header.Get("Origin"); origin != "" {
            w.Header().Set("Access-Control-Allow-Origin", origin)
            w.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
            w.Header().Set("Access-Control-Allow-Headers",
                "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
        }
        if req.Method == "OPTIONS" {
            return
        }
        // 响应http code
        w.WriteHeader(200)
        query := strings.Split(req.Host, ".")
        value, err := ldns.RAMDBMgr.Get(query[0])
        fmt.Println("Access-Control-Allow-Origin", "*")
        if err != nil {
            io.WriteString(w, `{"message": ""}`)
            return
        }
        io.WriteString(w, value)
    }
    

    补充:go http允许跨域

    1.创建中间件

    import (
     "github.com/gin-gonic/gin"
     "net/http"
    )
    // 跨域中间件
    func Cors() gin.HandlerFunc {
     return func(c *gin.Context) {
      method := c.Request.Method
      origin := c.Request.Header.Get("Origin")
      if origin != "" {
       c.Header("Access-Control-Allow-Origin", origin)
       c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, UPDATE")
       c.Header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization")
       c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Cache-Control, Content-Language, Content-Type")
       c.Header("Access-Control-Allow-Credentials", "false")
       c.Set("content-type", "application/json")
      }
      if method == "OPTIONS" {
       c.AbortWithStatus(http.StatusNoContent)
      }
      c.Next()
     }
    }

    2.在route中引用中间件

    router := gin.Default()
    // 要在路由组之前全局使用「跨域中间件」, 否则OPTIONS会返回404
    router.Use(Cors())

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

    您可能感兴趣的文章:
    • Django开发RESTful API实现增删改查(入门级)
    • Django restful framework生成API文档过程详解
    • Django JWT Token RestfulAPI用户认证详解
    • Python利用Django如何写restful api接口详解
    • 详解Django rest_framework实现RESTful API
    • 详解Go语言RESTful JSON API创建
    • 基于Go语言构建RESTful API服务
    上一篇:解决Golang中ResponseWriter的一个坑
    下一篇:Go语言二维数组的传参方式
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    go 原生http web 服务跨域restful api的写法介绍 原生,http,web,服务,跨域,