小议get和post请求区别

上上周去五道口UCenter大厦面试神马搜索,面试到这题。 我当时答得很简单,就是get的数据显示在url里,可以被浏览器作为标签保存,有字节限制。 然后面试官接着问,那他们的地址需要处理吗? 我回答,get需要urlencode转义,我当时想到form的multipart/form-data属性,所以我又补充道,post是以二进制码的格式传输的,不需要转义。 我当时答得太急,没多思考,所以答得简单而且并不准确,所以回来后仔细想了想。 简单点说,GET和POST请求确实有下面3个区别:

  • GET请求的参数是直接放在URL里的,可以被浏览器作为标签保存。POST请求参数是放在请求body里的。
  • GET请求的URL传参有长度限制(视浏览器或服务端webserver而定),而POST请求没有长度限制。
  • get请求只能进行url编码,而post支持多种编码方式

当然,上述的回答并不能说不对,但是回答的太浅,并没有从本质上回答清楚。
无论get还是post,都是对tcp传输数据的格式的规定,既然是规定,那么就可遵守可不遵守。虽然在语义上,get是获取数据,post是提交数据,但是呢,离开浏览器环境。我们自行构造tcp数据,把数据放在body里,然后通过get发送。这时服务器依然可以接收到数据,只要服务器能解析,那么整个过程也是正确的。在开源工具ElasticSearch的文档里,经常有通过get传递查询语句来检索信息(如https://www.elastic.co/guide/en/elasticsearch/reference/0.90/search.html

还有一种说法,get和post的传输过程不一样

  • 对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
  • 对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

这个说法也并不对,post分两次发送完全是客户端的行为,并不是http协议的内容。
或许,get请求和post请求唯一的区别,可能就是请求内容的startline里,一个是 GET 一个是POST了。