修复第三方API“Access-Control-Allow-Origin”错误

时间:2016-05-03 18:43:24

标签: angularjs http cors cross-domain

我有一个Angular应用程序,目前是我打开的HTML文件,但很快就会转换为服务器/通过localhost访问。我使用$ http来访问第三方API(我无法控制它的响应;大多数API调用都有效,但有些则没有,并抛出错误:

XMLHttpRequest无法加载http://api.nal.usda.gov/ndb/search/?format=json&api_key=RJEnADgGbCjfJYi0z8vuVnelYXn2Smud2Dfi2u2F&q=susage。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许原点'null'访问。响应的HTTP状态代码为404.

抛出该错误的API调用是返回0结果的搜索(在该示例中,数据库不返回“susage”的结果)。在“网络”选项卡中,无法加载响应,并且未列出任何响应标头;对于其他工作API调用,在Response Headers下,存在必要的“Access-Control-Allow-Origin:*”。

API肯定会形成一个响应并尝试将其发回,但无论出于何种原因都会失败。访问发布的网址会显示响应。

为什么只有空的搜索会在API理解并且对两个调用都有响应时抛出错误,我该如何解决?我希望我的前端直接与API通信,而不是与我的后端通信,后端又与API通信。

为了进行比较,搜索结果(正确拼写'香肠')与没有结果的搜索:http://imgur.com/a/ihhI1

$ http代码:

return $http.get('http://api.nal.usda.gov/ndb/search/?format=json', {
            params: {
                api_key: usdaKey,
                q: query
            }
        })

1 个答案:

答案 0 :(得分:1)

为了揭露" -1"对UI的状态(超时),我更改了服务方法以简单地返回promise,如下所示:

var search = function(query) {
  return $http.get('http://api.nal.usda.gov/ndb/search/?format=json', {
    params: {
      api_key: usdaKey,
      q: query
    }
  });
};

然后您可以在控制器中处理错误,如下所示:

$scope.search = function(query) {
  $scope.items = [];
  $scope.err = null;
  foodInfo.search(query).then(function(response) {
    console.log(response);
    $scope.items = response.data.list.item;
  }, function(e) {
    console.log('Error status: ' + e.status);
    if (e.status === -1) {
      $scope.err = 'No data found';
    }
  });
};