首页 文章

访问控制允许使用Safari而不是Chrome接受的Angular $资源调用

提问于
浏览
1

我现在已经有点困惑了一段时间,因为我是角色和网络开发的新手,我不知道在哪里看 .

我已经构建了一个简单的服务,使用Angular中的$ resource服务调用RESTapi,该RESTapi被设置为接受Cross Origin调用:

angular.module('vinifyApp')
.factory('WinesVinibar',function($resource){
return $resource('http://devinify1.herokuapp.com/wines/');    
})
.controller('GetWinesVinibarCtrl', function($scope, WinesVinibar){
$scope.WINES = WinesVinibar.query();
}

我已经在本地和heroku上测试了这项服务,它适用于Chrome和Firefox . 以下是Chrome的请求和响应:

Request
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Connection:keep-alive
Host:devinify1.herokuapp.com
Origin:http://mobilevinify.herokuapp.com
Referer:http://mobilevinify.herokuapp.com/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML,     like Gecko) Chrome/31.0.1650.63 Safari/537.36
Response Headersview source
Access-Control-Allow-Origin:*
Allow:GET, POST, HEAD, OPTIONS
Connection:keep-alive
Content-Type:application/json
Date:Mon, 09 Dec 2013 16:16:36 GMT
Server:gunicorn/18.0
transfer-encoding:chunked
Vary:Accept, Cookie

但是,请求失败,Safari出现以下错误:

[Error] Failed to load resource: Request header field Accept-Encoding is not allowed by     Access-Control-Allow-Headers. (wines, line 0)

以下是请求和响应标头:

Request
Access-Control-Request-Method   GET
User-Agent  Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9) AppleWebKit/537.71 (KHTML,     like Gecko) Version/7.0 Safari/537.71
Access-Control-Request-Headers  accept-language, origin, accept-encoding

Response
Access-Control-Max-Age  86400
Access-Control-Allow-Methods    GET, POST, PUT, PATCH, DELETE, OPTIONS
Content-Type    text/html; charset=utf-8
Access-Control-Allow-Origin *
Connection  keep-alive
Access-Control-Allow-Headers    x-requested-with, content-type, accept, origin, authorization, x-csrftoken
Content-Length  0

编码似乎存在问题,但我不知道要解决这个问题 . 谢谢你的时间 !

1 回答

  • 4

    您似乎错过了CORS_ALLOW_HEADERS设置中的一些参数:

    Request:
    Access-Control-Request-Headers  accept-language, origin, accept-encoding
    
    Response:
    Access-Control-Allow-Headers    x-requested-with, content-type, accept, origin, authorization, x-csrftoken
    

    尝试在settings.py中为标头添加accept-language和accept-encoding

    CORS_ALLOW_HEADERS = (
    'x-requested-with',
    'content-type',
    'accept',
    'origin',
    'authorization',
    'x-csrftoken',
    'accept-encoding',
    'accept-language'
    

相关问题