1.HTTP:
1. 请求报文:
GET /url HTTP/1.1 //请求行
User-Agent: xxxxxxx //请求头
Host: xxxxxx
Accept-Language: xx, xx
//空行
Main Request //正文
2. 响应报文:
HTTP/1.1 200 OK //状态行
Date: Mon, 27 Jul 2009 12:28:53 GMT //消息报头
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain
//空行
HTML/Json //正文
3 状态码:
1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求
4.特点:
无连接,无状态
每次Http请求之间都是独立的,但是这样可能会导致一些麻烦,例如每次Http请求都要登录确认用户身份;所以需要通过引入cookie和Session来建立多个Http请求之间的联系:
cookie存在用户计算机,大小有限,不安全
session存在服务器端,大小不限,安全
5. 常用方法:
GET:
1.一般用来获取数据,
2.传输数据是通过URL请求,数据附在URL之后,参考URL格式第参数部分
3.传输数据量较小,受URL长度限制,受不同浏览器影响,一般取1024字节
4.不安全,参数可从URL中看到
5.只能支持ASCII字符,向服务器传的中文字符可能会乱码
6.支持缓存;
POST:
1.一般用来向服务器提交数据,可能会修改服务器内容
2.数据在请求实体中发送给用户
3.可以传输大量数据,所以上传文件时只能用Post方式
4.比GET安全
5.支持标准字符集,可以正确传递中文字符
6.不支持缓存
2.HTTP几个版本的比较
HTTP 1.X
共同特性:
单向请求,只能由客户端发起
数据未压缩,导致数据的传输量大
通过文本的方式传输数据
HTTP1.0特性:
一次请求只允许在一个TCP连接上
默认短链接,若要使用长连接需要在请求报头添加 connection:keep-alive
HTTP1.1特性:
默认使用长连接。
支持部分内容传送,即断点续传。
引入pipelining的技术,一次性可以发送多个request,但是接收Respone的时候必须按FIFO的顺序,又叫队头阻塞
HTTP2.0新特性:
1.二进制传输:
通过二进制传输数据,所以在HTTP和TCP(UDP)之间增加了一个二进制分帧层
,传输的信息会被分为更小的帧,首部信息会被封装到Headers帧,而Request Body则封装到Data帧。
2.多路复用:
一个请求对应一个流
,一个流由多个帧
组成,每个帧会标识出属于哪个流
即在一个TCP连接中存在多个流,在客户端,帧乱序发送,到服务器端后再根据每个帧首部的流标识符重新组装,可以避免HTTP1.1版本的队头阻塞问题;
3.Header压缩:
摒弃HTTP1.x中用文本传输header的方式,而使用HPACK压缩格式对传输的header进行编码
4.服务器Push:
服务端可以在客户端某个请求后,主动推送其他资源。
3.HTTPS:
HTTPS = HTTP协议 + SSL/TLS协议,占用服务器端口443
HTTPS功能: 内容加密,验证身份,保证数据完整性
加密流程:
1.客户端向服务器发起HTTPS请求,连接到服务器的443端口;
2.服务器将自己的SSL数字证书(包含了公钥
)发给客户端,服务器的数字证书可以自己做或者向CA申请
3.客户端收到服务器端的数字证书,会通过CA对数字证书进行检查;
4.如果公钥合格,客户端生成对称密钥
,并用服务器的公钥加密
;
5.客户端会发起HTTPS中的第二个HTTP请求,将加密之后的客户端对称密钥
发送给服务器;
6.服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,得到对称密钥;
7.以后服务器和客户端就可以使用对称加密的方式进行通信了;
3.URL:
URI:uniform resource identifier,统一资源标识符
URL:uniform resource locator,统一资源定位符,是URI的子集,可以找到文件的URI
一个URL的例子:
http://www.bilibili.com:80/videos/index.asp?username=Tom&age=12&page=1#name
一个完整的URL可以包含以下几部分:
1.协议:“//”之前的部分为协议,上述例子中使用的是http协议
2.域名:“//”到“:”之间的部分为域名,例如www.bilibili.com,一个URL中,也可以使用IP地址作为域名使用
3.端口:“:”到“/”之间的部分为端口号,例如例子中的80,如果省略端口部分,将采用默认端口
4.虚拟目录:域名后的第一个“/”到最后一个“/”中间是虚拟目录部分。本例中的虚拟目录是videos
5.文件名:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。如果省略文件名,则使用默认的文件名
6.参数:从“?”到“#”之间的是参数部分。本例中的参数部分为“username=Tom&age=12”。多个参数之间用“&”作为分隔符。
7.锚:#之后的部分用来标识页面位置,用来指导浏览器动作,对服务器完全无用,实际的请求也会忽略#后面的部分
4.表单:
4.1 表单的形式:
<form action="/upload" enctype="multipart/form-data" method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="file" name="file">
<input type="submit">
</form>
action: 服务器接收表单数据的地址;
method: 提交服务器的http方法,一般为post和get;
enctype: 表单数据提交时使用的编码类型;
常用的编码类型有application/x-www-form-urlencoded
和multipart/form-data
默认使用urlencoded,使用multipart的情况只出现在表单中有文件上传的情况
4.2 表单数据提交:
使用application/x-www-form-urlencoded编码方式:
<form enctype="application/x-www-form-urlencoded" action="http://" method="GET">
<input type="text" name="username" value="Tom">
<input type="text" name="password" value="123456">
<input type="submit" value="submit">
</form>
如果使用get方法,表单中的参数会用urlencoded编码的方式被附在url后面,用问号分隔,例如:
要访问的地址是“http://www.bilibili.com:80/login”;
用GET方法实际发送的是“http://www.bilibili.com:80/login?username=Tom&password=123456”
如果使用post方法,这些数据会被封装到http body中:
实际发送的内容会是:
POST http://www.bilibili.com:80/login HTTP/1.1
Host: localhost:80
Connection: keep-alive
Content-Length: 400
Cache-Control: max-age=0
...其他参数略
username=Tom&password=123456
使用multipart/form-data编码方式:
<form action="user/login.do" method="post" enctype="multipart/form-data">
<input type="text" name="username"><br>
<input type="text" name="password"><br>
<input type="file" name="uploadFile"/><br>
<input type="submit" value="登录"/>
</form>
multipart/form-data用来上传文件,没有文件上传的时候会自动使用urlencode编码方式
实际发送的内容会是:
POST http://www.bilibili.com:80/login HTTP/1.1
Host: localhost:80
Connection: keep-alive
Content-Length: 400
Cache-Control: max-age=0
...其他参数略
------WebKitFormBoundarykALcKBgBaI9xA79y
Content-Disposition: form-data; name="username"
xiaoming
------WebKitFormBoundarykALcKBgBaI9xA79y
Content-Disposition: form-data; name="password"
123456789
------WebKitFormBoundarykALcKBgBaI9xA79y
Content-Disposition: form-data; name="uploadFile"; filename="file.txt"
Content-Type: text/plain
我是文件中的内容
5.RESTFul
REST全称是表述性状态转移,是一种面向资源的API的规范:
1.用Url标识网络上的所有资源,每个资源都有一个唯一的资源标识符
2.同一个资源可以具有多种表现形式(xml,json等)
3.对资源的各种操作不会改变资源标识符
4.所有的操作都是无状态的
5.客户端发出的数据操作指令都是"动词 + 宾语"的结构
动词就是请求使用的方法:增(POST
),删(DELETE
),改(PUT
),查(GET
)
宾语就是Url,Restful面向的是资源,一个Url对应的就是资源名,而不能是动词,例如:
http://wwww.xxx.com:80/users //合格的Url
http://wwww.xxx.com:80/getUsers //不合格的Url