Web api Restful : 通过外键获取资源

Posted

技术标签:

【中文标题】Web api Restful : 通过外键获取资源【英文标题】:Web api Restful : Get resource by foreign key 【发布时间】:2021-02-12 18:32:02 【问题描述】:

我的问题是关于在以下情况的 .NET 核心 Web API 中命名路由的“正确方法”:

银行帐户始终与企业相关。 一个企业可以有多个银行账户 一份合同总是有一个银行账户

所以我有这样的资源:

/api/enterprise/1 // get enterprise 1
/api/contract/1 // get contract 1
/api/bank-account/1 //get bankaccount  1

我的问题是,获得企业银行账户的最佳方式是什么?

第一个想法:

使用查询字符串作为“搜索词”

api/bank-account?EnterpriseId=1

第二个想法

使用子资源

api/enterprise/1/bank-account

但如果我这样做,我有多个不同级别的“银行账户”,我不知道这是否是一个好方法?

api/enterprise/1/bank-account //bank-account level2
api/bank-account //bank-account level1

我认为第二个想法是一个好方法,但我不确定是否可以在不同级别的 api 上操作相同的“模型”。

谢谢。 祝你有美好的一天

【问题讨论】:

【参考方案1】:

看看微软路由Web API的例子:Routing in ASP.NET Web Api

我更喜欢第二个想法。稍微完善一下

例如:

api/enterprise      //return List of enterprise objects if needed
api/enterprise/1    //return specific enterprise with id 1
api/enterprise/1/bank-account    //return list of bank accounts for enterprise with id 1
api/enterprise/1/bank-account/1  //return specific bank account with id 1

如果您想在特定企业的上下文中获取银行帐户

但如果你只想通过 id 获取银行账户,最好这样做

api/bank-account/1

在这个用例中,如果不添加带有企业 ID 的查询字符串,您将无法真正获取特定企业的银行账户,因为

api/bank-account  //this should return list of bank accounts ALL BANK ACCOUNTS

这是一个多级控制器示例:

[Route("Inventories/inventoryId/[controller]")]
[ApiController]
public class InventoryEntriesController : ControllerBase

    ...
    
    // GET: Inventories/inventoryId/InventoryEntries
    [Authorize]
    [HttpGet]
    public async Task<ActionResult<IEnumerable<InventoryEntryDto>>> GetInventoryEntries(int inventoryId)
    
        ...
    
    
    // GET: Inventories/inventoryId/InventoryEntries/id
    [Authorize]
    [HttpGet("id")]
    public async Task<ActionResult<InventoryEntryDto>> GetInventoryEntry(int id)
    
        ...
    

    // POST: Inventories/inventoryId/InventoryEntries
    [Authorize]
    [HttpPost]
    public async Task<ActionResult<InventoryEntryDto>> AddInventoryEntry(InventoryEntryDto inventoryEntryDto)
    
        ...
    

    // PUT: Inventories/inventoryId/InventoryEntries/id
    [Authorize]
    [HttpPut("id")]
    public async Task<IActionResult> UpdateInventoryEntry(int id, InventoryEntryDto inventoryEntryDto)
    
        ...
    

    // DELETE: Inventories/inventoryId/InventoryEntries/id
    [Authorize]
    [HttpDelete("id")]
    public async Task<IActionResult> DeleteInventoryEntry(int id)
    
        ...
    

【讨论】:

以上是关于Web api Restful : 通过外键获取资源的主要内容,如果未能解决你的问题,请参考以下文章

通过 RESTful API 部署 Tensorflow 模型的示例 [关闭]

如何将cas restful api 获取到用户信息后

RESTful Web API 理解

RESTful API 与 Web 服务 API

RESTFUL如何指导WEB API设计?

RESTful API