【问题标题】:HTTP POST v/s HTTP GETHTTP POST 与 HTTP GET
【发布时间】:2016-05-06 18:17:17
【问题描述】:

我想从前端(Angular)到后端进行数据库查询。但我需要为此发送很多参数。

据我了解,如果我们不进行任何数据库更改,最好使用 GET,因为它使用缓存条目。如果我们需要在服务器/数据库上进行更改,应该使用 POST。

但是如果我想发送许多参数(有些是序列化对象)并且不进行服务器端更改,那么在这种情况下使用 POST 请求并将所有参数嵌入到 POST 正文中而不是发送一个巨大的 URL 编码是否可以? GET 请求?

【问题讨论】:

    标签: angularjs node.js http post get


    【解决方案1】:

    首先要澄清这一点:responses to POST requests can be cached,只要源服务器返回正确的缓存响应标头即可。但是,浏览器和代理服务器通常不会对 POST 请求应用缓存。

    话虽如此,通过正确的编码,您可以在大约 2 KB 的查询字符串中存储大量信息,因此 GET 应该是可行的方法。

    如果您确定您将超出 GET 请求的限制,并且您需要在保持可缓存的同时采用 POST 方式,您可以引入一种“nonce”,例如使用搜索参数:

    1. 客户端使用搜索参数对/search 进行 POST。
    2. 服务器将参数存储在某处,例如数据库中。
    3. 服务器根据参数生成随机数,例如通过散列搜索参数或行 ID。
    4. 服务器将客户端重定向到该随机数的结果页面:/search/123abc
    5. 客户端请求/search/123abc搜索结果页面。
    6. 服务器根据 nonce 执行搜索,并返回可缓存的响应。

    这将引入一个额外的 HTTP 往返,但启用缓存跨浏览器和通过代理服务器。

    【讨论】:

    • 好方法。它也给了我一个不同的想法。使用 btoa(developer.mozilla.org/en-US/docs/Web/API/WindowBase64/btoa) 对参数的字符串化对象进行编码,并将编码后的数据作为参数发送到 GET 请求中。在服务器上,解码参数并解析参数并完成工作。这个怎么样?
    • 这将为我们节省一次往返,这是您方法中的一个警告。
    • 是的,当然,额外的往返是一个缺点,但它可以实现您想要的:响应可缓存的大型请求。如何正确编码您的搜索参数完全是一个不同的问题,并且很大程度上取决于这些参数的性质。许多字符串和数字不能很好地编码成更小的格式,而许多布尔值却可以。
    【解决方案2】:

    我认为您应该在这种情况下使用更易于管理且看起来干净的帖子。要获得更多帖子的好处,请点击以下链接:

    【讨论】:

    • “更易于管理且看起来很干净” 并不是您在构建软件时要寻找的真正正确定义的属性,link-only answers aren't answers。请明确说明 POST 如何比 GET“更易于管理”。
    • 您可以在您的情况下同时使用 get 和 post,从您的问题来看,您似乎对 get 和 post 有很好的了解,但我只是根据我的经验给出了我的意见。可管理的意思是您可以随时轻松更改字段名称,而不必为获取请求制作大字符串,而干净的意思是您的代码中不会有大而难看的请求字符串。我也可能在评论部分给出了我的答案,但我现在不能这样做。让我知道你的想法。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    相关资源
    最近更新 更多