本文作者 TomorrowWu,原创文章,转载注明出处,博客地址 https://segmentfault.com/u/to... 第一时间看后续精彩文章。觉得好的话,顺手分享到朋友圈吧,感谢支持。

RESTful

  • 无状态,采用URL+HTTP请求方法来描述资源和行为;
  • 一般用在前后端分离项目中,后端提供REST接口给前端
  • GET:获取资源;POST:更新资源;PUT:创建资源;DELETE:删除资源
  • 由于无状态,一般会采用JWT或OAuth的方式认证一个用户,Token保存在前端,为了安全性一般会配合HTTPS使用

GET和POST格式是怎样的,区别

  • HTTP请求分三部分:请求行、请求头、请求体
    image
方法 回退 书签 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 会更灵活方便

tomorrowwu
444 声望27 粉丝

专注服务器开发,对区块链技术保持好奇心