您好我正在实施 rest api,为此我想允许提供跨源请求。
我目前在做什么:
AWS 上的 Go-server 代码:
func (c *UserController) Login(w http.ResponseWriter, r *http.Request, ctx *rack.Context) {
w.Header().Set("Access-Control-Allow-Origin", r.Header.Get("Origin"))
w.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
...
...
c.render.Json(w,rsp, http.StatusOK)
return
}
本地主机上的 Ajax 代码:
<script>
$( document ).ready(function() {
console.log( "ready!" );
$.ajax({
url: 'http://ip:8080/login',
crossDomain: true, //set as a cross domain requests
withCredentials:false,
type: 'post',
success: function (data) {
alert("Data " + data);
},
});
});
我在浏览器控制台上收到以下错误: XMLHttpRequest cannot load http://ip:8080/login 。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许访问源“ http://localhost:8081 ”。响应具有 HTTP 状态代码 422。
我尝试添加预检选项:
func corsRoute(app *app.App) {
allowedHeaders := "Accept, Content-Type, Content-Length, Accept-Encoding, Authorization,X-CSRF-Token"
f := func(w http.ResponseWriter, r *http.Request) {
if origin := r.Header.Get("Origin"); origin != "" {
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", allowedHeaders)
w.Header().Set("Access-Control-Expose-Headers", "Authorization")
}
return
}
app.Router.Options("/*p", f, publicRouteConstraint)
}
但它不起作用。
可以做些什么来修复它。
原文由 Yash Srivastava 发布,翻译遵循 CC BY-SA 4.0 许可协议
我使用
gorilla/mux
包构建 Go RESTful API 服务器,客户端使用 JavaScript 请求可以工作,我的 Go 服务器运行在
localhost:9091
,服务器代码:我发现给
OPTIONS
这里很重要,否则会发生错误:在允许
OPTIONS
之后效果很好。我从 这篇文章 中得到了这个想法。此外, MDN CORS 文档 提到:
以下是 api GetPeopleAPI 方法,注意方法中我给出注释 //Allow CORS here By * or specific origin ,我有另一个类似的答案解释 CORS 的概念在 这里:
在客户端,我在
localhost:9092
上使用 html 和 javascript,javascript 将从localhost:9092
向服务器发送请求并且请求可以成功得到响应
"OKOK"
。您还可以通过
Fiddler
等工具检查响应/请求标头信息。