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

时间:2013-12-12 17:44:42

标签: asp.net-mvc http rest

我创建了一个搜索表单来查找MVC网站上的帖子。

表单类型应该是POST还是GET?

我知道获取可以为搜索添加书签等等。

使用GET的任何缺点?

谢谢你, 米格尔

4 个答案:

答案 0 :(得分:1)

使用GET动词,参数将在URL上,GET没有http请求正文。使用POST时,参数位于请求正文中。使用GET是好的,因为用户可以复制/粘贴此路径并在任何地方共享。我常常在这种approuch中使用GET。

no limit for arguments on the URL of http

The HTTP protocol does not place any a priori limit on the length of a URI. Servers MUST be able to handle the URI of any resource they serve, and SHOULD be able to handle URIs of unbounded length if they provide GET-based forms that could generate such URIs. A server SHOULD return 414 (Request-URI Too Long) status if a URI is longer than the server can handle (see section 10.4.15).

但是作为Jasen评论,浏览器可以有限制。

无论如何,使用GETPOST,当您使用此类approuch搜索数据库时,请记住使用方法请避免sql injection。如果你要去ado.net, use Parameters。如果您正在使用ORM它会照顾您。

答案 1 :(得分:1)

尽管GET是查询数据的更常规解决方案,但在许多情况下,GET太局限了,无法执行/search

问题的实质是一个GET没有请求正文,因此,它无法处理更复杂的请求。本质上,GET只能使用URL发送数据。 URL可以包含路径参数和查询参数,它们只是一组键值对,其中键和值均为string类型。

相比之下,POST还可在其主体中携带整个JSON文档。通过将自己限制为GET我们无法使用任何这些JSON功能,结果,我们无法将适当的对象或数组发送到后端。

语义真的有多有价值?为了遵守命名约定,我们是否应该遵循可能导致技术债务的变通办法?

问题案例的例子

如上所述,可能的问题之一是它无法处理数组

例如,在网上商店中,您希望用户以列表形式展示产品目录。您想让您的用户能够使用复选框过滤列表来选择许多供应商。这将导致诸如selectedVendors = ["vendorA", "vendorB"]之类的数组。

如果我们想遵守使用GET的约定,那么我们必须找到一种可接受的解决方法,该解决方法使我们可以在不使用请求正文的情况下将供应商列表发送到后端。

解决方法1

只有查询参数可供使用时,可以将其建模为一堆布尔值:includeVendorAincludeVendorB,...

不幸的是,这很难维护且难以记录。

解决方法2

前端实际上可以执行多个查询。 即

  • 首先为供应商A(/search?vendor=VendorA
  • 然后是vendorB(/search?vendor=VendorB)的那些
  • 然后最后将所有结果重新合并到一个列表中。

首先,它会降低性能,因为它需要多次往返。但是第二,它也破坏了支持分页的能力。

解决方法3

将增量索引添加到查询参数名称中。 (例如/search?vendor1=VendorA&vendor2=VendorB

同样,难以记录,并且OpenAPI也不支持。

最后

如果我们只接受POST更适合/search,那么我们就不需要这些解决方法。

答案 2 :(得分:0)

除非您要修改数据,否则我会使用GET。如果您总是获取数据而不是操纵数据,我认为没有任何缺点。

答案 3 :(得分:0)

搜索不一定是帖子,你试图获取一些数据,而不是修改或插入。