通常使用Web API参数 - route vs header?

时间:2017-09-25 18:08:21

标签: c# rest asp.net-web-api routes api-design

我正在寻找在几乎所有的Web API方法之间传递通用参数的最佳方法。这种情况下的参数是存储库标识符,因为登录SPA时可以选择使用哪个数据库从/向其读取和写入数据。然后,此选择将​​存储在应用程序中,并在将来的所有API调用中使用。

我考虑的选择是:

  1. 路由值 - 这意味着将路由参数添加到所有路由,并确保为SPA发出的每个呼叫发送它:[Route("api/{repo}/{user}/{id}")]。这里的优点是它可能更明确。
  2. 自定义标头值,应用程序在每个API请求中盲目应用,并在需要时由API使用。因此要求传递此标头。这里的优点是关注点分离 - 管理用户屏幕的SPA部分不需要知道它正在使用哪个回购。
  3. 是否有API中常用参数的最佳实践指南?关于何时应使用自定义标头值传递参数FromUriFromBody的区别?

2 个答案:

答案 0 :(得分:0)

这取决于具体情况,但如果您已经制作了API,每次需要传递某些参数时,那么最好在标头中发送此参数。 HTTP标头用于发送有关请求上下文的额外信息,但请注意添加过多的标头键值。

通过header和querystring(通过URL),您只能以键值对方式发送数据,而通过HTTP正文,您可以发送不同类型的有效负载(数据),即JSON,XML,txt,FileStream等。

根据选择发送数据的方法,数据大小存在某些限制。通过标题,您可以为每个键值对传递最大8KB大小的数据,在查询字符串中,您可以添加多达2048个字符,通过正文,我们可以发送多达0到> = 2 MB的数据(大小可能因服务器而异)到服务器)。

有关详细信息,请参阅RFC 7231

答案 1 :(得分:0)

它取决于用例

如果您需要在用户之间共享链接,您肯定需要使用路径 它看起来也更透明,更容易理解

如果您想隐藏最终用户的信息,我相信您需要使用标题

如果您尝试在此处实现某种多租户,我还可以建议为每个存储库使用不同的子域,然后添加midleware / filter / etc以根据请求子域解析存储库。您可以自动创建子域(大多数流行的提供商都有API来执行此操作)