我尝试使用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 docs:config
中添加$http.jsonp( {url: iucnUrl, responseType: 'text'} )
对象,但没有任何运气。
我的问题是,如何处理返回的HTML文档,或者我是否偏离此处?
来自API的响应是带有javascript扩展名的HTML文档:
答案 0 :(得分:1)
我对角查看了网站及其站点地图,发现没有对公共API的引用。所有输出都是HTML
,json
解析方法jsonp
无法理解它是有意义的。它遇到的第一个<
,它将失败(显而易见)。
首先,我会联系网站管理员,只需询问是否有API会产生XML
或json
或其他一些方便的符号表示方便与...合作。
然后就是他或她的回答是“不”的情况:
解析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