API 中的自定义搜索

Custom search in an API

我有一个 API 自定义搜索超过六个字段,大致如下,但也可能包含敏感数据,因为我在其他地方使用相同的方法进行相同类型的搜索

我通常使用 RESTful 方法,因此对于用户列表或单个用户,检索用户类似于以下内容

GET /user
GET /user/1

但是,对于搜索,我有点困惑如何允许这样做。我的初衷是在请求body中使用JSON,eg

{
    "username": "someuser",
    "department": "sales"
}

我不能使用请求 body,因为它看起来合乎逻辑(并且我用于 POST 等操作),因为 Chrome 不支持它据我所知(或者至少不是我们用于测试的 PostMan 插件)

因此,执行此搜索的最佳方式是什么?

我看到的选项

使用一个header

这似乎是 "wrong" 对 header 的使用,但也最接近原始请求 body

在URL

中使用参数

例如

GET /user?username=someuser&department=sales

但这对控制器(使用 C# Web API)造成混乱,因为我不能将项目留空。所以请求会更像这样,除非我有大量重写的方法来处理不同的排列。这似乎...凌乱

GET /user?username=someuser&email=&firstname=&lastname=&department=

也许更重要的是,它留下了太多的可见性 "over the shoulder":这是在医疗保健环境中,虽然不可避免地会出现一些东西,但我宁愿将其保持在最低限度(数据本身自然在传输过程中经过 SSL 加密)

使用不同的 HTTP 动词

我可以使用 POST 或其他一些动词,这会起作用但是 counter-intuitive 并且违背了 RESTful 方法(据我所知)和我自己的方法项目中的标准,因此可能会造成混淆。

还有其他人 运行 参与其中吗? "official" 或最佳处理方法是什么?

没有真正的 "official" 方法。在这种情况下,我会稍微改变 REST 的规则,只使用 post,传递一个主体就是 POST-methods 的目的。

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

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

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