XMLHttpRequest 无法加载 <instagram OEMBED URL>。请求的资源上不存在“Access-Control-Allow-Origin”标头

Posted

技术标签:

【中文标题】XMLHttpRequest 无法加载 <instagram OEMBED URL>。请求的资源上不存在“Access-Control-Allow-Origin”标头【英文标题】:XMLHttpRequest cannot load <instagram OEMBED URL>. No 'Access-Control-Allow-Origin' header is present on the requested resource 【发布时间】:2014-11-13 21:51:16 【问题描述】:

我正在开发 OEMBED 应用程序,我想请求一些 OEMBED api 来获取我的 JSON 数据。我在后端使用 node/ express,在前端使用 angular。

这是我的服务器代码。

var express = require("express");
var app =express();
var allowCrossDomain = function(req, res, next) 
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');

    // intercept OPTIONS method
    if ('OPTIONS' == req.method) 
      res.send(200);
    
    else 
      next();
    
;
app.use(allowCrossDomain);
app.use(express.static(__dirname + '/js'));
app.get('/',function(req,res,next)
  res.sendfile('index.html');
);
app.listen(3000,function()
  console.log("We are listening at 3000");
);

和我的角码

app.controller('status_controller',function($scope,$http)
  $scope.add_status=function()
      $http.get("http://api.instagram.com/oembed?url=http://instagram.com/p/V8UMy0LjpX/&format=json").success(function(data)
            console.log(data);
          );
    ;
);

执行后,我在控制台中收到此错误。

XMLHttpRequest cannot load http://api.instagram.com/oembed?
url=http://instagram.com/p/V8UMy0LjpX/&format=json. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://<<localhost>>:3000' is therefore not allowed access. 

我已经尝试过诸如 cors 和 express-cors 之类的节点包,并且我还尝试了来自 SO 中类似帖子的建议,但没有任何帮助。

我知道我必须对 CORS 做一些事情,但不知道怎么做。

我正在使用 chrome 和 localhost 开发环境。

【问题讨论】:

CORS 帮助远程站点指定它是否允许您通过 javascript 访问其数据 - 因此在这种情况下,Instagram 必须实现此功能,以便您通过 AJAX 访问其数据。 您好,他们已经实现了这个。它在oembed.com 中提到,如果我在浏览器api.instagram.com/oembed?url=http://instagram.com/p/V8UMy0LjpX/… 中点击此网址,那么我会得到服务器返回的数据。 当您直接在浏览器中点击 URL 时,您当然会得到数据——因为那时它不是 JavaScript 发出的请求。 // 看来您应该指定一个回调函数来以 JSONP 格式请求数据。 我在我的角度代码中试过这个。 $http.jsonp("<a href="/default/index/tourl?u=aHR0cDovL2FwaS5pbnN0YWdyYW0uY29tL29lbWJlZD91cmw9aHR0cDovL2luc3RhZ3JhbS5jb20vcC9WOFVNeTBManBYLyZmb3JtYXQ9anNvbiUyMg%3D%3D" rel="nofollow" target="_blank">api.instagram.com/oembed?url=http://instagram.com/p/V8UMy0LjpX/…</a>).success(function(data, status, headers, config) alert("works"); ).error(function(data, status, headers, config) alert("not works"); ); 显示不工作!:( 我遇到了同样的问题。我建议这种解决方法***.com/a/25354788/2575875 【参考方案1】:

如果您使用 AngularJS

yourModule
  .config(function($httpProvider)
    $httpProvider.defaults.useXDomain = true;
    delete $httpProvider.defaults.headers.common['X-Requested-With'];
);

否则在更高版本中不需要这样做。服务器需要设置跨域的东西,即 instagram 之一(而不是您的本地服务器)

【讨论】:

我使用 $http.jsonp("api.instagram.com/oembed?url=http://instagram.com/p/V8UMy0LjpX/…).success(function(data, status, headers, config) alert("works"); ).error(function(data, status, headers, config) alert("not works"); ); 我从他们那里得到响应为 JSON 但不知道如何访问它,因为警报显示不工作消息。 这意味着你没有得到你想要的响应并且它正在失败

以上是关于XMLHttpRequest 无法加载 <instagram OEMBED URL>。请求的资源上不存在“Access-Control-Allow-Origin”标头的主要内容,如果未能解决你的问题,请参考以下文章

XMLHttpRequest 无法加载 [url] 预检响应具有无效的 HTTP 状态代码 405

xmlhttprequest 无法加载文件

XMLHttpRequest 无法加载。?

XMLHttpRequest 无法以角度加载

无法通过 xmlhttprequest 加载本地 xml 文件

XMLHttpRequest 无法加载资源