实现 HATEOS REST API 以返回聚合 Order 对象的最佳方法是什么?

问题描述

我正在使用 .net 核心并拥有两个名为 Customer_ApiOrder_Api 的微服务。我试图坚持 RESTful 最佳实践并应用 HATEOS。我有一个 Order 模型类,如下所示:

    public class Order : BaseEntity
    {
        public string TransactionId { get; set; }

        public decimal Total { get; set; }

        public Guid CustomerId { get; set; }

        public virtual Customer Customer { get; set; }

        public Guid DeliveryAddressId { get; set; }

        public virtual OrderDeliveryAddress DeliveryAddress { get; set; }

        public ICollection<OrderLine> OrderLines { get; set; }
    }

假设:

  1. 假设这是一个中型电子商务系统,我们的微服务收到大量请求
  2. 我们的订单类代表正确且足够的结构

问题:

现在,我正在编写一个 GET API 来返回单个 order。如果我想坚持使用 HATEOS,这是否意味着 API 响应不应包含客户对象(例如客户的姓名),而是只返回带有 URL 链接的客户 ID,客户可以使用该 URL 链接从客户微服务?对于订单行和送货地址,或者基本上,对于可能进入我们的 Order 对象的任何其他资源,我们应该返回相对的 GET URL 而不是对象自己坚持 HATEOS?

我认为订单对象的 HATEO 响应在 JSON 中应该如下所示:

{
     "transactionId": "blabla","customerId": "blabla","customerUrl": "https://localhost:443/customer/blabla","orderLines": [ { "id": "bla","orderUrl": "https://localhost:442/order/bla" } ],....
}

这有意义吗?或者这是过度杀戮?或者效率不高?如果有人能证实我的想法或为我澄清这一点,我将不胜感激。

解决方法

我认为您可以有一种方法来创建 HEATOS 链接。该方法 transactionId customerId orderLines 并在结果响应中构建和附加 customerUrl

例如

  //exaple reository
    public order GetOrderRepository()
    {
        Random r = new Random();
        return new order()
        {
            orderId = r.Next(0,99999)
        };
    }
    //exaple endpoint
    [HttpGet]
    public ActionResult<order> getOrder()
    {
        var order = GetOrderRepository();
        return Ok(GetOrderWithHeatos(order));
    }
    //our HEATOS builder
    public order GetOrderWithHeatos(order order)
    {
        order.orderUrl = new Uri($"AbsloutePath/{order.orderId}").ToString();
        return order;
    }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...