中文名称--超文本传输协议,是TCP/IP协议族的最顶层-应用层。应用层协议的产生只是为了C/S双方都能看懂数据,是对传输数据的包装。html
URL格式分为三部分: 协议类型://服务器地址(和端口号)/路径(Path) https://segmentfault.com/write?freshman=1node
GET /users/1 HTTP/1.1
Host: api.github.com
复制代码
POST /users HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded (Content-Type为 “application/x-www-form-urlencoded”时,才会读取Body中的内容)
Content-Length: 13
name=lvzishen&gender=male
复制代码
PUT /users HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded (Content-Type为 “application/x-www-form-urlencoded”时,才会读取Body中的内容)
Content-Length: 13
name=lvzishen&gender=male
复制代码
DELETE /users/1 HTTP/1.1
Host: api.github.com
复制代码
HEAD /users/1 HTTP/1.1
Host: api.github.com
复制代码
用于对相应结果做出类型化描述。nginx
1.Header是什么? HTTP消息的 metadata
(元数据)。git
2.什么是元数据? 通俗的讲就是数据的属性
。以一个登陆接口为例,用户名密码是上传的数据(放在BODY中),那么用户名密码的长度( Content-Length)、以什么类型( Content-Type )上传等等就是它的元数据。github
目标主机。注意:不是在网络上用于寻址(寻址用DNS)的,而是在目标服务器(找到IP后一个IP下有可能有多个主机名,肯定访问的是哪个主机)上用于定位子服务器的。web
(1). text/html: 请求 Web 页面是返回响应的类型,Body 中返回 html文本。格式以下:算法
HTTP/1.1 200 OK
Content-Type: text/html;charset=utf-8
Content-Length: 853 ......
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
.....
复制代码
(2). x-www-form-urlencoded : 纯文本表单的提交方式(只有以表单
形式提交时,才会读取Body中的内容)。 格式以下:json
POST /users HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
name=lvzishen&gender=male
复制代码
对应 Retrofit 的代码:segmentfault
@FormUrlEncoded <--表明的是以普通表单(application/x-www-form-urlencoded)上传文本参数,加了这个注解后才会读取@Field中的参数,由于@Field最后会转变为请求体Body中的内容.
@POST("/users")
Call addUser(@Field("name") String name, @Field("gender") String gender);
复制代码
(3).multipart/form-data :页面含有二进制文件时的提交方式(上传文件或文字均可以,可是通常没有用此上传纯文字,由于会多加如boundary、分隔符等字符,浪费流量和带宽)。(只有以表单形式提交时,才会读取Body中的内容)。 格式以下:api
POST /users HTTP/1.1
Host: hencoder.com
Content-Type: multipart/form-data; boundary=---- boundary为起始点
WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Length: 2382
------WebKitFormBoundary7MA4YWxkTrZu0gW WebKitFormBoundary7MA4YWxkTrZu0gW<--为分隔符
Content-Disposition: form-data; name="name"
rengwuxian
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="avatar"; filename="avatar.jpg"
Content-Type: image/jpeg
JFIFHHvOwX9jximQrWa......
复制代码
(4). application/json , image/jpeg , application/zip ...
单项内容(文本或非文本均可以),用于 Web Api 的响应或者 POST / PUT 的请求 请求中提交 JSON:
POST /users HTTP/1.1
Host: hencoder.com
Content-Type: application/json; charset=utf-8
Content-Length: 38
{"name":"lvzishen","gender":"male"}
复制代码
响应中返回JSON:
HTTP/1.1 200 OK
content-type: application/json; charset=utf-8
content-length: 234
[{"login":"mojombo","id":1,"node_id":"MDQ6VXNl cjE=","avatar_url":"https://avatars0.githubuse rcontent.com/u/1?v=4","gravat...... 复制代码
image/jpeg:提交或获取图片
POST /user/1/avatar HTTP/1.1
Host: hencoder.com
Content-Type: image/jpeg
Content-Length: 1575
JFIFHH9......
复制代码
指定 Body 的长度(字节)。用于二进制文件中的长度读取,由于不能肯定读取到哪里,因此规定长度,读取到对应长度后表明读取完成再也不读取。
用于当响应发起时,内容长度还没能肯定的状况下。和 Content-Length 不一样时使用。用途是尽早给出响应,减小用户等待。
HTTP/1.1 200 OK
Content-Type: text/html
Transfer-Encoding: chunked
4
Chun <--不断给出数据 先给4字节的Chun,再给9字节的ked Trans,.....,0表明传输完成所有加载完毕。
9
ked Trans
12
fer Encoding
0
复制代码
指定重定向的目标的URL
用户代理,便是谁实际发送请求、接受响应的,例如手机浏览器、某款手机 App。
按范围取数据
做用:在客户端或中间网络节点缓存数据,下降从服务器取数据的频率,以提升网络性能。
格式:Authorization: Basic username:password(Base64ed) 对用户名密码作Base64编码,不是加密的,Base64只是编码。 Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
格式:Authorization: Bearer token bearer token 的获取方式: 经过 OAuth2 的受权流程 OAuth2 的流程
答:为了安全。OAuth 不强制受权流程必须使用 HTTPS,所以须要保证当通讯路径中存在窃听者时,依然具备足够的安全性。
在自家 App 中使用 Bearer token 有的 App 会在 Api 的设计中,将登陆和受权设计成相似 OAuth2 的过程,但简化掉 Authorization code 概念。即:登陆接收请求成功时,会返回 access token,而后客户端在之 后的请求中,就可使用这个 access token 来当作 bearer token 进行用户操做了。 (这么作失去了使用OAuth2的意义)
Refresh token 用法:access token 有失效时间,在它失效后,调用 refresh token 接口,传入efresh_token 来获取新的 access token。
{
"token_type": "Bearer",
"access_token": "xxxxx",
"refresh_token": "xxxxx",
"expires_time": "xxxxx"
}
复制代码
目的:安全。 当 access token 失窃时,因为它有失效时间,所以坏人只有较短的时间来「作坏事」;同时,因为(在标准的 OAuth2 流程中)refresh token 永远只存在与第三方服务的服务 器中,所以 refresh token 几乎没有失窃的风险。 ##七.RESTful是什么? 以HTTP标准协议去使用HTTP。 好比:
HTTP 1.0须要使用keep-alive参数来告知服务器端要创建一个长链接,而HTTP1.1默认支持长链接。Connection:keep-alive(虽然是不断开可是每次也只能串行的执行HTTP请求,2.0才支持并行) HTTP是基于TCP/IP协议的,建立一个TCP链接是须要通过三次握手的,有必定的开销,若是每次通信都要从新创建链接的话,对性能有影响。所以最好能维持一个长链接,能够用个长链接来发多个请求。 持久链接的时间参数,一般由服务器设定,好比 nginx 的 keepalivetimeout,keepalive timout
时间值意味着:一个 http 产生的 tcp 链接在传送完最后一个响应后,还须要 hold 住 keepalive_timeout (一般为5-15S)秒后,才开始关闭这个链接;
HTTP 1.1支持只发送header信息(不带任何body信息),若是服务器认为客户端有权限请求服务器,则返回100,不然返回401。客户端若是接受到100,才开始把请求body发送到服务器。 这样当服务器返回401的时候,客户端就能够不用发送请求body了,节约了带宽。 另外HTTP还支持传送内容的一部分。这样当客户端已经有一部分的资源后,只须要跟服务器请求另外的部分资源便可。这是支持文件断点续传的基础。
如今能够web server例如tomat,设置虚拟站点是很是常见的,也便是说,web server上的多个虚拟站点能够共享同一个ip和端口。 HTTP1.0是没有host域的,HTTP1.1才支持这个参数。
在HTTP/2中,客户端向某个域名的服务器请求页面的过程当中,只会建立一条TCP链接,即便这页面可能包含上百个资源。 单一的链接应该是HTTP2的主要优点,单一的链接能减小TCP握手带来的时延 。HTTP2中用一条单一的长链接,避免了建立多个TCP链接带来的网络开销,提升了吞吐量。
HTTP2虽然只有一条TCP链接,可是在逻辑上分红了不少stream。 HTTP2把要传输的信息分割成一个个二进制帧,首部信息会被封装到HEADER Frame,相应的request body就放到DATA Frame,一个帧你能够当作路上的一辆车,只要给这些车编号,让1号车都走1号门出,2号车都走2号门出,就把不一样的http请求或者响应区分开来了。可是,这里要求同一个请求或者响应的帧必须是有有序的,要保证FIFO的,可是不一样的请求或者响应帧能够互相穿插。这就是HTTP2的多路复用,是否是充分利用了网络带宽,是否是提升了并发度?
HTTP1.1不支持header数据的压缩,HTTP2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快。 至关于创建一个映射表,如GET方法直接定义为映射表中的数字2,那么GET请求时请求方法写2就能够而不用写GET,这样就能够节省流量和空间。
这个功能一般被称做“缓存推送”。主要的思想是:当一个客户端请求资源X,而服务器知道它极可能也须要资源Z的状况下,服务器能够在客户端发送请求前,主动将资源Z推送给客户端,这样当使用Z资源时就不用请求网络直接本地取数据就能够了,加快获取速度。