【发布时间】:2017-01-23 05:47:19
【问题描述】:
您好,我正在实施 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 无法加载 http://ip:8080/login。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,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)
}
但它不起作用。
可以做些什么来解决它。
【问题讨论】:
-
您在路由器中处理预检 OPTIONS 请求吗?
-
不.. 需要吗?
-
是的。看看这篇文章:stackoverflow.com/questions/22972066/…
-
422 是
Unprocessable Entity ,The request was well-formed but was unable to be followed due to semantic errors.可能在这个方向找到?
标签: ajax go cors cross-domain