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 方法(据我所知)和我自己在项目中的标准,因此可能会令人困惑。

还有其他人遇到过这种情况吗?什么是"官方"或最好的处理方式?

API 中的自定义搜索

没有真正的"官方"方式。在这种情况下,我只是稍微改变一下 REST 的规则,只使用一个帖子,传入一个正文就是 POST 方法的用途。

关于Chrome不支持:这在Chrome和PostMan扩展中完全支持(您需要选择一个POST方法并为正文选择原始选项,然后选择JSON)

另一方面,查询字符串也可能是一个不错的选择。您可以通过在控制器中使用默认参数来获得空项:

public ActionResult Search(string userName = "", int departmentId = 0)
{
    ...
}