关于http协议GET和POST方法的区别我们可以从各处得到比较一致的答案,今天我们来填一个面试中可能碰到的一个坑。

当面试官问你“你觉得GET和POST有什么区别"时,我们可能会想到以下几点(来源于网络):

  • GET在浏览器回退时是无害的,而POST会再次提交请求。
  • GET产生的URL地址可以被Bookmark,而POST不可以。
  • GET请求会被浏览器主动cache,而POST不会,除非手动设置。
  • GET请求只能进行url编码,而POST支持多种编码方式。
  • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
  • 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
  • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
  • GET参数通过URL传递,POST放在Request body中。
  • GET请求在URL中传送的参数是有长度限制的,而POST么有。

以上答案除了最后2条基本没什么问题,我们现在测试一下到底什么情况。

在HTTP协议中并没有明确论述不同的请求方法使用的传送数据方式(url,body)不同,所以我们假设没有这种区别。

我们实现一个的socket server 端程序进行测试

package main

import (
"fmt"
"log"
"net"
) func main() {
l, err := net.Listen("tcp", ":8080")
if err != nil {
log.Fatalln("err:", err)
}
defer l.Close() for {
c, err := l.Accept()
if err != nil {
log.Fatalln("err:", err)
}
go process(c) }
} func process(c net.Conn) {
defer func() {
c.Close()
if err := recover(); err != nil {
log.Println("process error:", err)
}
}()
rH := `HTTP/1.1 200 OK
Content-Type:"application/json"`
rSegmentation := "\r\n\r\n"
rB := `{"data":"success"}`
resp := rH + rSegmentation + rB bs := make([]byte, 1024)
// 读请求
n, _ := c.Read(bs)
fmt.Println(string(bs[:n]))
// 响应
c.Write([]byte(resp))
}

GET方法通过url传递数据如下

server接收到的http请求

GET方法通过body传递数据如下

server接收到的请求

 POST方法通过url传递数据

server接收到的请求

 

 POST方法通过body传递数据

 

server接收到的请求

 

上述四种测试case均成功,所以“GET参数通过URL传递,POST放在Request body中”和“GET请求在URL中传送的参数是有长度限制的,而POST么有”是错误的。具体来说:

  • 无论POST还是GET方法,传递数据(参数)既可通过URL也可以通过body
  • POST或者GET方法如果通过body传递数据(参数)是没有长度限制的
  • POST或者GET方法通过URL传递数据理论上也没有长度限制(因为url存在于http协议的header部分,而http header并没有长度限制)
  • 通常所说的参数数据限制是指浏览器或者werbserver会的一种设定,假如自己实现client和server完全能做到不限制长度

所以从协议角度来看GET和POST本质上并没有区别.

GET和POST请求区别的更多相关文章

  1. Http之Get/Post请求区别

    Http之Get/Post请求区别 1.HTTP请求格式: <request line> <headers> <blank line> [<request-b ...

  2. Http中Get/Post请求区别

    Http中Get/Post请求区别 (1)get是从服务器上获取数据,post是向服务器传送数据. (1)   在客户端,Get方式在通过URL提交数据,数据在URL中可以看到:POST方式,数据放置 ...

  3. GET请求与POST请求区别

    GET请求与POST请求区别 a:语义: GET:客户端想获取服务器资源 POST:客户端想传递数据给服务器 b:安全级: GET:不安全 POST:不安全 c:数据长度 GET:客户端发送数据最长1 ...

  4. js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快、简单 post:安全,量大,不缓存)(服务器同步和异步区别:同步:等待服务器响应当中浏览器不能做别的事情)(ajax和jquery一起用的)

    js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快.简单 post:安全,量大,不缓存)( ...

  5. Http的Get/Post请求区别

    1.HTTP请求格式: <request line> <headers> <blank line> [<request-body>] 在HTTP请求中, ...

  6. Java Servlet(九):转发请求与重定向请求区别

    转发: <% pageContext.setAttribute("pageContextAttr", "pageContextAttribute"); r ...

  7. angular 和jq 的AJAX的请求区别

    最近项目中使用angular,结果发现后台没法获取参数,所以,稍微研究了一下两者在发送ajax时的区别. 注意angular和jquery的ajax请求是不同的. 在jquery中,官方文档解释con ...

  8. 【转】AJAX请求和普通HTTP请求区别

    两者本质区别: AJAX通xmlHttpRequest象请求服务器服务器接受请求返数据实现刷新交互 普通http请求通httpRequest象请求服务器接受请求返数据需要页面刷新 AJAX请求 普通请 ...

  9. 表单提交和ajax提交数据的请求区别

    在http请求中,我们通常会看到请求字段以query string parameters,或form data,或request payload形式发送到服务器,究竟他们有什么区别呢?下面为您揭晓答案 ...

  10. 【前端基础系列】理解GET与POST请求区别

    语义区别 GET请求用于获取数据 POST请求用于提交数据 缓存 GET请求能被缓存,以相同的URL再去GET请求会返回304 POST请求不能缓存 数据长度 HTTP协议从未规定过GET/POST请 ...

随机推荐

  1. HTML5七巧板canvas绘图

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  2. ZABBIX监控原理

    zabbix实现原理及架构详解   想要用好zabbix进行监控,那么我们首要需要了解下zabbix这个软件的实现原理及它的架构.建议多阅读官方文档. 一.总体上zabbix的整体架构如下图所示: 重 ...

  3. JQ实现小火箭效果

    点击返回顶部以动画方式返回 $(function(){         $(window).scroll(function(){             //当滚动距离超过50后,显示按钮:      ...

  4. easyui menu 添加hideItem/showItem 方法

    $.extend($.fn.menu.methods,{ showItem:function(jq,text){ return jq.each(function(){ var item = $(thi ...

  5. jquery mobile demo

    <!DOCTYPE html> <html> <head> <title>jQuery Mobile Demo</title> <me ...

  6. 第二百二十七节,jQuery EasyUI,ComboTree(树型下拉框)组件

    jQuery EasyUI,ComboTree(树型下拉框)组件 学习要点: 1.加载方式 2.属性列表 3.方法列表 本节课重点了解EasyUI中ComboTree(树型下拉框)组件的使用方法,这个 ...

  7. 判断下列语句是否正确,如果有错误,请指出错误所在?interface A{

    判断下列语句是否正确,如果有错误,请指出错误所在? interface A{ int add(final A a); } class B implements A{ long add(final A ...

  8. sublime 空格 tab

    sublime强大的编辑能力非常值得推荐.在编辑python语言时,因为python用段落格式取代了常见语言中的括号,所以在写python时.会将空格和tab混淆,如此产生的错误非常是恼人. 如17, ...

  9. NLM非局部均值算法相关

    NLM原文: 基于图像分割的非局部均值去噪算法 基于图像分割的非局部均值去噪算法_百度文库 https://wenku.baidu.com/view/6a51abdfcd22bcd126fff705c ...

  10. VC++ Debug内存值

    Memory Values If you're using the debug heap, memory is initialized and cleared with special values. ...