我正在创建一个Angular2应用程序,它将调用一个API网关(Web API)来调用一个或多个微服务(Web API),它将聚合数据并将一个有效负载返回给应用程序。
在创建API网关之前,我让Angular2应用程序在几个组件中独立调用每个微服务API端点。例如。客户组件名为/ api / customers,订单组件称为/ api / orders等。
我的问题是Angular2应用程序调用API网关进行一次调用以构建页面而不是每个组件进行单独调用的最佳方法是什么?
我是否必须预先拨打一个api电话并将数据存储在某处,例如localstorage,然后当每个组件的服务请求它的数据时,它会从存储中获取它而不是调用API吗?
答案 0 :(得分:0)
我认为这里有两种情况。
客户的组件是订单视图的父级。在这种情况下,提出一个大请求并将其传递给您的订单视图可能是有效的。但是,只是并行调用两个端点会更快。
客户的组件和订单视图是完全独立的。在这种情况下,提出一个大的请求是没有好处的。每次加载页面时,您可以发出两个单独的请求。如果用户不想看订单,那么它没用。
一般来说,如果您有两个单独的请求并且并行调用它们,我认为最好先练习一下。这使您可以将模型分解为更小并具有更好的结构。
希望有所帮助。干杯
答案 1 :(得分:0)
这个有点老了,但是我想弄清楚为什么有一个大请求而不是多个请求是一个更好的主意...
几年前,我使用了由jquery模式驱动的方法,该方法创建了这样的东西:
关于这种模式的好处是,我可以创建简单的服务,这些服务可以在不同页面上重用,从而使开发人员可以轻松地扩展功能。
一开始这看起来是个好主意,可以并行处理工作,就像@MangoBoy在他的回复中提到的那样,但是这种方法的问题是浏览器和javascript的局限性,基本上没有并行工作在javascript中,有一些并行工作的流,但最终javascript中的代码是按设计单线程处理的,最终结果是...如果您有10-20个异步元素(如下拉菜单),则用户会在渲染页面上一些下拉列表仍在加载,无论服务器端多快运行,无论如何,都无法并行执行数百个ajax调用,因为浏览器限制为并行调用,我认为我得到的数字就像10。
API网关模式的许多工作之一是聚合请求和结果,以完全避免此问题。 (又称为Chatty请求)
我对@ user1180223的建议是创建一个在NgInit或加载中调用该服务的服务,并在页面加载后立即请求尽可能多的用户信息,以及然后让其他标签或元素保持异步状态,而这些标签或元素不会被用户立即使用。在角度类过程中,ajax调用的结果将其放入变量中,以后可由组件访问。
希望这会有所帮助