Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用AngularJS$http服务和Coinbase API检查MIME类型时出错_Javascript_Json_Angularjs_Api_Mime Types - Fatal编程技术网

Javascript 使用AngularJS$http服务和Coinbase API检查MIME类型时出错

Javascript 使用AngularJS$http服务和Coinbase API检查MIME类型时出错,javascript,json,angularjs,api,mime-types,Javascript,Json,Angularjs,Api,Mime Types,我正在使用AngularJS创建一个简单的应用程序,它使用 该应用程序在Chrome、Safari、Firefox和Opera中正常工作,但在Chrome Canary和IE中,我收到以下错误: 拒绝从执行脚本 '' 因为它的MIME类型('application/json')不可执行,并且 已启用严格的MIME类型检查。 我熟悉AngularJS,我使用$http服务构建了其他访问供应商API的应用程序,我没有遇到过这个问题 下面的代码应该通过Coinbase API获取即期汇率,将数据作为$

我正在使用AngularJS创建一个简单的应用程序,它使用

该应用程序在Chrome、Safari、Firefox和Opera中正常工作,但在Chrome Canary和IE中,我收到以下错误:

拒绝从执行脚本 '' 因为它的MIME类型('application/json')不可执行,并且 已启用严格的MIME类型检查。

我熟悉AngularJS,我使用$http服务构建了其他访问供应商API的应用程序,我没有遇到过这个问题

下面的代码应该通过Coinbase API获取即期汇率,将数据作为$http服务回调的一部分传递给作用域,并通过每60秒进行一次后续调用来刷新存储在作用域中的值

angular.module('CoinbaseApp').controller('MainCtrl', function ($scope, $http, $interval) {

    $scope.getPrice = function(){
        $http.jsonp('https://coinbase.com/api/v1/prices/spot_rate?callback=JSON_CALLBACK').success(function(data){
            $scope.data = data;
        });
    };

    $scope.getPrice();

    $interval($scope.getPrice, 60000);
});

我的问题:严格的MIME类型检查问题是否与Coinbase如何为json服务有关?或者这是AngularJS$http服务和/或我如何请求数据的问题?

对于那些询问者,我能够通过节点中的JSON代理解决我的问题

Coinbase REST API仅通过GET请求提供JSON端点,而不是JSONP(通常作为CORS替代方案提供)。如果没有JSONP,您无法向其域发出跨域请求,因为没有设置允许访问头(很可能是出于安全原因)

使用节点服务器端代理允许我通过代理在客户端发出请求,作为正常的GET请求,因为节点代理使用正确的头提供请求的返回结果


,使代理端点公开可用。

当调用一个不响应相应CORS头且不直接支持JSONP的服务时,可以安装http请求拦截器以将请求重写为GET,将原始URL移动到config.params中(以及回调)。然后定义responseTransform以提取并返回嵌入的JSON:

var app = angular.module('jsonp-proxy-request-interceptor', []);
app.service('jsonpProxyRequestInterceptor',
    function JsonpProxyRequestInterceptor($log) {
  var callbackRx = /callback\((.+)\);/gm;
  this.request = function(config) {
    if (config.url === 'https://api.domain.com/' && config.method === 'GET') {
      var apiUrl = config.url;
      config.url = 'https://jsonp.afeld.me/';
      config.params = angular.extend({}, config.params || {}, {
        url: apiUrl,
        callback: 'callback'
      });
      config.transformResponse.unshift(function(data, headers) {
        var matched = callbackRx.exec(data);
        return matched ? matched[1] : data;
      });
    }
    return config;
  };
});
app.config(['$httpProvider', function configHttp($httpProvider) {
  $httpProvider.interceptors.push('jsonpProxyRequestInterceptor');
}]);

您也可以从中得出这个示例的要点。

角度服务是一个很棒的解决方案,但是如果您在答案中嵌入代码,它将非常有用。如果您能详细说明您的答案,我将不胜感激。谢谢