问题描述
我正在使用 .net 核心并拥有两个名为 Customer_Api
和 Order_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; }
}
假设:
- 假设这是一个中型电子商务系统,我们的微服务收到大量请求
- 我们的订单类代表正确且足够的结构
问题:
现在,我正在编写一个 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;
}