我的Angular应用程序向对其他域开放的API发出请求。
在POST
请求没有 data
字段时,请求成功完成。因此,$http.post(url).then();
有效。但是,$http.post(url, data).then() or $http.post(url, null).then();
没有。请求也可以使用jQuery和Postman(我正在使用的REST客户端)完成。
抛出的错误是:对预检请求的响应未通过访问控制检查:请求的资源上没有“Access-Control-Allow-Origin”标头。因此,不允许原点“http://localhost”访问。响应的HTTP状态代码为403。
设置自定义标题(与SO上的大多数答案一样)不成功。使用{headers: {}}
或修改$httpProvider.defaults
传递配置对象时,Chrome检查器中的标题没有变化。
启用CORS plugin后问题仍然存在,这意味着这与API无关。
我错过了什么?
答案 0 :(得分:0)
使用restws / Drupal我的角度应用程序遇到了类似的问题。
打开网络控制台并检查标题..应该发现您的请求已被"预检"选项请求 现在在现代浏览器中,在跨域请求中,将首先在PUT之前触发OPTIONS请求。 https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Overview
我的猜测是API未配置为接受选项请求。
我不得不用一点点黑客修补restws以识别OPTIONS对象并返回接受PUT
答案 1 :(得分:0)
刚刚意识到..
1)您是否将CORS设置为通配符(或#34;镜像"使用CORS模块 - )? 我认为OPTIONS请求需要特定的域引用。 我不得不将我的CORS标题更改为Allow-access-control-origin> mydomain.com&不*
2)另外,你是否无头? 我发现使用restw - 我必须实际登录我的drupalk网站&然后对会话/令牌执行api请求以获取令牌,传递我的身份验证凭据。 如果最初没有登录,我会拒绝403访问。
答案 2 :(得分:0)
也许可能是cors配置的错误。
如果您的问题是使用tomcat服务器,则必须使用以下代码在web.xml文件中配置cors过滤器:
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
<init-param>
<param-name>cors.allowed.headers</param-name>
<param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.origins</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.methods</param-name>
<param-value>GET,POST,HEAD,OPTIONS,PUT,DELETE</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
我希望能帮到你!!