本文是SitePoint Angular 2教程的第3部分,介绍了如何使用Angular CLI创建CRUD应用程序。在本文中,我们将更新我们的应用程序,以与REST API后端进行通信。
> >更喜欢使用分步视频课程学习角度?在SitePoint Premium上查看学习Angular 5。 在第一部分中,我们学会了如何将待办器应用程序启动,运行并部署到github页面。这效果很好,但是不幸的是,整个应用都被挤入了一个组件。 在第二部分中,我们检查了一个更模块化的组件体系结构,并学习了如何将这个单个组件分解为一个较小组件的结构化树,这些成分易于理解,重复使用和维护。第0部分 - 终极角度CLI参考指南
第1部分 - 获取我们的第一个todo应用程序启动和运行
>在与REST API通信时,使用RXJS使用Angular的HTTPClient来有效处理异步HTTP请求。
>当前,TodoDataservice将所有数据存储在内存中。在第三篇文章中,我们将更新我们的应用程序,以与REST API后端进行通信。
我们将:
在本文结尾处,您将了解:
>如何使用环境变量存储应用程序设置
>确保已安装了最新版本的Angular CLI。如果不这样
之后,您需要从第二部分中的代码副本。这可以在Github上找到。本系列中的每个文章在存储库中都有一个相应的标签,因此您可以在应用程序的不同状态之间来回切换。
<span>npm install -g @angular/cli@latest </span>
>
npm uninstall -g @angular/cli angular-cli npm cache clean <span>npm install -g @angular/cli@latest </span>
>因此,要启动并运行(已安装了Angular CLI的最新版本),我们将执行此操作:
>然后访问http:// localhost:4200/。如果一切顺利,您应该看到工作的todo应用程序。
设置REST API后端>让我们使用JSON服务器快速设置模拟后端。
<span>git clone git@github.com:sitepoint-editors/angular-todo-app.git </span><span>cd angular-todo-app </span><span>git checkout part-2 </span><span>npm install </span>ng serve
>
>最后,将脚本添加到package.json开始我们的后端:
我们现在可以使用以下方式启动REST API后端
<span>npm install json-server --save </span>
这应该显示以下内容:
<span>{ </span> <span>"todos": [ </span> <span>{ </span> <span>"id": 1, </span> <span>"title": "Read SitePoint article", </span> <span>"complete": false </span> <span>}, </span> <span>{ </span> <span>"id": 2, </span> <span>"title": "Clean inbox", </span> <span>"complete": false </span> <span>}, </span> <span>{ </span> <span>"id": 3, </span> <span>"title": "Make restaurant reservation", </span> <span>"complete": false </span> <span>} </span> <span>] </span><span>} </span>
>要验证您的后端是否按预期运行,您可以将浏览器导航到http:// localhost:3000。
<span>"scripts": { </span> <span>... </span> <span>"json-server": "json-server --watch db.json" </span><span>} </span>
>因此,如果您将浏览器导航到http:// localhost:3000/todos,则应看到DB.JSON的所有Todos的JSON响应
>要了解有关JSON服务器的更多信息,请确保使用JSON-Server查看模拟REST API。存储API URL
>将URL存储在一个地方,这样我们只需要在需要更改其值
使我们的应用程序在开发过程中连接到开发API,并连接到生产中的生产API。
>当我们运行NG服务或NG构建时,Angular CLI使用开发环境中指定的值(SRC/Environments/Environment.TS)。
但是,当我们运行ng服务 - 环境产品或ng构建 - 环境产品时,Angular CLI使用SRC/Environments/Environment.prod.ts。
中指定的值<span>npm install -g @angular/cli@latest </span>
npm uninstall -g @angular/cli angular-cli npm cache clean <span>npm install -g @angular/cli@latest </span>
>
本文系列中的应用程序未托管在生产中,因此我们在开发和生产环境中指定了相同的API URL。这使我们能够运行NG服务 - 环境产品或NG构建 - 环境在当地生产,以查看一切是否按预期工作。<span>git clone git@github.com:sitepoint-editors/angular-todo-app.git </span><span>cd angular-todo-app </span><span>git checkout part-2 </span><span>npm install </span>ng serve
>您还可以通过添加键来创建其他环境,例如分期:
并创建相应的环境文件。
要了解有关角CLI环境的更多信息,请确保查看“终极角CLI参考指南”。 >现在我们将API URL存储在环境中,我们可以创建一个角度服务以与REST API后端进行通信。
创建服务以与REST API后端通信>让我们使用Angular CLI创建一个Apiservice与我们的REST API后端进行通信:
<span>npm install json-server --save </span>
>这给出以下输出:
<span>{ </span> <span>"todos": [ </span> <span>{ </span> <span>"id": 1, </span> <span>"title": "Read SitePoint article", </span> <span>"complete": false </span> <span>}, </span> <span>{ </span> <span>"id": 2, </span> <span>"title": "Clean inbox", </span> <span>"complete": false </span> <span>}, </span> <span>{ </span> <span>"id": 3, </span> <span>"title": "Make restaurant reservation", </span> <span>"complete": false </span> <span>} </span> <span>] </span><span>} </span>
<span>npm install -g @angular/cli@latest </span>
npm uninstall -g @angular/cli angular-cli npm cache clean <span>npm install -g @angular/cli@latest </span>
在我们实施所需的方法之前,让我们看看Angular的HTTP服务。
<span>git clone git@github.com:sitepoint-editors/angular-todo-app.git </span><span>cd angular-todo-app </span><span>git checkout part-2 </span><span>npm install </span>ng serve
Angular HTTP服务
Angular HTTP服务可作为 @angular/http的注射类别提供 >它构建在XHR/JSONP之上,并为我们提供了一个HTTP客户端,我们可以使用该客户端从Angular应用程序中提出HTTP请求。
可用于执行HTTP请求的以下方法:get(url,选项):执行get request
head(url,选项):执行头部请求
>选项(url,选项):执行选项请求
如果我们回想起端点,我们的REST API后端会公开:
get /todos:获取所有现有的todos
get /todos /:id:获取现有的todo
post /todos:创建一个新的todo
put /todos /:id:更新现有的todo
我们已经可以创建我们需要的方法的粗略轮廓及其相应的角度HTTP方法:
>
getalltodos()
这将返回可观察的。
然后,我们在可观察的上调用映射()方法,以将响应从API转换为todo对象的数组:<span>npm install -g @angular/cli@latest </span>
>传入的HTTP响应是一个字符串,因此我们首先调用响应。
然后,我们循环浏览API响应的招待,然后返回一系列TODO实例。请注意,映射()的第二次使用是使用array.prototype.map(),而不是rxjs operator。>最后,我们将一个错误处理程序附加到记录潜在错误到控制台:
我们在单独的方法中定义了错误处理程序,因此我们可以以其他方法重复使用:
npm uninstall -g @angular/cli angular-cli npm cache clean <span>npm install -g @angular/cli@latest </span>
>在运行此代码之前,我们必须从RXJS库中导入必要的依赖项:
<span>git clone git@github.com:sitepoint-editors/angular-todo-app.git </span><span>cd angular-todo-app </span><span>git checkout part-2 </span><span>npm install </span>ng serve
在我们的应用程序中,我们导入可观察的类:
<span>npm install json-server --save </span>
我们导入代码所需的三个运算符:
>进口操作员确保我们可观察的实例与它们附加了相应的方法。
<span>{ </span> <span>"todos": [ </span> <span>{ </span> <span>"id": 1, </span> <span>"title": "Read SitePoint article", </span> <span>"complete": false </span> <span>}, </span> <span>{ </span> <span>"id": 2, </span> <span>"title": "Clean inbox", </span> <span>"complete": false </span> <span>}, </span> <span>{ </span> <span>"id": 3, </span> <span>"title": "Make restaurant reservation", </span> <span>"complete": false </span> <span>} </span> <span>] </span><span>} </span>
如果我们在代码中没有导入的'rxjs/add/operator/map',则以下内容将行不通:
><span>"scripts": { </span> <span>... </span> <span>"json-server": "json-server --watch db.json" </span><span>} </span>
这是因为this.http.get返回的可观察的可观察到不会有map()方法。
>>我们只需要一次导入操作员即可在您的应用程序中在全球范围内启用相应的可观察方法。但是,多次导入它们并不是问题,也不会增加由此产生的捆绑包大小。
><span>npm run json-server </span>
getTodobyId()方法允许我们获得一个todo:
>
createTodo()
<span>\{^_^}/ hi! </span> Loading db.json Done Resources http://localhost:3000/todos Home http://localhost:3000
>我们首先对我们的API执行邮政请求,并将数据传递为第二个参数:
updateTodo()
<span>// src/environments/environment.ts </span><span>// used when we run `ng serve` or `ng build` </span><span>export const environment = { </span> production<span>: false, </span> <span>// URL of development API </span> apiUrl<span>: 'http://localhost:3000' </span><span>}; </span>
updateTodo()方法允许我们更新单个todo:
<span>// src/environments/environment.prod.ts </span><span>// used when we run `ng serve --environment prod` or `ng build --environment prod` </span><span>export const environment = { </span> production<span>: true, </span> <span>// URL of production API </span> apiUrl<span>: 'http://localhost:3000' </span><span>}; </span>
然后,我们将响应转换为一个todo对象:
<span>import { environment } from 'environments/environment'; </span> <span>// we can now access environment.apiUrl </span><span>const API_URL = environment.apiUrl; </span>
deletetodobyid()方法允许我们删除单个todo:
<span>"environments": { </span> <span>"dev": "environments/environment.ts", </span> <span>"prod": "environments/environment.prod.ts" </span><span>} </span>
然后,我们将响应转换为null:
<span>"environments": { </span> <span>"dev": "environments/environment.ts", </span> <span>"staging": "environments/environment.staging.ts", </span> <span>"prod": "environments/environment.prod.ts" </span><span>} </span>
>我们真的不需要在这里改变响应,并且可以忽略这一行。仅包括您在执行删除请求时API返回数据时如何处理响应的方法。
ng generate <span>service Api --module app.module.ts </span>
<span>npm install -g @angular/cli@latest </span>
>现在我们已经有了Apiservice,我们可以使用它来让我们的TodoDataservice与我们的REST API后端进行通信。
更新tododataservice>让我们的TodoDataservice与我们的REST API后端进行通信,我们必须注入新的Apiservice:
npm uninstall -g @angular/cli angular-cli npm cache clean <span>npm install -g @angular/cli@latest </span>
我们还更新了其方法,将所有工作委派给了Apiservice中的相应方法:
<span>git clone git@github.com:sitepoint-editors/angular-todo-app.git </span><span>cd angular-todo-app </span><span>git checkout part-2 </span><span>npm install </span>ng serve
我们的新方法实现看起来要简单得多,因为数据逻辑现在由REST API后端处理。 但是,有一个重要的区别。旧方法包含同步代码,并立即返回一个值。更新的方法包含异步代码并返回可观察的代码。
><span>npm install json-server --save </span>
>更新AppComponent
当前,AppComponent期望TodoDataservice直接返回JavaScript对象和数组:
,但是我们的新Apiservice方法返回可观察的。
如果我们当前在todos()中拨打tododataservice.getalltodos()方法:
<span>{ </span> <span>"todos": [ </span> <span>{ </span> <span>"id": 1, </span> <span>"title": "Read SitePoint article", </span> <span>"complete": false </span> <span>}, </span> <span>{ </span> <span>"id": 2, </span> <span>"title": "Clean inbox", </span> <span>"complete": false </span> <span>}, </span> <span>{ </span> <span>"id": 3, </span> <span>"title": "Make restaurant reservation", </span> <span>"complete": false </span> <span>} </span> <span>] </span><span>} </span>
tododataservice.getalltodos()方法调用相应的apiservice.getAllTodos()方法:
>此反过
但是,我们必须记住一件事!
<span>"scripts": { </span> <span>... </span> <span>"json-server": "json-server --watch db.json" </span><span>} </span>
只要我们不订阅可观察到的可观察到的返回:
<span>npm run json-server </span>
>
要订阅可观察的可观察,我们可以使用subscribe()方法,该方法采用三个参数:<span>\{^_^}/ hi! </span> Loading db.json Done Resources http://localhost:3000/todos Home http://localhost:3000
> onnext:可观察到新值
时称为一个函数
> onerror:可观察到错误<span>// src/environments/environment.ts </span><span>// used when we run `ng serve` or `ng build` </span><span>export const environment = { </span> production<span>: false, </span> <span>// URL of development API </span> apiUrl<span>: 'http://localhost:3000' </span><span>}; </span>
oncompleted:可观察到的函数在可观察到优雅终止时称为。
>让我们重写我们当前的代码:
现在,让我们更新onaddtodo(todo)方法,也可以处理可观察的响应:
<span>// src/environments/environment.prod.ts </span><span>// used when we run `ng serve --environment prod` or `ng build --environment prod` </span><span>export const environment = { </span> production<span>: true, </span> <span>// URL of production API </span> apiUrl<span>: 'http://localhost:3000' </span><span>}; </span>
>再次,我们使用subscribe()方法来订阅this.tododataservice.addtodo(todo)的可观察到的可观察到的,当响应进来时,我们将新创建的todo添加到当前的todos列表中。 >
我们对其他方法重复相同的练习,直到我们的AppComponent看起来像这样:
<span>npm install -g @angular/cli@latest </span>
请注意,当您订阅Angular HTTP服务返回的可观察到的可观察到的时,无需手动订阅。 Angular将清理所有内容,以防止记忆泄漏。
>让我们看看一切是否按预期工作。尝试
打开一个终端窗口。从我们的应用程序目录的根目录中,启动RELT API后端:
再次,从我们的应用程序目录的根目录中,服务角应用程序:
现在,将您的浏览器导航到http:// localhost:4200。
npm uninstall -g @angular/cli angular-cli npm cache clean <span>npm install -g @angular/cli@latest </span>
如果一切顺利,您应该看到以下内容:
<span>git clone git@github.com:sitepoint-editors/angular-todo-app.git </span><span>cd angular-todo-app </span><span>git checkout part-2 </span><span>npm install </span>ng serve
如果您看到错误,则可以将代码与GitHub上的工作版本进行比较。
太棒了!我们的应用程序现在正在与REST API后端进行通信!
>>侧提示:如果要运行NPM运行json服务器,并且在同一终端中使用NG,则可以同时使用两个命令,而无需打开多个终端窗口或选项卡。
运行我们的测试
打开第三个终端窗口。
再次,从应用程序目录的根目录中,运行单元测试:
>让我们看看为什么我们的测试失败以及如何修复它们。
修复我们的单元测试
>大多数失败的单元测试都与检查数据处理有关。这些测试不再需要,因为现在我们的REST API后端而不是TodoDataService执行数据处理,因此,让我们删除过时的测试:
<span>npm install json-server --save </span>
>
由于testbed.configuretestingmodule()创建了用于测试的临时模块,因此引发了错误。
要使喷油器意识到Apiservice,我们必须通过将Apiservice列为配置对象中的提供商,并将其传递给testbed.configuretestingmodule():>我们不希望我们的测试跑步者在运行单元测试时连接到真正的API,因此让我们创建一个Apimockservice来模拟单元测试中的真实Apiservice。
创建一个apimockservice<span>{ </span> <span>"todos": [ </span> <span>{ </span> <span>"id": 1, </span> <span>"title": "Read SitePoint article", </span> <span>"complete": false </span> <span>}, </span> <span>{ </span> <span>"id": 2, </span> <span>"title": "Clean inbox", </span> <span>"complete": false </span> <span>}, </span> <span>{ </span> <span>"id": 3, </span> <span>"title": "Make restaurant reservation", </span> <span>"complete": false </span> <span>} </span> <span>] </span><span>} </span>
>让我们使用Angular CLI生成新的Apimockservice: 这显示了以下内容: 接下来,我们实现了与Apiservice相同的方法,但是我们让这些方法返回模拟数据而不是做出HTTP请求: >现在我们有了Apimockservice服务,我们可以用Apimockservice在单位测试中代替Apiservice。
在提供商数组中,我们告诉注射器在请求apiservice时提供Apimockservice:
>
不用担心是否配置测试模块看起来有些不知所措。 >您可以在官方文档中了解有关Angular应用程序的官方文档中设置单元测试的更多信息。
然后,向注射器提供我们的模拟apiservice: 欢呼!我们所有的测试都通过: 要将我们的应用程序部署到生产环境中,我们现在可以运行: >
在第一篇文章中,我们学会了如何: >使用Angular Cli
<span>npm install -g @angular/cli@latest
</span>
npm uninstall -g @angular/cli angular-cli
npm cache clean
<span>npm install -g @angular/cli@latest
</span>
<span>git clone git@github.com:sitepoint-editors/angular-todo-app.git
</span><span>cd angular-todo-app
</span><span>git checkout part-2
</span><span>npm install
</span>ng serve
<span>npm install json-server --save
</span>
<span>{
</span> <span>"todos": [
</span> <span>{
</span> <span>"id": 1,
</span> <span>"title": "Read SitePoint article",
</span> <span>"complete": false
</span> <span>},
</span> <span>{
</span> <span>"id": 2,
</span> <span>"title": "Clean inbox",
</span> <span>"complete": false
</span> <span>},
</span> <span>{
</span> <span>"id": 3,
</span> <span>"title": "Make restaurant reservation",
</span> <span>"complete": false
</span> <span>}
</span> <span>]
</span><span>}
</span>
<span>"scripts": {
</span> <span>...
</span> <span>"json-server": "json-server --watch db.json"
</span><span>}
</span>
<span>npm run json-server
</span>
<span>\{^_^}/ hi!
</span>
Loading db.json
Done
Resources
http://localhost:3000/todos
Home
http://localhost:3000
<span>// src/environments/environment.ts
</span><span>// used when we run `ng serve` or `ng build`
</span><span>export const environment = {
</span> production<span>: false,
</span>
<span>// URL of development API
</span> apiUrl<span>: 'http://localhost:3000'
</span><span>};
</span>
<span>// src/environments/environment.prod.ts
</span><span>// used when we run `ng serve --environment prod` or `ng build --environment prod`
</span><span>export const environment = {
</span> production<span>: true,
</span>
<span>// URL of production API
</span> apiUrl<span>: 'http://localhost:3000'
</span><span>};
</span>
摘要
<span>import { environment } from 'environments/environment';
</span>
<span>// we can now access environment.apiUrl
</span><span>const API_URL = environment.apiUrl;
</span>
>
在第四部分中,我们将介绍路由器和重构AppComponent,以使用路由器从后端获取烟多。
>在第五部分中,我们将实施身份验证以防止未经授权访问我们的应用程序。
>本文是由Vildan Softic审查的。感谢SitePoint所有的同行评审器制作SitePoint内容的最佳功能!
>经常询问有关Angular和RXJS API服务的问题(常见问题解答)> rxjs在Angular API服务中的作用是什么?
rxjs,用于JavaScript的反应性扩展的缩写,是一个用于使用可观察力的反应性编程的库,以使基于异步或回调更容易组成基于异步或回调的库代码。在Angular API服务的背景下,RXJS在处理异步操作中起着至关重要的作用。它提供了一种创建和使用可观察到的方法,从而可以管理多个异步操作,处理错误,甚至取消操作。这使其成为使用HTTP请求的功能强大的工具,它们本质上是异步的。> Angular如何与REST后端交互?我如何在Angular API服务中重试失败的请求? ,您可以使用RXJS的操作员重试或重试失败的请求。重试操作员重新提交可观察到的,有效地重复HTTP请求。重试的操作员允许您定义重试该请求的条件。
以上是Angular和RXJS:添加REST API后端的详细内容。更多信息请关注PHP中文网其他相关文章!