# http到底是什么 ### 不知道大家有没有这种感觉,当面试官或者同事问你http到底是个啥,你有时候会一顿一激灵。在项目中做了那么久,我当然知道http是啥啦,天天在用好不好,但是让你口述,你是否真的可以说的一五一十呢?反问下自己吧!这玩意必须掌握并且很容易被轻视。因为你搭建一个项目,那网络请求只需要在一开始的时候配置一次就能终生使用,那我就和大家一起来讨论下http到底是个啥。 ### 其实http最直观的理解应该分为2种,第一种是游览器打开一个网页,第二种就是客户端向服务器发起网络请求,服务器返回对应的内容。这个过程其实就是http---超文本传输协议,是一种通信协议(协议你可以理解为合同,双方定好一套认可的标准内容。)(超文本,不是超级大的文本!其实超就是可以拓展的意思,超链接在word文档中你也用过,超链接就是超文本,其实就是咱们说的html。再换句活说就是html传输协议。) # 报文体 ### http会把我们常见的url拆分组装成报文体发送给服务器,报文分为,请求报文和响应报文,客户端就相当于是request和response。
上图为请求报文
?
上图为响应报文
?
### 下面我会细说这每一行的参数大致代表了啥
# http请求方式 ## GET ### 读取服务器数据和网页时可以使用GET请求,他具有幂等性,说到幂等你就要问了,什么是幂等性,这里久不详细说明了,自行百度,但是可以这样理解只要数据一致就是幂等,所以除了数据增加,其他都具有幂等性。 ### 通常我们知道GET其实就是一行url,举个例子 http://www.baidu.com/mine?userId=1 ?这个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 ### 基本业务逻辑并不需要这种请求方式,但是确实存在,大致就是不会从服务器返回结果给你,只会给你服务器的一切基本信息,体量比较小。只做个了解一下的功能。
# 状态码 1. 1xx:临时性消息。100代表协议切换,比如http1.1和http2请求,head上upgrade:h2c返回状态码就是101,告诉客户端支持http2,请使用http2,head加 expect:100-continue代表客户端数据还没有发完,请等我一下,我还有内容需要发。 2. 2xx:成功,这个就不多说了,code为200,那说明借口访问成功,那就可以对body解析或者对status message进行下一步操作。 3. 3xx:重定向,比如301,资源永久迁移了,302临时迁移,游览器会指向loaction重新开打,安卓的okhttp也是支持自动重定向。 4. 4xx:客户端错误,服务器认为是不存在的,比如404页面不存在,但是我依然可以给你body,401未授权,auth失败等等。 5. 5xx:服务器错误,内部资源不足,空间不足,数据库连接失败等等。这里就不一一展开了,网上搜索一下一大堆错误码。毕竟3位数开头,题外话,3字头中华烟可真难买到。 # 请求头部(Header)和请求主体(Body) ## header ### 请求头部,他的作用呢其实是http消息的元数据(metadata),元数据相当于数据的数据。大概就是镜子里的镜子。哈哈,大概理解一下。相当于数据的属性。 ### host:服务器地址 ### 这里就说到了域名和ip的关系了,对,没错,还有dns。说的粗糙一点就是域名比较好记比较方便查看,通过域名去dns服务器查询真实ip,就是这样一个过程,但是其中的还有很多奥妙等待大家去探索。咱们今天说的这个HOST其实是去指定服务器找到对应的主机。你可以理解为一台服务器部署了很多域名服务,我用host去找我想要的域名服务。 ### content-Type 1. text/html:html文本,用于游览器访问,通过游览器内核渲染页面 2. application/x-www-form-urlencoded:普通表单,纯文字表单键值队 3. multipart/form-data:Web??含有?进制?件时的提交?式。boundary用来做分界。与表单的&类似功能。 4. applicaton/json:json数据体,用于web api的响应,post,put,也是属于文本格式。 5. image/jpeg,applaction/zip等等:但是这种格式几乎没有人用,可能后端人员更喜欢multipart的方式,还有很多理由,具体不细说了。
### content-Length ### 为什么非要知道内容长度呢?长度只是为了让bady知道在哪里结束。如果是二进制的内容,比如是个换行符的二进制,那数据就已经读取错误了
### chunked transfer encoding ### 分快传输编码,header:trasnsfer-encoding:chunked,,就不存在长度了,因为不知道多长。
### user-Agent:用户代理 ### 客户端,一些浏览器和手机的信息。很多网站的屏幕适配都可以根据useragent中的参数来设置,mozilla了解下它的历史。游览器的历史。
### cookie和authorization我会单独列一个章节去介绍,当然还有更多的字段,这边由于个人觉得不是那么重要,我就稍微列一下range/ACCEPT-RANGE,accept,accept-charset,accept-encoding,content-encoding,cache-control,last-modified,etag,chache-control:private/public等。
### cache: ### cache和buffer的区别,cache是缓存,我用完,一会还用,我先不扔掉,buffer是缓冲,针对工作流,上游多生产些给下游用,上游生产力大于下游消费力。
# REST是个啥 ## 架构风格,一种思想,到底该怎么让http更好用,更规范。有意思的是曾经有个领导问我架构,框架,和设计模式的关系,分别是什么?这个话题很开放,大家可以自己思考
## 说白了,rest就是http,但是rest只是一个宏观的框架风格。也不是协议。为了更好实现rest,就又了restful http:正确使用http,规范问题。也就是上面我说过的后端该如何规范的设置借口。
# 点个关注咱们还是好朋友~后续还有更多知识点一一更新。
?
|