http到底是什么
不知道大家有没有这种感觉,当面试官或者同事问你http到底是个啥,你有时候会一顿一激灵。在项目中做了那么久,我当然知道http是啥啦,天天在用好不好,但是让你口述,你是否真的可以说的一五一十呢?反问下自己吧!这玩意必须掌握并且很容易被轻视。因为你搭建一个项目,那网络请求只需要在一开始的时候配置一次就能终生使用,那我就和大家一起来讨论下http到底是个啥。
其实http最直观的理解应该分为2种,第一种是游览器打开一个网页,第二种就是客户端向服务器发起网络请求,服务器返回对应的内容。这个过程其实就是http---超文本传输协议,是一种通信协议(协议你可以理解为合同,双方定好一套认可的标准内容。)(超文本,不是超级大的文本!其实超就是可以拓展的意思,超链接在word文档中你也用过,超链接就是超文本,其实就是咱们说的html。再换句活说就是html传输协议。)
报文体
http会把我们常见的url拆分组装成报文体发送给服务器,报文分为,请求报文和响应报文,客户端就相当于是request和response。
上图为请求报文
上图为响应报文
下面我会细说这每一行的参数大致代表了啥
http请求方式
GET
读取服务器数据和网页时可以使用GET请求,他具有幂等性,说到幂等你就要问了,什么是幂等性,这里久不详细说明了,自行百度,但是可以这样理解只要数据一致就是幂等,所以除了数据增加,其他都具有幂等性。
通常我们知道GET其实就是一行url,举个例子 www.baidu.com/mine?userId… 这个url没有body就可以直接使用,那么问题来了,一个GET请求能不能加Body呢,本质上是可以的,这就是咱们经常在工作中出现的问题,后端写了带有body的get请求,但是android中的retrofit用get请求带body就直接报错了,这时候你和后端就开始吵起来了,这就是规范性的问题了,后面会引出rest的内容,retrofit在一开始设计的时候就避免了这种不规范的用法。工作而已,团队的交流很重要。
POST
增加或者修改数据,有了增加的操作,那这个POST必然是非幂等性,当然你需要增加和修改数据的时候,这里久显然要带上body了
PUT
是用来修改数据,有body的,put只有修改数据所以是幂等性。这时候大家就要问了,那POST和PUT都有修改,那我到底用哪个呢,团队么最主要的还是交流,看你们后端用post或者put了。客户端只需要遵守纪律就行了~
DELETE
删除数据,他也是有幂等性的,能不能加Body呢,其实道理和GET一样,规范来说是不行,后端强制要求加,那你也拧不过!
HEAD
基本业务逻辑并不需要这种请求方式,但是确实存在,大致就是不会从服务器返回结果给你,只会给你服务器的一切基本信息,体量比较小。只做个了解一下的功能。
状态码
- 1xx:临时性消息。100代表协议切换,比如http1.1和http2请求,head上upgrade:h2c返回状态码就是101,告诉客户端支持http2,请使用http2,head加 expect:100-continue代表客户端数据还没有发完,请等我一下,我还有内容需要发。
- 2xx:成功,这个就不多说了,code为200,那说明借口访问成功,那就可以对body解析或者对status message进行下一步操作。
- 3xx:重定向,比如301,资源永久迁移了,302临时迁移,游览器会指向loaction重新开打,安卓的okhttp也是支持自动重定向。
- 4xx:客户端错误,服务器认为是不存在的,比如404页面不存在,但是我依然可以给你body,401未授权,auth失败等等。
- 5xx:服务器错误,内部资源不足,空间不足,数据库连接失败等等。这里就不一一展开了,网上搜索一下一大堆错误码。毕竟3位数开头,题外话,3字头中华烟可真难买到。
请求头部(Header)和请求主体(Body)
header
请求头部,他的作用呢其实是http消息的元数据(metadata),元数据相当于数据的数据。大概就是镜子里的镜子。哈哈,大概理解一下。相当于数据的属性。
host:服务器地址
这里就说到了域名和ip的关系了,对,没错,还有dns。说的粗糙一点就是域名比较好记比较方便查看,通过域名去dns服务器查询真实ip,就是这样一个过程,但是其中的还有很多奥妙等待大家去探索。咱们今天说的这个HOST其实是去指定服务器找到对应的主机。你可以理解为一台服务器部署了很多域名服务,我用host去找我想要的域名服务。
content-Type
- text/html:html文本,用于游览器访问,通过游览器内核渲染页面
- application/x-www-form-urlencoded:普通表单,纯文字表单键值队
- multipart/form-data:Web⻚⾯含有⼆进制⽂件时的提交⽅式。boundary用来做分界。与表单的&类似功能。
- applicaton/json:json数据体,用于web api的响应,post,put,也是属于文本格式。
- image/jpeg,applaction/zip等等:但是这种格式几乎没有人用,可能后端人员更喜欢multipart的方式,还有很多理由,具体不细说了。