rest - 在设计 REST API 时,是否可以要求在允许创建资源之前完成对资源的搜索?
问题描述
在现实世界中,可以想象两个人的姓、名和出生日期相同。
但是,在中等规模的数据库中,它更有可能是同一个人的复制品。为了防止创建重复项,我们的用户界面要求用户首先搜索此人。如果他们想要的记录存在,用户可以选择它。如果没有,他们可以添加它。如果需要,他们可以添加具有相同姓名和出生日期的人员 - 但通常,他们需要现有记录。
关键是,API 应该允许用户创建新记录,但理想情况下,我想要求他们先搜索。
在 API 情况下,我希望能够要求用户先搜索,然后在必要时添加,但我不确定 API 通常如何处理这种情况。通常会做什么?
解决方案
因为其余的架构风格使用无状态请求,所以你不能在这里真正做你所要求的。
也就是说,您可能会想象一个网站会引导您完成域应用程序协议:您获取一个带有书签的 URL;该页面包含一个链接,您可以通过该链接访问搜索表单;您提交带有搜索条件的表单,它会返回一个可能匹配的列表和一个链接;点击链接将您带到“创建新记录”表格;用户提交此表单以请求服务器创建新用户。
但从语义上讲,最后一个请求与将“创建新记录”URL 硬编码到其中的客户端生成的请求没有什么不同。
您可以通过将信息编码到其中来使该 URL 更难猜测。例如,在搜索过程中,您可以将关键搜索词编码到 URL 中,将它们传递给表单并最终传递给表单提交,此时您可以检查提交的记录详细信息是否与之前的搜索匹配。
超媒体 API 的优点之一是,由于客户端不使用 URI 拼写的语义,服务器可以将信息编码到这些 URI 中以供以后使用。不幸的是,超媒体约束作为对“RESTful”API 的约束难以获得人们的关注。当然,这种设计实际上并不能保护您免受真正善于猜测的客户的侵害。
推荐阅读
- java - 将 MainActivity parsingJSON 转换为 Fragment
- powershell - New-AzureRmVM:无法使用指定的命名参数解析参数集
- sql - 如何从 postgresql 中的数组中排除?
- php - 将封闭的撇号替换为 HTML 标记,但不在内部
blocks
- linqpad - 在 OrmLite / Servicestack / Linqpad 中使用 join 时值不能为空
- django - Django Rest Framework:字段名称“likes”对模型“userPost”无效配置不正确
- for-loop - 如何使用应用程序脚本在谷歌工作表中每三行数字插入两行
- nginx - Nginx slim框架一直指向根文件夹中的主索引
- python - Pandas Dataframe nan 值不替换
- javascript - 如何在Angular 6的Angular Material Dialog中将数据传递给afterClosed()