我创建了一个搜索表单来查找 MVC 站点上的帖子。
表单类型应该是 POST 还是 GET?
我知道 get 可以为搜索添加书签等等。
使用 GET 有什么缺点吗?
谢谢你,
米格尔
最佳答案
即使 GET
是查询数据的更传统的解决方案,在很多情况下 GET
太有限,无法执行 /search
.
问题的本质,在于 GET
没有请求正文 ,因此它无法处理更复杂的请求。本质上是一个 GET
只能使用 URL 发送数据。 URL 可以包含路径参数和查询参数,它们只是一组键值对,其中键和值都属于 string
类型。
相比之下,POST
此外还可以在其主体中携带整个 JSON 文档。通过将自己限制在 GET
, 我们不能使用任何这些 JSON 功能 ,因此我们无法将正确的对象或数组发送到我们的后端。
语义到底有多大值(value)?我们是否应该遵循可能导致技术债务的解决方法,只是为了遵守命名约定?
问题案例示例
如上所述,可能出现的问题之一是 它无法处理数组 .
例如,在网上商店中,您希望用户展示以列表形式展示的产品目录。您希望让您的用户能够使用复选框过滤列表来选择多个供应商。它会产生一个数组,例如 selectedVendors = ["vendorA", "vendorB"]
.
如果我们想尊重使用 GET
的约定,然后我们必须找到一种可接受的解决方法,允许我们在不使用请求正文的情况下将供应商列表发送到后端。
解决方法 1
只有查询参数可供您使用,可以将其建模为一堆 bool 值:includeVendorA
, includeVendorB
, ...
不幸的是,这很难维护且难以记录。
解决方法 2
前端实际上可以执行多个查询。
IE。
/search?vendor=VendorA
), /search?vendor=VendorB
) 首先,它有性能损失,因为它需要多次往返。但其次,它也打破了支持分页的能力。
解决方法 3
将增量索引添加到您的查询参数名称。 (例如
/search?vendor1=VendorA&vendor2=VendorB
)同样,难以记录,OpenAPI 也不支持。
最后
如果我们可以接受
POST
更适合/search
,那么我们不需要任何这些解决方法。2021 年更新
专门用于通过
GET
发送数组,目前还没有一个标准。然而,框架和语言正在慢慢转向事实上的标准:/search?vendor[]=VendorA&vendor[]=VendorB
.GET
的一个更具体的缺点,将是对条件过滤器建模的能力:(例如,在票务系统中:“给我 X 人创建的所有票和 X 人关闭的所有票”,或在网上商店:“给我所有打折产品和所有产品免费送货”)。它们转换为混合使用 AND
的数据库查询和 OR
声明。
关于.net - 在搜索表单中发布或获取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20550514/