当前位置: 首页 > 科技观察

如何使用AngularJS服务访问外部API

时间:2023-03-22 14:04:00 科技观察

如何使用AngularJS服务访问外部APIAngularJS除了能够方便地扩展HTML之外,还提供了一套简单的方法来帮助我们与外部API进行交互。在今天的教程中,我们将讨论如何使用它的服务与GitHub的API交互来创建一个简单的图书馆浏览器。第1步:准备我们从以下一组基本HTML模板开始:GitHubSearch现在添加将AngularJS脚本添加到文档的中:在此之后,我们可以将这组CCS样式添加到内联或单独的文件中:*{-webkit-box-sizing:border-box;-moz-box-sizing:边框框;框大小:边框框;字体系列:无衬线字体;}body,html{margin:0;}p{margin:0;}input{width:100%;}pre{white-space:pre-wrap;空白:-moz-pre-wrap;空白:-预包装;空白:-o-预换行;自动换行:断字;}div.repo{border-bottom:1pxsolid;游标:指针;}#search,#repo,#user{float:left;}#search{width:20%;}#repo{width:60%;}#user{width:20%;}如你所见,没有没有多余的东西,只保留最基本的布局方案——右边的搜索栏,中间的图书馆信息,右边的用户图书馆。我们还需要将相应的代码行打包到

标签中,然后我们将使用它来显示README文件的内容——因为这些内容通常来自GitHubFlavoredMarkdown,并且部分代码行与用户库列表。当然,您可以为其添加更多样式以增强结果的视觉效果——但请注意,本教程中的屏幕截图采用最基本的设计。可以将以后需要编写的JavaScript代码放在本文档的中,也可以为其创建一个独立的文件,但独立文件仍然需要在AngularJS脚本下。第2步:模块现在我们可以为我们的应用程序创建一个模块:varapp=angular.module('githubsearch',[]);接下来,使用ngApp指令将其添加到标记:第3步:控制器我们还需要为我们的应用程序准备一组控制器。为了简化创建过程,我们只为应用程序准备一套控制器,这样我们就不用担心如何在不同控制器之间传递信息:app.controller('SearchController',functionSearchController($scope){});第四步:基础服务我们需要定义自己的GitHub服务:app.factory('GitHub',functionGitHub($http){return{};});我们将使用app.factory()方法,以便保证返回的对象带有稍后将使用的几个方法。我们将使用$http服务从GitHub的API获取数据。第5步:搜索库我们服务中的第一个方法负责使用GitHubAPI搜索库。使用该服务非常简单(该函数可以访问make函数返回的对象):searchRepos:functionsearchRepos(query,callback){$http.get('https://api.github.com/search/repositories',{params:{q:query}}).success(function(data){callback(null,data);}).error(function(e){callback(e);});}$http.get()方法是执行GET请求的快捷方式。第一个参数是我们希望访问的URL。第二个参数表示一个带有选项的对象。我们在这里只需要params对象——它是将添加到请求中的查询参数的哈希值(其中q参数是搜索字符串,您可以在此处阅读更多相关信息)。$http.get()返回一个承诺。我们可以将侦听器附加到success()和error()并相应地调用回调。第6步:搜索栏为了使用我们在前面步骤中定义的功能,我们需要在HTML中添加一个搜索栏。相关代码非常简单,如下所示:{{repo.full_name}}

{{repo.description}}

>
我们使用ngModel指令将输入字段中的值指向Scope查询变量,并在用户按下回车键后使用ngKeyup调用executeSearch()函数(以便$event.keyCode==13将进行比较)。我们不能在AngularJS表达式中使用条件语句,但是一个简单的逻辑运算符(AND)就足以完成这项任务。在输入字段下方,我们使用ngRepeat来显示搜索结果。我们将显示库的全名和描述(如果您需要显示不同的内容,可以单击此处查看GitHubAPI文档中的可用字段)。我们还使用ngClick使用存储库的全名调用openRepo()函数,以便我们可以显示有关它的信息。我们稍后会定义这个函数。#p#Step7:使用搜索功能现在我们终于可以使用我们创建的服务了。首先,将GitHub参数添加到控制器函数(以便可以将服务注入到AngularJS中):app.controller('SearchController',functionSearchController($scope){现在定义executeSearch()函数:(){GitHub.searchRepos($scope.query,function(error,data){if(!error){$scope.repos=data.items;}});}如你所见,我们使用来自$的引用scope.查询的搜索字符串从中调用GitHub.searchRepos(),然后在回调中将搜索结果(来自data.items)添加到$scope.repos变量中,只要执行以上步骤,我们可以顺利显示搜索结果在浏览时在浏览器中打开我们的HTML文件,尝试搜索:第八步:获取库中的数据现在我们已经获取了搜索功能,可以在库中显示用户选择的信息内容库。让我们创建另一个函数来通过您自己的服务从存储库中获取数据:getRepo:functionget回购(名称,回调){$http.get('https://api.github.com/repos/'+名称).success(函数(数据){回调(空,数据);}).error(函数(e){回调(e);});传递给这个函数的名字必须是全名(结构:作者名,斜杠,库名——例如angular/angular.js),这是因为我们需要将它传递给GitHubAPI(点击这里了解更多指示)。第九步:获取库中的README文件README文件中的内容不包含在我们使用上述函数获取的数据当中。相反,您需要使用另一个API来调用和获取,因此我们需要创建以下函数:getReadme:functiongetReadme(name,callback){$http.get('https://api.github.com/repos/'+name+'/readme').success(function(data){callback(null,atob(data.content));}).error(function(e){callback(e);});}这个函数和之前创建的两个基本一样,只是url变了。我们还使用atob()函数来解码README文件的内容,因为它使用了base64编码机制。您可以点击此处查看获取GitHubAPI文档中README文件内容的相关信息。我们没有将这两个请求塞进同一个函数的原因是因为有些库根本没有README文件。如果我们将两者强加在一起,应用程序可能会因此出现故障。第十步:显示仓库信息我们将在另一个元素
中显示仓库的完整名称、查看仓库的人数以及README文件:{{activeRepo.full_name}}已被{{activeRepo.watchers_count}}人观看。
{{activeRepo.readme}}
我们会把这些信息存储在controller作用域中的activeRepo变量中。只要有数据可显示,ngShow就会显示该元素(如果没有数据可显示,我们只会看到文本'Watchedbypeople',并且不会选择任何库)。第十一步:更新控制器我们还需要更新控制器,确保它能够真正获取到库数据,并将其包含在Scope中。让我们创建我们之前附加到ngClick指令的openRepo()函数:;GitHub.getReadme(name,function(error,data){if(!error){$scope.activeRepo.readme=data;}else{$scope.activeRepo.readme='NoREADMEfound!';}});}});如您所见,我们首先使用GitHub.getRepo()方法检查错误,然后将该数据放入activeRepo变量中。接下来,我们获取README文件——如果它不存在,我们需要提醒用户这一事实。现在您可以再次运行您的应用程序并查看它的运行情况:第12步:获取用户的库有些显示他们所有可用的库。这就需要我们在服务中引入另外一个方法:getUserRepos:functiongetUser(name,callback){$http.get('https://api.github.com/users/'+name+'/repos').success(function(数据){回调(null,数据);}).error(函数(e){回调(e);});}其内容与前面的几乎相同(您可以单击此处查看与此API请求相关的更多信息)。第13步:显示用户的库这基本上相当于在HTML中重现搜索栏机制,但我们真正需要显示的是用户对象中的用户名和库,而不是输入字段或Scope本身:{{user.login}}{{repo.name}}

{{repo.description}}

此时,您应该已经有了一个可用的AngularJS应用程序-它可以获取GitHub基于搜索字符串的存储库。您可以进一步对其进行迭代,例如向其添加更多功能或使用完全不同的外观设计它。欢迎大家在评论栏留下你的实践经验、问题、意见和反馈!英文:http://code.tutsplus.com/tutorials/accessing-external-apis-using-angularjss-services--cms-21884