关于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. word中特殊符号的替换

    首先在word里替换快捷键是ctrl+H,点击“更多”,会出现更多选项,在特殊格式那里可以选在各种符号,比如回车,空格什么的. 有的时候在word里看不到一些格式,需要点一下下图的对着的两个箭头图标: ...

  2. JavaScript 数组-Array的方法总结

    JavaScript中的Array类型是经常用到的,Array类型也提供了很多方法能实现我们需求,下面我们来总结一下 一.创建Array的方法 1.使用Array构造函数 var colors=new ...

  3. ECMall 中URL体系的改造思路

    EC系列的产品都已停止更新很久了,但其对中国中小电商企业的影响无疑是巨大的.很多公司,都是直接拿来即改,改了即用. 但他们都有个问题,代码是比较传统的开发模式过来的,尤其ecshop.ECMall系统 ...

  4. 用Vue.js递归组件构建一个可折叠的树形菜单

    在Vue.js中一个递归组件调用的是其本身,如: Vue.component('recursive-component', {   template: `<!--Invoking myself! ...

  5. website 合集

    1. oracle  http://asktom.oracle.com ( 英文 ) http://itpub.net ( 中文 ) https://www.oracle.com/communitie ...

  6. thinkphp nginx 上配置 并解决get获取到数据现象

    server { listen 80; server_name XXXX.funova.net XXX.funova.com; root /opt/newgm; index index.php; lo ...

  7. 第一百五十一节,封装库--JavaScript,表单验证--密码确认验证--回答验证--电子邮件验证加自动补全

    封装库--JavaScript,表单验证--密码确认验证--回答验证--电子邮件验证加自动补全 效果图 html <div id="reg"> <h2 class ...

  8. Ubuntu14.4下搭配WEB服务器(apache + php + mysql)

    今天,趁着自己动手安装web服务器的余热,将Ubuntu14.4搭配WEB服务器的过程记录下来. “一切皆文件”. 说明:网上关于类似搭配web服务器的教程,案例不计其数,但自己亲自动手“试试”,一定 ...

  9. Java 面试题 自己写的答案

    基本概念 操作系统中 heap 和 stack 的区别 栈(stack)与堆(heap)都是Java用来在内存中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 在函 ...

  10. python 之 内置函数大全

    一.罗列全部的内置函数 戳:https://docs.python.org/2/library/functions.html 二.range.xrange(迭代器) 无论是range()还是xrang ...