http到底是什么?
定义
它是一种网络传输协议,位于TCP/IP协议族的最顶层应用层。HTTP
Hypertext Transfer Protocol(超文本传输协议)和 HTML (Hypertext Markup Language 超文本标记语言) 一起诞生,用于在网络上请求和传输 HTML 内容。
http工作模型
- 浏览器
- 用户在浏览器输入地址回车访问
- 浏览器拼装请求报文发送给服务器
- 服务器接受处理请求发送响应报文给浏览器
- 浏览器解析响应报文并使用渲染引擎显示
- 手机APP
- 用户触发一个网络请求
- 应用拼装HTTP报文请求发送给服务器
- 服务器接受报文请求解析处理返回响应报文
- 应用解析响应报文获取响应数据显示到手机界面
请求报文格式
示例
- https 协议类型
- jack.com 服务器地址
- users/?gender=male 路径path
- 请求行:Method(GET POST PUT DELETE...)、Path、HTTP version
- Headers:请求的meta data
- Body:要发送给服务器的内容
Method类型
-
GET
幂等一次操作和多次操作的结果是一样的
取资源、对服务器数据不修改、不发送body
GET /users/1 HTTP/1.1
Host: api.github.com
-
POST
主要用于增加或者修改资源、发送给服务器的内容写在body里面
POST /users HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 13
name=rengwuxian&gender=male
-
PUT
主要用于修改资源、发送给服务器内容写在body里面
PUT /users/1 HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 13
gender=female
-
DELETE
幂等,一次和多次删除都是一样的。
主要用于删除资源、不发送 Body
DELETE /users/1 HTTP/1.1
Host: api.github.com
-
HEAD
幂等
和 GET 使用方法完全相同唯一区别在于,返回的响应中没有 Body
可以用于做一些获取信息的操作比如断点续传,先head一下获取信息来判断是否需要做下一次请求;
Status Code
- 1xx:临时性消息。如:100 (继续发送)、101(正在切换协议)
- 2xx:成功。最典型的是 200(OK)、201(创建成功)。
- 3xx:重定向。如 301(永久移动)、302(暂时移动)、304(内容未改变)。
- 4xx:客户端错误。如 400(客户端请求错误)、401(认证失败)、403(被禁⽌止)、404(找不不到内容)。
- 5xx:服务器器错误。如 500(服务器器内部错误)
- Headers
http消息的元数据(matedata)数据的数据
- Host
目标主机,不是在网络上用于寻址的,而是在目标服务器器上用于定位子服务器器的。
- 在报文拼装发送之前通过DNS寻址找到目标服务器
- 在host拼装在报文里面找到目标服务器
这种方式主要是用来处理一个服务器可能会有多个虚拟服务器,如果通过host可以精确的定位需要访问的服务器。
- Content-Type/Content-Length
body的类型和长度
- 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">
..............................
- x-www-form-urlencoded
Web 页面纯文本表单的提交方式,如果是存文本的话可以使用这种encoded。
POST /users HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
name=rengwuxian&gender=male
3.multitype/form-data
Web 页面含有二进制文件时的提交方式,推荐使用带文件的表单也可以上传文本的表单但是会比较消耗带宽。
POST /users HTTP/1.1
Host: hencoder.com
Content-Type: multipart/form-data;boundary=
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Length: 2382
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="name"
jack
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="avatar"; filename="avatar.jpg"
Content-Type: image/jpeg
JFIFHHvOwX9jximQrWa......
- application/json , image/jpeg , application/zip ...
单项内容(文本或非文本都可以),用于 Web Api 的响应或者 POST / PUT 的请求,优点就是格式灵活格式自由。
POST /users HTTP/1.1
Host: hencoder.com
Content-Type: application/json; charset=utf-8
Content-Length: 38
{"name":"jack","gender":"male"}
Location
User-Agent
Range/Accpet-Range
-
Transfer: chunked (分块传输编码 Chunked Transfer Encoding)
这种情况一般用于服务器暂时无法返回全部的信息,但是也不能让客户端一直等着所以可以分段传输一些资源给客户端。
HTTP/1.1 200 OK
Content-Type:text/html
Transfer-Encoding:chunked
4
chun
9
ked trans
12
fer encoding
0
Location
指定重定向的⽬目标 URLUser-Agent
用户代理理,即是谁实际发送请求、接受响应的,例例如手机浏览器器、某款手机 App。这个参数的来源是为了支持早期的火狐浏览器,由于之前有很多浏览器没有统一兼容性导致很多网站,只能在某一部分的浏览器达到很好的效果。很多网站需要做很多浏览器的适配,后面网站支去做火狐浏览器的兼容,所以这个User-Agent就全部写成了Mozilla。Range / Accept-Range
指定Body的 内容范围,一般用于分段取内容。其他 Headers
REST