PCo*_*lho 31 javascript cors angularjs
每当我制作一个webapp并且我遇到CORS问题时,我就开始煮咖啡了.拧紧它一段时间后,我设法让它工作,但这次不是,我需要帮助.
这是客户端代码:
$http({method: 'GET', url: 'http://localhost:3000/api/symbol/junk',
headers:{
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, X-Requested-With',
'X-Random-Shit':'123123123'
}})
.success(function(d){ console.log( "yay" ); })
.error(function(d){ console.log( "nope" ); });
Run Code Online (Sandbox Code Playgroud)
服务器端是带有快速应用程序的常规node.js.我有一个名为cors的扩展名,它以这种方式表达:
var app = express();
app.configure(function(){
app.use(express.bodyParser());
app.use(app.router);
app.use(cors({origin:"*"}));
});
app.listen(3000);
app.get('/', function(req, res){
res.end("ok");
});
Run Code Online (Sandbox Code Playgroud)
如果我做
curl -v -H "Origin: https://github.com" http://localhost:3000/
Run Code Online (Sandbox Code Playgroud)
它回来了:
* Adding handle: conn: 0x7ff991800000
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x7ff991800000) send_pipe: 1, recv_pipe: 0
* About to connect() to localhost port 3000 (#0)
* Trying ::1...
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 3000 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.30.0
> Host: localhost:3000
> Accept: */*
> Origin: https://github.com
>
< HTTP/1.1 200 OK
< X-Powered-By: Express
< Date: Tue, 24 Dec 2013 03:23:40 GMT
< Connection: keep-alive
< Transfer-Encoding: chunked
<
* Connection #0 to host localhost left intact
ok
Run Code Online (Sandbox Code Playgroud)
如果我运行客户端代码,它会出现此错误:
OPTIONS http://localhost:3000/api/symbol/junk No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8000' is therefore not allowed access. angular.js:7889
XMLHttpRequest cannot load http://localhost:3000/api/symbol/junk. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8000' is therefore not allowed access. localhost/:1
nope
Run Code Online (Sandbox Code Playgroud)
检查Chromes标题:
Request URL:http://localhost:3000/api/symbol/junk
Request Method:OPTIONS
Status Code:200 OK
Request Headersview source
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8,es;q=0.6,pt;q=0.4
Access-Control-Request-Headers:access-control-allow-origin, accept, access-control-allow-methods, access-control-allow-headers, x-random-shit
Access-Control-Request-Method:GET
Cache-Control:max-age=0
Connection:keep-alive
Host:localhost:3000
Origin:http://localhost:8000
Referer:http://localhost:8000/
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
Allow:GET
Connection:keep-alive
Content-Length:3
Content-Type:text/html; charset=utf-8
Date:Tue, 24 Dec 2013 03:27:45 GMT
X-Powered-By:Express
Run Code Online (Sandbox Code Playgroud)
检查请求标题我看到我的测试字符串X-Random-Shit出现在"Access-Control-Request-Headers"中,但它的值不存在.另外,在我脑海中,我期待看到我设置的每个标题都有一行,而不是blob.
更新 - -
我将我的前端改为jQuery而不是Angular,并将我的后端改为:
var app = express();
app.configure(function(){
app.use(express.bodyParser());
app.use(app.router);
});
app.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header('Access-Control-Allow-Methods', 'OPTIONS,GET,POST,PUT,DELETE');
res.header("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With");
if ('OPTIONS' == req.method){
return res.send(200);
}
next();
});
app.get('/', function(req, res){
res.end("ok");
});
Run Code Online (Sandbox Code Playgroud)
现在它适用于GET,但没有其他任何东西(PUT,POST ..).
我会看看你们中是否有人提出了解决方案.同时将RESTful概念抛出窗口并使用GET创建所有内容.
我是AngularJS的新手,我遇到了这个CORS问题,几乎让我失去理智!幸运的是我找到了解决这个问题的方法.所以这里......
我的问题是,当我使用AngularJS $资源发送API请求时,我收到此错误消息XMLHttpRequest cannot load http://website.com. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access.
Yup,我已经添加了callback ="JSON_CALLBACK",但它无效.
我做了什么来解决这个问题,而不是使用GET方法或诉诸于$ http.get,我使用了JSONP.只需用JSONP替换GET方法,并将api响应格式也更改为JSONP.
myApp.factory('myFactory', ['$resource', function($resource) {
return $resource( 'http://website.com/api/:apiMethod',
{ callback: "JSON_CALLBACK", format:'jsonp' },
{
method1: {
method: 'JSONP',
params: {
apiMethod: 'hello world'
}
},
method2: {
method: 'JSONP',
params: {
apiMethod: 'hey ho!'
}
}
} );
}]);
Run Code Online (Sandbox Code Playgroud)
我希望有人觉得这很有帮助.:)
我在表达和编辑res.header
. 我的与你的非常接近,但我有一个不同的,Allow-Headers
如下所示:
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
Run Code Online (Sandbox Code Playgroud)
我也在使用 Angular 和 Node/Express,但我没有在 Angular 代码中调用的标头,只有 Node/express
归档时间: |
|
查看次数: |
107733 次 |
最近记录: |