GET请求和POST请求的区别

本文深入探讨了GET和POST请求的区别,包括安全性、幂等性、缓存能力及数据大小限制,揭示了这两种请求方法在实际应用中的独特价值与应用场景。

GET请求和POST请求的区别

原文链接:链接

经常遇到「既然GET请求可以做POST请求的事情,为什么还要区分GET和POST而不只使用一个请求?」的问题。作为在实际中被使用最广的两个请求方法,这个问题其实挺难回答的,但万物总有其根由,今天就追根究底。

查看RFC规范再加上之前查过的一些二手文章,整理了如下的观点:

  1. GET 被强制服务器支持

  2. 浏览器对URL的长度有限制,所以GET请求不能代替POST请求发送大量数据

  3. GET请求发送数据更小

  4. GET请求是安全的

  5. GET请求是幂等的

  6. POST请求不能被缓存

  7. POST请求相对GET请求是「安全」的

GET被强制服务器支持

All general-purpose servers MUST support the methods GET and HEAD. All other methods are OPTIONAL.

GET 通常用于请求服务器发送某个资源。在HTTP/1.1中,要求服务器实现此方法;POST请求方法起初是用来向服务器输入数据的。在HTTP/1.1中,POST方法是可选被实现的,没有明确规定要求服务器实现。

浏览器对URL的长度有限制,所以GET请求不能代替POST请求发送大量数据

RFC 2616 (Hypertext Transfer Protocol — HTTP/1.1) states in section 3.2.1 that there is no limit to the length of an URI (URI is the official term for what most people call a URL)

RFC 2616 中明确对 uri 的长度并没有限制。不过虽然在RFC中并没有对uri的长度进行限制,但是各大浏览器厂家在实现的时候限制了URL的长度,可查到的是IE对长度限制为2083;而chrome遇到长度很长的URL时,会直接崩溃

所以这条结论算是正确的。

GET请求发送数据更小

只能通过写代码验证了:下面第一个文件是服务器代码,作用是在客户端发送GET和POST请求的时候返回200状态码。第二个文件是客户端HTML文件,点击两个button,分别发送GET请求和POST请求。

import koa from 'koa'
import fs from 'mz/fs'


const app = koa()

app.use(function* (next) {
  if(this.path == '/test')
    return this.status = 200

  yield next
})

app.use(function* (next) {
  this.type = 'html'
  this.body = yield fs.readFile('./index.html')
  yield next
})

app.listen(8080)
console.log('koa server port: 8080')
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<button id="get">GET</button>
<button id="post">POST</button>
</body>
<script>
  function http(type) {
    return function (url) {
      var req = new XMLHttpRequest()
      req.open(type, url)

      req.send()
    }
  }

  var getDom = document.getElementById('get')
    , postDom = document.getElementById('post')
    , get = http('GET')
    , post = http('POST')


  getDom.addEventListener('click', function () {
    get('/test')
  })

  postDom.addEventListener('click', function () {
    post('/test')
  })


</script>
</html>


从上两张图可以看到POST请求的headers要比GET请求多了两个属性。所以这条结论其实也算是对的,不过从请求发送时间来看的话,其实两者并没有差别。


GET请求是安全的

Of the request methods defined by this specification, the GET, HEAD,OPTIONS, and TRACE methods are defined to be safe.

这里的安全指的是在规范的定义下,Get操作不会修改服务器的数据

GET请求是幂等的

A request method is considered "idempotent" if the intended effect on
the server of multiple identical requests with that method is the
same as the effect for a single such request. Of the request methods
defined by this specification, PUT, DELETE, and safe request methods
are idempotent.

从上面可以看到GET请求是安全的,在幂等性中说PUT和DELETE以及安全method都是幂等的,所以GET自然也被包括了。

POST请求不能被缓存

我们在实际使用过程中对HTTP请求的优化大多数都放在GET请求上,比如对没有数据变化的请求(网站中常用的静态文件)做缓存,在潜意识中认为只有GET请求才可以被缓存,所以从来也不会考虑POST请求的缓存优化,然而在RFC中提到GET和POST以及HEAD都是可以被缓存的。不过不要惊讶,之前不知道POST可以被缓存是因为标准也很无奈,浏览器的实现总是比标准厉害。

In general, safe methods thatdo not depend on a current or authoritative response are defined as cacheable; this specification defines GET, HEAD, and POST as cacheable, although the overwhelming majority of cache implementations only support GET and HEAD.

POST请求相对GET请求是「安全」的

这一点很多人都会质疑,被抓包之后的POST请求和GET请求是一样裸露的,所以更安全的说法是不对的。我这里所有的「安全」是相对的,因为GET请求有时候会直接反应在浏览器的地址栏,而现在的浏览器大多会记住曾经输入过的URL。试想如果你曾经在别人电脑上填过一个很私密的表单,那么你的这份记录很可能被连没什么电脑常识的人都一览无遗。

### GET请求POST请求区别详解 GET POST 是 HTTP 协议中最常用的两种请求方法,它们在功能、用途实现方式上存在显著差异。以下是两者的具体区别: #### 1. **定义与用途** - GET 请求主要用于从服务器获取数据,适合用于查询或检索资源。参数通常附加在 URL 的查询字符串中[^1]。 - POST 请求主要用于向服务器发送数据以进行处理,例如提交表单或上传文件。数据包含在请求体中[^1]。 #### 2. **参数传递方式** -GET 请求中,参数通过 URL 的查询字符串传递,格式为 `?key=value&key2=value2`。这种方式使得参数对用户可见,并且容易被缓存或书签保存[^4]。 -POST 请求中,参数位于请求体中,不会出现在 URL 中。因此,POST 请求更适合传递敏感信息或大量数据[^4]。 #### 3. **安全性** - GET 请求由于将参数暴露在 URL 中,因此隐私性安全性较差。此外,URL 可能会被浏览器历史记录、日志文件等保存,进一步增加泄露风险[^4]。 - POST 请求的数据存储在请求体中,不会直接显示在 URL 中,因此相对更安全。 #### 4. **数据长度限制** - GET 请求的参数长度受限于 URL 的长度限制,不同浏览器服务器可能有不同的上限,通常在 2KB 到 8KB 之间,更常见的是 1KB 以内。 - POST 请求没有明确的数据长度限制,理论上可以发送任意大小的数据,但实际大小受服务器配置网络条件影响[^4]。 #### 5. **幂等性** - GET 请求是幂等的,即多次执行相同的 GET 请求应该产生相同的结果,不会对服务器状态造成改变。 - POST 请求不是幂等的,因为它可能会导致服务器状态的变化,例如创建新资源或修改现有资源[^1]。 #### 6. **缓存机制** - GET 请求可以被浏览器缓存,因此在某些情况下可以直接从缓存中获取结果,而无需再次访问服务器[^3]。 - POST 请求通常不会被缓存,每次请求都会发送到服务器进行处理[^3]。 #### 7. **使用场景** - GET 请求适合用于获取数据、搜索操作或任何不需要更改服务器状态的操作[^2]。 - POST 请求适用于需要提交数据或修改服务器状态的场景,例如表单提交、文件上传等[^2]。 ### 示例代码 以下是一个简单的示例,展示如何使用 JavaScript 的 Fetch API 发送 GET POST 请求: ```javascript // GET 请求示例 fetch('https://example.com/api/data', { method: 'GET' }) .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error('Error:', error)); // POST 请求示例 fetch('https://example.com/api/data', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ key: 'value' }) }) .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error('Error:', error)); ``` #### 注意事项 - 在选择请求方法时,应根据具体需求权衡安全性、数据量操作类型等因素[^2]。 - 对于敏感数据(如密码、信用卡信息),应避免使用 GET 请求,优先选择 POST 请求并结合 HTTPS 提高安全性[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值