我正在开发一个使用 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}/ordersPOST
https://example.com/api/orders/{orderId}/itemsGET
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、实用标准、问题?他们对问题的共同解决方案是什么?感谢您的回答。
• 我可以在我的 android 应用程序中将数组作为 http 参数传递吗?如何? [重复]
• FastAPI - 如何在 HTTP 多部分请求中传递字典/JSON 数据?
• Angular - OpenApi CodeGen - 如何在 api 请求中添加标头?
• 如何通过 Spring Boot 控制器将 Google 日历事件作为 JSON 请求主体传递?
• 如何将同一参数的多个值传递给我的请求 [soap mock 服务]?
• React Native 如何通过 api 调用传递 id?
• 如何使用 FastAPI 和 Python 请求传递字符串和多个文件?
• 将请求会话/cookie 传递给 Chrome webdriver
• HttpClient DelegatingHandler 无法正常工作
• 如何在 Java 8 中通过 java.net.HttpURLConnection 干净地拦截请求 URL?