如何在http请求中传递AccountId?

问题描述 投票:0回答:0

我正在开发一个使用 ASP Net Core 的新系统。发出请求的人(或后台服务)是

User
。用户需要登录。创建的令牌用于在进一步的请求中进行身份验证。

我们还有一个代表法律实体的

Account
。这可以是个人帐户或企业帐户。一个用户可以以多个账户的名义进行操作。用户可以例如为用户个人或以公司的名义下订单。当用户有多个账户时,需要选择一个账户。

用户应该能够打开多个浏览器选项卡,并在每个选项卡中充当不同的帐户。因此,对于与特定帐户关联的每个请求,都需要传递

accountId

我们正在讨论如何将 accountId 与请求一起传递。选项是:

1) JSON 网络令牌

accountId
userID
一起添加到JWT时,每次更改帐户时都需要发布新的JWT。我的经验太少,无法理解多选项卡的后果,但据我所知,将 JWT 存储在 cookie 或本地存储中意味着 cookie 在所有选项卡之间共享,使用 JWT 不是合适的选择。

2)标题
可以使用自定义标头,但我读到了有关可能从请求中剥离的自定义标头的问题。

3)查询参数
对于查询,查询参数是自然的,它会为 accountId 的订单过滤订单集合。对于命令,在技术上是可行的,但是在查询参数中而不是在正文中有额外的数据是令人困惑的。

获取账户下的所有订单:

GET
https://example.com/api/orders?accountId={accountId}
以账户名创建订单:
POST
https://example.com/api/orders?accountId={accountId}

4)URI
例如。: 以账户名创建订单:

POST
https://example.com/api/accounts/{accountId}/orders
添加项目到订单:
POST
https://example.com/api/orders/{orderId}/items
获取帐户下的所有订单:
GET
https://example.com/api/accounts/{accountId}/orders

账户集合清楚地表明订单是在特定账户下下的。添加商品时,不需要传递 accountId,因为它已经保存在订单中。只需要检查用户是否有权访问订单。如何从帐户访问订单也很清楚。如果用户可以看到来自所有授权帐户的所有订单 api/orders 也能正常工作。即使它在技术上是正确的,但我不喜欢并非所有与订单有关的请求都只使用订单集合。

5)身体
对于命令,accountId 可以在正文中传递。这很好用,可以使用简单的 URI /订单来表示

POST
PUT
PATCH
。对于
PATCH
,需要考虑在创建订单后更改 accountId 不是业务规则的选项。它不适用于
GET
.

6) POST、PUT、PATCH 的主体和 GET 的查询参数
对于创建和更新资源之类的命令,可以在正文中传递 accountId,而对于查询,则使用查询参数。

目前,我在 4) 和 6) 之间摇摆不定,倾向于 6)。由于 accountId 是下订单的法人实体,因此它是订单的属性。在体内传递它是很自然的。使用查询参数进行查询过滤也是自然而然的。 URI 方法也很好,但我更喜欢只对订单集合进行所有操作。

还有其他选择吗?这些选项是否存在我忽略或错误的问题?是否有支持或反对某个选项的任何 RFC、实用标准、问题?他们对问题的共同解决方案是什么?感谢您的回答。

rest
© www.soinside.com 2019 - 2024. All rights reserved.