API 中的自定义搜索
本文关键字:搜索 自定义 API | 更新日期: 2023-09-27 18:35:11
我有一个 API,其中包含对六个字段的自定义搜索,大致如下,尽管也可能包括敏感数据,因为我在其他地方对相同类型的搜索使用相同的方法
- 用户名
- 电子邮件
- 名
- 姓氏
- 部门
我通常使用 RESTful 方法,因此对于用户列表或单个用户,检索用户将如下所示
GET /user
GET /user/1
但是,对于搜索,我对如何允许此操作感到有些困惑。我的初衷是在请求正文中使用JSON,例如
{
"username": "someuser",
"department": "sales"
}
不过,我不能按照看起来合乎逻辑的方式使用请求正文(并且因为我用于 POST 等操作),因为据我所知,Chrome 不支持它(或者至少不支持我们用于测试的 PostMan 插件)
因此,执行此搜索的最佳方法是什么?
我看到的选项
使用标头
这似乎是标头的"错误"使用,但也是最接近原始请求正文的
在网址中使用参数
例如
GET /user?username=someuser&department=sales
但是控制器(使用 C# Web API)会变得混乱,因为我不能将项目留空。所以请求会更像这样,除非我有大量被覆盖的方法来处理不同的排列。这似乎...混乱
GET /user?username=someuser&email=&firstname=&lastname=&department=
也许更重要的是,它留下了太多可见的"肩膀":这是在医疗保健环境中,虽然不可避免地会显示东西,但我宁愿将其保持在最低限度(数据本身自然是在传输过程中进行SSL加密的)
使用不同的 HTTP 谓词
我可以使用 POST 或其他一些动词,这些动词可以工作,但违反直觉,并且违背了 RESTful 方法(据我所知)和我自己在项目中的标准,因此可能会令人困惑。
还有其他人遇到过这种情况吗?什么是"官方"或最好的处理方式?
没有真正的"官方"方式。在这种情况下,我只是稍微改变一下 REST 的规则,只使用一个帖子,传入一个正文就是 POST 方法的用途。
关于Chrome不支持:这在Chrome和PostMan扩展中完全支持(您需要选择一个POST方法并为正文选择原始选项,然后选择JSON)
另一方面,查询字符串也可能是一个不错的选择。您可以通过在控制器中使用默认参数来获得空项:
public ActionResult Search(string userName = "", int departmentId = 0)
{
...
}