代码之家  ›  专栏  ›  技术社区  ›  Thomas Owens

你什么时候使用post,什么时候使用get?

  •  307
  • Thomas Owens  · 技术社区  · 16 年前

    据我所知,有三类:

    1. 从不使用 GET 使用 POST
    2. 从不使用 使用 得到
    3. 你用哪一个无关紧要。

    我假设这三种情况是正确的吗?如果是这样,每个案例中的一些例子是什么?

    27 回复  |  直到 6 年前
        1
  •  332
  •   vs97    6 年前

    使用 POST 对于破坏性的行为,比如创建(我知道这很讽刺)、编辑和删除,因为你不能点击 浏览器地址栏中的操作。使用 GET 在安全的情况下,允许某人发起行动。这样的URL像:

    http://myblog.org/admin/posts/delete/357
    

    应该带您到确认页面,而不是简单地删除项目。这样避免事故要容易得多。

    也比 得到 ,因为您没有将信息粘贴到URL中。所以使用 得到 作为 method 对于一个收集密码或其他敏感信息的HTML表单,这不是最好的主意。

    最后一个注意事项: 传输的信息量大于 得到 . '“post”对传输的数据没有大小限制,而“get”限制为2048个字符。

        2
  •  187
  •   Nam G VU    8 年前

    简而言之

    • 使用 GET 对于 safe and idempotent 请求
    • 使用 POST 对于 neither safe nor idempotent 请求

    细节上 每个人都有一个合适的地方。即使你不跟随 RESTful 从学习REST和资源导向方法的工作原理中,可以学到很多东西。

    RESTful应用程序将 use GETs 对于两种操作 安全和等幂 .

    safe 操作是这样的操作 not change the data 请求。

    idempotent 操作的结果将 be the same 不管你要求多少次。

    这是有道理的,因为get用于 安全的 操作它们也自动 幂等元 . 通常,get用于检索资源(例如,堆栈溢出时的问题及其相关答案)或资源集合。

    一个安静的应用程序将使用 PUTs 用于以下操作: not safe but idempotent .

    我知道这个问题是关于GET和POST的,但我会马上返回到POST。

    通常,Put用于编辑资源(例如,在堆栈溢出时编辑问题或答案)。

    将用于以下任何操作: neither safe or idempotent .

    通常,一篇文章会被用来创建一个新的资源,例如创建一个新的SO问题(尽管在某些设计中,一个Put也会被用于这个问题)。

    如果你把这篇文章写了两遍,你就会产生两个新问题。

    还有一个删除操作,但我想我可以把它留在这里:)

    讨论

    实际上,现代Web浏览器通常只支持可靠的get和post(您可以通过javascript调用执行所有这些操作,但是在表单中输入数据和按submit键时,通常有两个选项)。在一个RESTful应用程序中,post通常被重写,以提供put和delete调用。

    但是,即使您不遵循RESTful原则,从使用GET检索/查看信息和使用POST创建/编辑信息的角度考虑也是很有用的。

    您不应该将get用于更改数据的操作。如果一个搜索引擎搜索到一个链接到你的恶意操作,或客户端书签,它可能会带来很大的麻烦。

        3
  •  72
  •   Douglas Leeder    16 年前

    如果您不介意请求被重复(即它不会改变状态),请使用get。

    如果操作确实更改了系统状态,请使用POST。

        4
  •  64
  •   icktoofay pcp    12 年前

    短版

    GET:通常用于已提交的搜索请求,或任何希望用户能够再次调出准确页面的请求。

    GET的优点:

    • URL可以安全地加入书签。
    • 可以安全地重新加载页面。

    GET的缺点:

    post:用于更高安全性的请求,其中数据可用于更改数据库或不希望有人添加书签的页面。

    岗位优势:

    • 名称-值对不显示在URL中。(安全+= 1)
    • 可以通过post传递无限数量的名称-值对。 Reference.

    岗位劣势:

    • 使用日志数据的页面不能是书签。(如果你愿意的话。)

    较长版本

    直接从 Hypertext Transfer Protocol -- HTTP/1.1 :

    9.3得到

    get方法意味着检索请求URI标识的任何信息(以实体的形式)。如果请求URI引用的是数据生成过程,则它是作为响应中的实体而不是进程的源文本返回的生成数据,除非该文本恰好是进程的输出。

    如果请求消息包含if-modified-since、if-unmodified-since、if-match、if-none-match或if-range-header字段,则get方法的语义将更改为“条件get”。条件获取方法请求仅在条件头字段描述的情况下传输实体。条件获取方法旨在通过允许刷新缓存实体而不需要多个请求或传输客户机已持有的数据来减少不必要的网络使用。

    如果请求消息包含范围头字段,则get方法的语义将更改为“部分get”。如第14.35节所述,部分GET请求只转移实体的一部分。部分获取方法旨在通过允许完成部分检索的实体而不传输客户机已持有的数据来减少不必要的网络使用。

    只有在满足第13节中描述的HTTP缓存要求的情况下,对GET请求的响应才可缓存。

    表格使用时的安全注意事项见第15.1.3节。

    9.5柱

    post方法用于请求源服务器接受 作为资源的新下属包含在请求中的实体 由请求行中的请求URI标识。岗位设计 允许统一的方法涵盖以下功能:

    • 现有资源的注释;

    • 向公告板、新闻组、邮件列表发送邮件, 或类似的一组物品;

    • 提供数据块,例如提交 形成一个数据处理过程;

    • 通过追加操作扩展数据库。

    post方法执行的实际功能由 服务器和通常依赖于请求URI。已发布的实体 以文件的从属方式从属于该URI 对于包含它的目录,新闻文章从属于 它被发布到的新闻组,或者记录隶属于 数据库。

    post方法执行的操作可能不会导致 可以由URI标识的资源。在这种情况下,要么是200 (OK)或204(无内容)是适当的响应状态, 取决于响应是否包含 描述结果。

        5
  •  27
  •   Vucko    8 年前

    最重要的是 意思 GeT与Post之比:

    • get应该用于…得到…一些信息 服务器,
    • 而post应该用来发送一些信息 服务器。


    在此之后,可以注意到以下几点:

    • 使用get,用户可以在浏览器中使用“后退”按钮,并且可以为页面添加书签。
    • 可以作为get传递的参数的大小有限制 (对于某些版本的Internet Explorer,如果我没有弄错的话,为2KB) ;POST的限制要大得多,通常取决于服务器的配置。


    不管怎样,我不认为没有get我们可以“生存”:想想每天有多少URL与查询字符串中的参数一起使用--如果没有get,所有这些都将不起作用;-)

        6
  •  11
  •   Mark Byers    15 年前

    除了许多Web浏览器中的长度约束差异之外,还有一个语义差异。get应该是“安全的”,因为它们是只读操作,不会更改服务器状态。帖子通常会改变状态,并在重新提交时发出警告。搜索引擎的网络爬虫可能会发GET,但不应该发帖子。

    如果要在不更改状态的情况下读取数据,请使用get;如果要更新服务器上的状态,请使用post。

        7
  •  8
  •   tvanfosson    16 年前

    我的一般经验法则是在向服务器发出不改变状态的请求时使用GET。日志是为更改状态的服务器请求保留的。

        8
  •  8
  •   ceejayoz    15 年前

    一个实际的区别是浏览器和Web服务器对URL中可以存在的字符数有限制。从应用程序到应用程序,这是不同的,但如果你有 textarea 在你的表格中。

    另一个gotcha与get-他们得到索引的搜索引擎和其他自动系统。谷歌曾经有一个产品可以在你浏览的页面上预先获取链接,所以如果你点击这些链接,它们的加载速度会更快。它引起 专业 破坏有链接的网站 delete.php?id=1 -人们失去了整个网站。

        9
  •  7
  •   Kyle Cronin    16 年前

    如果希望URL反映页面状态,请使用get。这对于查看动态生成的页面很有用,如这里看到的页面。应该在表单中使用一个日志来提交数据,比如当我单击“发布您的答案”按钮时。它还生成一个更清晰的URL,因为它不会在路径之后生成参数字符串。

        10
  •  5
  •   davenpcj    16 年前

    因为get是纯粹的URL,所以它们可以被Web浏览器缓存,并且可以更好地用于像一致生成的图像这样的事情。(设置到期时间)

    Gravatar页面中的一个示例: http://www.gravatar.com/avatar/4c3be63a4c2f539b013787725dfce802?d=monsterid

    get可能会稍微提高性能,一些Web服务器在调用处理程序之前将post内容写入临时文件。

    另一个需要考虑的是大小限制。get的上限是url的大小,标准是1024字节,但浏览器可能支持更多。

    传输更多的数据应该使用一个日志来获得更好的浏览器兼容性。

    正如另一个海报所写,即使低于这个限制也是一个问题,URL中的任何内容最终都可能出现在浏览器用户界面的其他部分,比如历史。

        11
  •  4
  •   Gili    15 年前

    你自己什么都做不了。关键是你不是 想象上的 修改HTTP GET上的服务器状态。HTTP代理假定,由于HTTP GET不修改状态,因此用户调用HTTP GET一次还是1000次都没有区别。使用这些信息,他们认为返回第一个HTTP GET的缓存版本是安全的。如果您违反了HTTP规范,就有可能在野外破坏HTTP客户机和代理。不要这样做:

        12
  •  4
  •   MrBoJangles hugomg    13 年前

    这就进入了REST的概念,以及Web是如何被使用的。有一个优秀的 podcast 在软件工程无线电上,对GET和POST的使用进行了深入的讨论。

    get用于从服务器中提取数据,不需要执行更新操作。其思想是,您应该能够反复使用相同的GET请求,并返回相同的信息。URL在查询字符串中包含get信息,因为它的目的是能够轻松地发送到其他系统和人员,比如在哪里找到某个东西的地址。

    post应该被用于(至少是Web所基于的REST体系结构)将信息推送到服务器/告诉服务器执行操作。例如:更新此数据,创建此记录。

        13
  •  4
  •   oɔɯǝɹ    10 年前

    1.3选择HTTP的快速检查表 GET POST

    使用get IF:

        The interaction is more like a question (i.e., it is a safe operation such as a query, read operation, or lookup).
    

    使用POST:

        The interaction is more like an order, or
        The interaction changes the state of the resource in a way that the user would perceive (e.g., a subscription to a service), or
        The user be held accountable for the results of the interaction.
    

    Source .

        14
  •  3
  •   ceejayoz    16 年前

    我不认为使用get-though有问题,我将它用于简单的事情,在这些事情上保持查询字符串是有意义的。

    使用它更新状态-就像 delete.php?id=5 删除页面-是非常危险的。人们发现,当谷歌的网络加速器开始预取网页上的网址时,它会点击所有的“删除”链接,并删除人们的数据。搜索引擎蜘蛛也会发生同样的事情。

        15
  •  3
  •   cherouvim    15 年前

    post可以移动大数据,而get不能。

    但一般来说,这不是关于GET的一个缺点,而是一个惯例,如果你希望你的网站/webapp表现良好的话。

    看一看 http://www.w3.org/2001/tag/doc/whenToUseGet.html

        16
  •  3
  •   Dmytro    15 年前

    RFC 2616 :

    九点三 得到
    get方法意味着检索任何信息(以 实体)由 请求URI。如果请求URI引用 对于一个数据生成过程,它是 应返回的生产数据 作为回应中的实体而不是 进程的源文本,除非 该文本恰好是 过程。


    九点五
    post方法用于请求源服务器 接受包含在 请求作为 请求URI标识的资源 在请求行中。岗位设计 允许统一的方法覆盖 以下功能:

    • 现有资源的注释;
    • 向公告板、新闻组、邮件列表或 同类物品;
    • 向 数据处理过程;
    • 通过追加操作扩展数据库。

    执行的实际功能 Post方法由 服务器,通常依赖于 请求URI。发布的实体是 从属于同一个URI 文件从属于 包含它的目录,一条新闻 文章隶属于新闻组 或者记录被发布到 从属于数据库。

    邮局的行动 方法可能不会产生资源 可以通过一个URI来识别。在 本例为200(正常)或204(否 内容)是适当的回答 状态,取决于是否 响应包括一个实体 描述结果。

        17
  •  2
  •   Gajendrasinh Chauhan JonasG    10 年前

    当我不希望人们看到查询字符串或当查询字符串变大时,我使用post。另外,文件上传需要post。

    我不认为使用get-though有什么问题,我将它用于简单的事情,在这些事情上保持查询字符串是有意义的。

    使用GET将允许链接到一个特定的页面,也可以链接到无法使用POST的页面。

        18
  •  2
  •   Pang Ajmal PraveeN    6 年前

    post-get-put-delete的简单版本

    • 使用get-当您想要基于任何ID或名称获取任何资源(如数据列表)时
    • 当您想向服务器发送任何数据时,请使用post。请记住,post是一个重量级的操作,因为更新时我们应该使用put而不是post。 内部发布将创建新资源
    • 使用Put-当你
        19
  •  1
  •   Chris Miller    16 年前

    最初的意图是,GET用于获取数据,而POST则是任何东西。我使用的经验法则是,如果我要将任何东西发送回服务器,我就使用post。如果我只是调用一个URL来获取数据,我使用get。

        20
  •  1
  •   Gordon Haim Evgi    15 年前

    阅读 article about HTTP in the Wikipedia . 它将解释协议是什么以及它的作用:

    得到

    请求指定资源的表示形式。请注意,GET不应用于导致副作用的操作,例如使用它在Web应用程序中执行操作。其中一个原因是GET可以被机器人或爬虫任意使用,不需要考虑请求所引起的副作用。

    将要处理的数据(例如,从HTML表单)提交到标识的资源。数据包含在请求的主体中。这可能导致新资源的创建或现有资源的更新,或两者兼而有之。

    W3C有一个名为 URIs, Addressability, and the use of HTTP GET and POST 这就解释了什么时候使用什么。引用

    1.3选择HTTP GET或POST的快速检查表

    • 使用get IF:
      • 互动更像是一个问题(即,它是一个 安全操作,如查询、读取操作或查找)。

    • 使用POST:
      • 交互更像是一个命令,或者
      • 交互以用户感知的方式改变资源的状态(例如,订阅服务),或者 o用户应对互动的结果负责。

    但是,在最终决定使用HTTP GET或POST之前,请考虑敏感数据的考虑因素和实际考虑因素。

    无论何时提交HTML表单,都是一个实践示例。您可以指定 邮递 得到 对于窗体操作。PHP将相应地填充$\u get和$\u post。

        21
  •  1
  •   atiquratik jaywon    10 年前

    在PHP中, POST 数据限制通常由 php.ini . GET 受服务器/浏览器设置的限制-通常在 255 字节。

        22
  •  1
  •   Benjamin W.    9 年前

    w3schools.com :

    什么是HTTP?

    超文本传输协议(HTTP)设计为 客户端和服务器之间的通信。

    HTTP作为客户机和服务器之间的请求-响应协议工作。

    Web浏览器可以是客户端,也可以是计算机上 主机网站可能是服务器。

    示例:客户端(浏览器)向服务器提交HTTP请求; 然后服务器返回对客户机的响应。反应 包含有关请求的状态信息,也可以包含 请求的内容。

    两种HTTP请求方法:GET和POST

    客户机和 服务器是:获取和发布。

    从指定的资源日志获取请求数据将数据提交到 被处理到指定的资源

    在这里,我们区分了主要区别:

    enter image description here

        23
  •  0
  •   prodigitalson    15 年前

    一件重要的事情就是你提交的任何东西 GET 将通过URL公开。其次,正如ceejayoz所说,URL的字符是有限制的。

        24
  •  0
  •   Plynx    15 年前

    另一个区别是,POST通常需要两个HTTP操作,而GET只需要一个。

    编辑:我应该澄清——对于常见的编程模式。一般来说,用一个笔直的HTML网页来回复一篇文章是一个有问题的设计,原因有很多,其中之一就是令人恼火的“你必须重新提交这个表单,你想这样做吗?”按下后退按钮。

        25
  •  0
  •   Elizabeth Buckwalter    15 年前

    正如其他人回答的那样,GET对URL大小有限制,文件只能通过POST提交。

    我想再加一个 可以 使用get向数据库添加内容,并使用post执行操作。当一个脚本收到一个帖子或一个GET,它可以做作者想要它做的任何事情。我认为缺乏理解是因为你选择的措辞或者你是如何阅读的。

    剧本作者 应该 使用posts更改数据库,使用get仅检索信息。

    脚本语言提供了许多访问请求的方法。例如,php允许使用 $_REQUEST 获取一个帖子或一个GET。我们应该避免这种情况,而应该更具体地说 $_GET $_POST .

    在Web编程中,有更多的解释空间。这是什么 应该 什么? 可以 是的,但哪一个更好往往会引起争论。幸运的是,在这种情况下,没有歧义。你 应该 使用日志更改数据,而您 应该 使用get检索信息。

        26
  •  0
  •   atiquratik jaywon    10 年前

    Gorgapor mod_rewrite 仍然经常利用 GET . 它只允许将更友好的URL转换为具有 得到 查询字符串。

        27
  •  -1
  •   mythz    15 年前

    HTTP Post数据对数据量没有指定的限制,因为不同的浏览器对GET有不同的限制。RFC2068声明:

    服务器应该谨慎 取决于超过255的URI长度 字节,因为某些旧客户端或 代理实现可能不正确 支撑这些长度

    具体地说,您应该为它们的用途提供正确的HTTP构造。HTTP GET不应该有副作用,可以通过HTTP代理等安全地刷新和存储。

    当您要根据URL资源提交数据时,将使用HTTP Post。

    使用HTTP GET的一个典型示例是搜索,即搜索?查询= MI+查询 使用HTTPPOST的一个典型示例是向在线表单提交反馈。