我有一个我用AngularJS,C#和Entity Framework实现的小网站。整个网站是单页应用程序,并从一个单一的C#Web服务获取所有数据。
我的问题涉及C#Web服务应该公开的接口。这一次,服务可以以RESTful方式提供实体,直接提供或作为DTO提供。另一种方法是Web服务只返回一个用例的对象,这样AngularJS Controller只需要调用一次Web服务,就可以直接使用响应的模型。
澄清一下,请考虑以下两个片段:
// The service returns DTOs, but has to be invoked multiple
// times from the AngularJS controller
public Order GetOrder(int orderId);
public List<Ticket> GetTickets(int orderId);
和
// The service returns the model directly
public OrderOverview GetOrderAndTickets(int orderId);
虽然第一个示例公开RESTful接口并使用资源隐喻,但它具有仅返回部分数据的巨大缺点。第二个示例返回根据MVC控制器的需求定制的对象,但很可能只在一个MVC控制器中使用。此外,在第二种情况下,需要对公共字段进行大量映射。
我发现我在我的网络服务中不时做这两件事,并想得到一些反馈。我并不太关心性能,尽管多个请求当然有问题,一旦它们使应用程序变得太慢,它们就需要重构。设计Web服务接口的最佳方法是什么?
答案 0 :(得分:1)
我建议使用REST方法,通用API设计,而不是单一用途的远程过程调用(RPC)方法。虽然RPC在项目开始时会很快,但在维护代码时,端点数通常会成为一种负担。现在,如果你只有不到20种类型的服务器调用,我会说你可以坚持使用这种方法而不会被严重咬伤。但是如果你的项目的寿命超过一年,你的终点可能会比20更多。
使用基于休息的服务,您始终可以添加一个可选参数来描述所述资源包含的子记录,并将其返回给特定的调用。
答案 1 :(得分:0)
RESTful服务返回子实体或具有可选的查询字符串参数来切换该行为没有任何问题
public OrderOverview GetOrder(int orderId, bool? includeTickets);
在订单中返回票证时,让每张票证都包含一个引用该特定票证的URL端点的属性(/ api / tickets / {id}或其他),以便客户端可以独立于该票证使用票证。为了
答案 2 :(得分:0)
在这种特殊情况下,我会说这取决于你有多少张票。我们假设您要为门票添加分页,您是否希望每次获得下一组门票时都能获得订单?
您可以随时通过$ q.all()立即发出多个请求并解决所有承诺。
答案 3 :(得分:0)
最佳做法是在Angular Service中包装HTTP调用,多个角度控制器可以引用。
有了这个,我认为对服务器的2次调用不会对你造成太大的损害。当您想要为网站添加新视图时,您不必更改网络服务或添加任何新的角度服务。
一般来说,API的编写应该独立于消费它的内容。如果你时间紧迫,并且你确定你永远不需要从其他客户端消费它,你可以专门为你的网络应用程序编写它。但通常情况就是如此。