Get Or Post

关于HTTP请求(主要是POST和GET)

前言

最近在做java后台(ssm+maven), 设计到http中几种请求方法, 即在springMVC中使用restful风格的url, 会涉及到POST, GET, DELETE, PUT这几种请求http的请求方法. 故在一番复习之后,向大家简单的分享这个几种http请求方式. 本文主要介绍POST和GET请求方式.

附上HTTP请求和响应的报文结构图

请求报文
<request-line>
<request-header>
<blank-line>
[<request-body>]
响应报文
<response-status-line>
<response-header>
<blank-line>
[<response-body>]

一.前言(post和get最直观的区别)

  1. GET请求把参数直接包含在请求的URL中
  2. POST请求是通过request body 即请求正文传递参数
  3. GET请求在url中传送的参数长度是有限制的
  4. GET比POST不安全, 所以不能传递敏感信息等等.

二.生动的比喻

我在网上看到一段关于http请求方式的比喻.我觉得很形象生动, 故在此 引用一下

学过操作系统的童鞋都知道http是基于tcp/ip的一种互联网通讯协议. 
所以说http的底层是tcp/ip. 而GET和POST是http请求的两种方式. 故get和post的底层也是基于tcp的.
其实get和post做的事情都是一样的, 
就像你要给get请求加上request body, 
给post请求加上url请求参数在技术上也是完全可行的.

比喻

在互联网的世界中, tcp就像是汽车, 我们用tcp进行运输数据, 类比现实生活中汽车也分好多种-货车,客车, 加急车等等, 当然有了这些车之后, 不可避免的就有交通法规, 而交通法规就类比互联网中的http协议, 该http协议(交通规则)设定了几个服务类别, 有get, post, put, delete等, 而执行每一种服务,如执行get请求的时候-给汽车贴上get的标签(设置method为get). 则规定该汽车要把传送的数据放在车顶上(url)以方便记录. 而如果是post服务的话, 就在汽车上贴上post标签, 也就是把货物放在车厢里. 当然,你可以在get的时候往车厢里偷偷放点数据, 至于接不解析(接不接受)就是要服务器的事情了. 你也可以在post的时候, 在车顶放一些数据, 虽然这样很没有意义, 但是表明http只是一个行为准则. 而tcp才是get和post实现的根本.

值得注意

  1. get请求只会产生一个TCP数据包.

     当使用get方式提交请求的时候, 浏览器会把请求的header和数据一起发送出去, 
     服务器端响应200返回数据
    
  2. post请求会产生两个TCP数据包.

     对于使用post方式提交, 浏览器会先发送header, 
     服务器响应100 continue, 浏览器再次发送data, 服务器响应200返回数据.
     也就是说get只需要汽车跑一趟就把货物送到了. 但是post的话要跑两趟, 
     第一趟去和服务器打个招呼说:嗨,哥们,我等一下要送一批货来,
     你打开门迎接我一下. 然后第二趟把数据送过来.
     
     有人会说post比较消耗时间. 其实不然, 
     在网络好的请求下, 浏览器发一次包的时候和发两次包的时间基本可以无视, 
     还有并不是所有的浏览器在post请求的时候都会发送2次包. 如火狐就只发送一次.
    

三.请求报文详细解析

一. 请求行 - POST /index.html /HTTP/1.1

组成: 请求方法字段 空格 url字段 空格 http协议版本字段 回车换行
1. 如果是get请求的话, 还会在url后面即进行请求参数拼接
index.html?username=daejong&password=123456
2. 如果是post请求的话, 请求参数会放在request body请求体中, 见下.

二. 请求头 - 以key-value键值对,

主要通知服务器有关客户端请求的信息.
如:
User-Agent: 产生请求的浏览器类型
Accpet: 客户端可以识别的内容类型列表
Host: 请求的主机名
Content-Type: application/json 等等

三. 空行 - 回车 换行符

用来通知服务器以下 没有请求头了. 用于请求头和请求体的分割.

四. 请求体-数据

注意:
1. 请求体不在GET请求中使用, 而是在POST请求的方法中使用.
2. 通常在使用POST的请求的时候, 指定Content-Type, Content-Length.指定内容类型, 如通常我们统一请求和响应的数据格式为json. 
就要指定Content-Type为application/json

四.响应报文详细解析

一. 响应行-状态行

提到状态行-不得不说一下状态码.

状态码由三位数字组成.
1. 1xx 表示请求已经接收, 继续处理
2. 2xx 表示成功接收,理解,接收
3. 3xx 表示重定向, 要完成请求必须更进一步的操作.
4. 4xx 表示客户端错误-请求有语法错误或者无法实现.
5. 5xx 表示拂去其出错了-如服务器未能实现合法的请求.

常见的状态码:

1. 200 ok, 客户端请求成功
2. 400 bad request, 客户端请求有语法错误, 服务器无法解析
3. 403 forbidden, 服务器接收到请求, 到时拒绝提供服务
4. 404 not found, 请求资源不存在
5. 500 internal server error, 服务器发送不可预期的错误.
6. 503 server unavailable 服务器当前不能处理客户端请求, 一段时间后可能恢复正常.

响应头 和 响应体类似请求报文的请求头和请求体.

五. 总结

  1. get请求, 请求的数据会附在url之后, 也就是放在request-line中, 用?进行分割

  2. post请求, 把请求的数据放置在http包的包体request-body中,

  3. 也就是get请求的数据会在地址栏显示, 而post不会.

  4. 传输的数据的大小

     首先声明: http协议并没有规定对传输的数据的大小进行限制, 也没有对url的长度进行限制,而实际开发中主要限制有: 
     get: 特定浏览器和服务器对url长度有限制. 如IE一般限制请求url长度为2k个字节.
     post: 由于不是通过url传值, 值时放在请求体中, 所以理论上不受限制.
    
  5. 安全性: post的安全性要比get安全性高.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 一、概念(载录于:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436...
    yuantao123434阅读 8,337评论 6 152
  • 引言 HTTP协议我想任何IT人士都耳熟能详了,大家都能说出个所以然来。但是如果我问你HTTP协议的请求方法有哪些...
    拉肚阅读 1,873评论 0 14
  • Http协议详解 标签(空格分隔): Linux 声明:本片文章非原创,内容来源于博客园作者MIN飞翔的HTTP协...
    Sivin阅读 5,210评论 3 82
  • 犬的狂犬病防治 前言: 作为一名普通的动物疫病防治员,需要特别关注传染病病原的问题,比如MERS、禽流感、朊病毒、...
    四年二班穆晚晚阅读 659评论 0 0