0

我有一个 API 可以自定义搜索超过六个字段,类似于以下内容,但也可能包含敏感数据,因为我在其他地方对相同类型的搜索使用相同的方法

  • 用户名
  • 电子邮件
  • 部门

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

GET /user
GET /user/1

但是,对于搜索,我对如何允许这样做感到有些困惑。我的初衷是在请求正文中使用 JSON,例如

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

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

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

我看到的选项

使用标题

这似乎是标头的“错误”使用,但也是最接近原始请求正文的

在 URL 中使用参数

例如

GET /user?username=someuser&department=sales

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

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

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

使用不同的 HTTP 动词

我可以使用 POST 或其他一些动词,它们会起作用,但违反直觉,并且与 RESTful 方法(据我所知)和我自己在项目中的标准背道而驰,因此可能会造成混淆。

有没有其他人遇到过这个?处理它的“官方”或最佳方式是什么?

4

1 回答 1

1

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

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

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

public ActionResult Search(string userName = "", int departmentId = 0)
{
    ...
}
于 2016-02-18T17:08:56.733 回答