本文作者 TomorrowWu,原创文章,转载注明出处,博客地址 https://segmentfault.com/u/to... 第一时间看后续精彩文章。觉得好的话,顺手分享到朋友圈吧,感谢支持。
RESTful
- 无状态,采用URL+HTTP请求方法来描述资源和行为;
- 一般用在前后端分离项目中,后端提供REST接口给前端
- GET:获取资源;POST:更新资源;PUT:创建资源;DELETE:删除资源
- 由于无状态,一般会采用JWT或OAuth的方式认证一个用户,Token保存在前端,为了安全性一般会配合HTTPS使用
GET和POST格式是怎样的,区别
- HTTP请求分三部分:请求行、请求头、请求体
方法 | 回退 | 书签 | cache | 编码方式 | 历史记录 | 参数长度 | 参数位置 | 参数数据类型 | TCP数据包 | |
---|---|---|---|---|---|---|---|---|---|---|
GET | 回退时无害 | url可以收藏为书签 | 浏览器主动cache | 只能进行url编码 | 请求参数会被完整保留 | 参数长度有限制 | url中 | 只接受ASCII字符(数字对应标点符号、字母等控制字符) | 一个包 | |
POST | 回退时再次提交 | 不可以 | 手动设置 | 支持多种编码方式 | 请求参数不被保留 | 参数长度无限制 | 请求体中 | 无限制 | 两个包 |
GET和POST本质上没有区别
- HTTP的底层是TCP/IP,GET/POST都是TCP链接;给GET加上request body,给POST带上url参数,技术上是完全行的通;
- TCP就像汽车,我们用TCP来运输数据;交通规则HTTP给汽车运输设定了好几个服务类别,有GET, POST, PUT, DELETE等等;当执行GET请求的时候,要给汽车贴上GET的标签(设置method为GET),而且要求把传送的数据放在车顶上(url中)以方便记录。如果是POST请求,就要在车上贴上POST的标签,并把货物放在车厢里。当然,你也可以在GET的时候往车厢内偷偷藏点货物,但是这是很不光彩;也可以在POST的时候在车顶上也放一些数据,让人觉得傻乎乎的
- 不同的浏览器(发起http请求)和服务器(接受http请求)就是不同的运输公司;理论上,你可以在车顶上无限的堆货物(url中无限加参数),运输公司会限制单次运输量来控制风险,数据量太大对浏览器和服务器都是很大负担;(大多数)浏览器通常都会限制url长度在2K个字节,而(大多数)服务器最多处理64K大小的url。超过的部分,恕不处理;GET服务,在request body中偷偷藏数据,不同服务器的处理方式也是不同的,有些服务器会帮你卸货,读出数据,有些服务器直接忽略
GET和POST在产生TCP数据包上的重大差别
- GET产生一个TCP数据包;POST产生两个TCP数据包
- GET:浏览器会把http header和data一并发送出去,服务器响应200(返回数据)
- POST:浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)
- POST需要两步,时间上消耗的要多一点
- 在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视;在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点
- 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次
4种常见的POST提交数据方式
Content-Type指定提交数据方式
- application/x-www-form-urlencoded
浏览器的元素form表单,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。大部分服务端语言都对这种方式有很好的支持;用 Ajax 提交数据时,也是使用这种方式
- multipart/form-data
使用表单上传文件,各大服务端语言对它也有着良好的支持,浏览器原生支持 - application/json
告诉服务端消息主体是序列化后的 JSON 字符串;JSON 格式支持比键值对复杂得多的结构化数据 - text/xml
它是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范;XML 结构还是过于臃肿,一般场景用 JSON 会更灵活方便
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。