.net - 在搜索表单中发布或获取?

标签 .net asp.net-mvc rest http

我创建了一个搜索表单来查找 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。

  • 首先获取 vendorA 的那些 ( /search?vendor=VendorA ),
  • 然后是 vendorB ( /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/

    相关文章:

    javascript - "SyntaxError: Unexpected token < in JSON at position 0"

    java - Liferay 7 - 使用 REST Web 服务的最简单方法不起作用

    .net - 在 RichTextBox 中隐藏超链接 URL(Windows 窗体)

    .net - EntityFramework .net 4 用一个简单的方法更新实体

    .net - 如何在另一个线程中打开打印对话框

    c# - 比较两个数组并返回它们的余数

    javascript - 如何取消发布 Mvc 的请求?

    angularjs - Angular 和 CORS

    c# - ViewContext.RouteData.Values ["Controller"]始终为空-Asp.Net Core 2.1

    asp.net-mvc - 从 _Layout.cshtml 重定向到另一个页面