什么是正确的API端点?

时间:2019-08-05 07:57:39

标签: c# rest api .net-core asp.net-core-webapi

我正在这样编写API端点,但是这里有些模糊。 这些端点正在使用具有CompanyId和KeywordId的CompanyKeyword表。因此,该表与公司和关键字表相关。

我将分别在端点下方获得所有公司关键字和特定公司关键字。

当我在互联网上查看REST API: Design Guidelines时。准则说

  

如果关系只能存在于另一个资源中,请使用   根据它。

这将我引向以下端点:

[HttpGet("api/company/{companyId}/keyword/{keywordId}")]
[HttpGet("api/company/{companyId}/keyword")]

但是我在后端代码中没有使用companyId和keywordId。我只需要companyKeywordId。

因此,我正在使用如下所示的端点。

(1)
[HttpGet]
public async Task<IActionResult> GetAllAsync()
{
   // Some Code
}

[HttpGet("{id}")]
public async Task<IActionResult> GetByIdAsync(Guid id)
{
   // Some Code
}

当我查看互联网时,如果在代码中使用了companyId和keywordId,而不是从端点请求它们。如果不需要它们,则不会从api端点请求它们。

(2)
[HttpGet("api/company/{companyId}/keyword")]
[HttpGet("api/company/{companyId}/keyword/{keywordId}")]

我很困惑。哪一个是正确的1或2?

您能帮我吗?

1 个答案:

答案 0 :(得分:0)

这是一致性和清晰度的问题。通过查看请求:

api/company/{companyId}/keyword
api/company/{companyId}/keyword/{keywordId}

我知道我正在获得companyId的关键字列表或keywordId的特定关键字companyId。这是一个明确的api请求,因为我可以通过查看url来确定得到的结果。

现在,如果网址会更改,因为我真的不需要后端上的companyId

api/keyword/{keywordId}

然后从URL中我不再可以确定此关键字所属的位置。实际上,甚至还不清楚您是否真的需要它属于一家公司。

如果资源属于其他资源,那么即使您实际上并不需要关联的ID,也请在URL中写清楚。

说了;为什么不使用companyId,即使您不需要它呢?作为您的API的用户,我可能会认为关键字342属于公司589,但如果不属于该公司呢? url api/keyword/342仍将返回它,因为您没有在select语句中包括公司ID。因此,即使您的 似乎 没有道理,也可以使用您网址中的任何标识符进行通话。

select * from keywords where companyId = 589 and keywordId = 342;