未捕获的SyntaxError:调用angularJS $ http.jsonp时出现意外的标记<

时间:2014-03-17 17:41:41

标签: ajax angularjs http jsonp

我尝试使用IUCN Red List网络服务API(here's an example output)。很遗憾,除了one-off Gist之外,我还没有找到任何其他文档。看起来API正在构建HTML文档而不是返回数据对象,这不是我过去经历过的事情。我还注意到在示例中没有提到URL中的?callback=JSON_CALLBACK,在处理JSONP时我会期望这样。

我在AngularJS中构建了一个http请求,如下所示:

atRiskApp.controller('IucnController', ['$scope', '$routeParams', '$http', function ($scope, $routeParams, $http) {
  $scope.iucn = $routeParams.iucn; // pulling a number from the URL: ex. 22718591

  $scope.getIUCN = function () {
    var iucnUrl = 'http://api.iucnredlist.org/details/' + $scope.iucn + '/0.js';

    $http.jsonp( url )
      .success( function (response) {
        console.log(response);
      })
      .error( function (response) {
        console.log(response);
      });
  };
}]);

虽然HTML文档已成功传递到我的应用程序,但我收到以下错误消息: Uncaught SyntaxError: Unexpected token <

似乎该应用程序希望获得Javascript,而是获取一个HTML文档,它显然无法解析。我尝试在请求based on the angular docsconfig中添加$http.jsonp( {url: iucnUrl, responseType: 'text'} )对象,但没有任何运气。

我的问题是,如何处理返回的HTML文档,或者我是否偏离此处?

来自API的响应是带有javascript扩展名的HTML文档: API Response

2 个答案:

答案 0 :(得分:1)

我对角查看了网站及其站点地图,发现没有对公共API的引用。所有输出都是HTMLjson解析方法jsonp无法理解它是有意义的。它遇到的第一个<,它将失败(显而易见)。

首先,我会联系网站管理员,只需询问是否有API会产生XMLjson或其他一些方便的符号表示方便与...合作。

然后就是他或她的回答是“不”的情况:

解析HTML不是一件容易接受的事情,当然不是你自己写的东西,除非绝对必要

幸运的是,有很多方法可以使用jQuery.parseHTML()来获取数据,pure ('vanilla') javascript ways可以在AngularJS中使用HTML Agility Pack和完整的HTML解析库,例如{{3}}(用于{ {1}}),所有这些都可以让你了解你想要瞄准的DOM节点中数据的核心。

还有许多其他库可能会为您提供更好的服务,但这些示例将为您提供一个很好的起点来描绘HTML解析的格局。这将需要一些调查,但它将是值得的。

答案 1 :(得分:1)

在评论的page you linked to上,我在 API索引标题下找到了一些可能有用的信息。

您实际上可以获得所有级别的分类法的JSON,包括您的示例Aneides aeneus。但是,此JSON不包含HTML版本中的所有数据,因此它没有用处。希望这有点帮助。

  

API索引(摘录)

     

还可以检索与单个物种相对应的索引的行:

     

http://iucn-redlist-api.heroku.com/index/species/panthera-leo.json

     

您可以使用短划线作为空格,作为标准网址转义的方便替代,%20

     

HTML格式包含物种帐户页面的直接链接。 CSV和JSON格式包括species_id列,可用于构建物种帐户URL,如下所示:

     

http://iucn-redlist-api.heroku.com/details/species_id/0

     

要直接在网页中使用索引JSON,您可能需要JSONP填充;使用“.js”扩展名并添加一个“callback”参数以及要使用的函数的名称。

     

http://iucn-redlist-api.heroku.com/index/genus/Dioscorea.js?callback=show