我已经创建了旅行服务器.它工作得很好,我们可以通过Inslenia发出POST个请求,但是当我们在前端通过AXIOS发出POST个请求时,它会发送一个错误:

已被CORS策略阻止:对印前判断请求的响应未通过访问控制判断:它没有HTTP OK状态.

我们对AXIOS的要求:

let config = {
headers: {
  "Content-Type": "application/json",
  'Access-Control-Allow-Origin': '*',
  }
}

let data = {
  "id": 4
 }

 axios.post('http://196.121.147.69:9777/twirp/route.FRoute/GetLists', data, config)
   .then((res) => {
      console.log(res)
     })
    .catch((err) => {
      console.log(err)
   });
} 

我的围棋档案:

func setupResponse(w *http.ResponseWriter, req *http.Request) {
    (*w).Header().Set("Access-Control-Allow-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")
}


func WithUserAgent(base http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

    ctx := r.Context()
    ua := r.Header.Get("Jwt")
    ctx = context.WithValue(ctx, "jwt", ua)

    r = r.WithContext(ctx)

    setupResponse(&w, r)
     base.ServeHTTP(w, r)
  })
}

const (
    host     = "localhost"
    port     = 5432
    user     = "postgres"
    password = "postgres"
    dbname   = "postgres"
)

func main() {

    psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+
           "password=%s dbname=%s sslmode=disable",
               host, port, user, password, dbname)

    server := &s.Server{psqlInfo}

    twirpHandler := p.NewFinanceServiceServer(server, nil)

    wrap := WithUserAgent(twirpHandler)
      log.Fatalln(http.ListenAndServe(":9707", wrap))
}

正如我之前在失眠中说过的那样,它工作得很好,但是当我们发出axios POST请求时,在浏览器的控制台上会出现以下内容:

已被CORS策略阻止:对印前判断请求的响应未通过访问控制判断:它没有HTTP OK状态.

推荐答案

我相信这是最简单的例子:

header := w.Header()
header.Add("Access-Control-Allow-Origin", "*")
header.Add("Access-Control-Allow-Methods", "DELETE, POST, GET, OPTIONS")
header.Add("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With")

您还可以为Access-Control-Max-Age添加一个标头,当然,您可以允许任何您想要的标头和方法.

最后,您需要响应初始请求:

if r.Method == "OPTIONS" {
    w.WriteHeader(http.StatusOK)
    return
}

编辑(2019年6月):我们现在使用gorilla.他们的东西得到了更积极的维护,而且他们已经这样做了很长一段时间.把链接留到旧的,以防万一.

Old Middleware Recommendation below: 当然,只使用中间件可能更容易做到这一点.我想我还没有用过,但是this one个似乎是强烈推荐的.

Go相关问答推荐

运行add. inf,这样我们就可以在app.conf中使用. inf参数了?

如何使用GRPC UnaryClientInterceptor中的`maily`参数?

使用Digitorus/pdfsign在GO(Golang)中签署pdf文件

将DATE类型的SQL字段扫描到GO struct 字段

如何在链接中写入链接

如何解析Go-Gin多部分请求中的 struct 切片

我可以在Golang中的另一个类型参数的基础上约束一个类型的参数吗?

我怎样才能改进这个嵌套逻辑以使其正常工作并提高性能

在 go 中,将接收器 struct 从值更改为指针是否向后兼容?

如何在正则表达式中使整个单词可选?

如何解决构建Docker Compose时的权限被拒绝问题

如何将验证器标记添加到嵌套字段

如何使用名称具有包名称的嵌套 struct 启动 go struct

Golang模板无法访问embedFS中的文件

函数超时和 goroutine 泄漏

在 Raspberry Pi4 上下载 Go Mod

如何在 Golang 中使用具有相同名称或特定关键字的行或列重新排列/排序 CSV

如何在Golang中的差异函数中杀死命令Exec

在 connect-go 拦截器中修改响应体

如何使用 context.WithCancel 启动和停止每个会话的心跳?