HTTP定义
一种网络传输协议,位于Tcp/Ip协议族的应用层中,现在常用来在网络上进行资源传输。
HTTP工作方式
- 将资源信息拼装成请求报文并发送到服务器;
- 服务器收到请求后返回客户端响应报文;
- 客户端收到响应报文并进行处理;
两种报文
什么是报文
HTTP传输的数据块。
请求报文
从客户端发送的数据块叫做请求报文,请求报文有三个部分组成:请求行、请求头、请求体。
一个常见的POST请求报文如下:
POST /user/id HTTP/1.1
Host: api.github.com
Content-Type: application/json; charset=utf-8
Content-Length: 100
User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko)
{"name":"xxx", "age":"18"}
- 第一行叫做请求行:包括了请求的方法POST, 请求的路径 /user/id, HTTP的版本信息;
- 请求行之后所有的键值对信息都被叫做请求头:Host: api.github.com、Content-Length: 100,当然请求头不只有这些;
- 请求体:{"name":"xxx", "age":"18"},这里一般都是跟业务直接相关的数据,比如你要修改的用户信息;
响应报文
从服务器返回的数据块叫做响应报文,响应报文由三个部分组成:状态行、响应头、响应体。 一个常见的响应报文如下:
HTTP/1.1 200 OK
Host: api.github.com
Content-Type: application/json; charset=utf-8
Content-Length: 100
{"id":"0","name":"xxx", "age":"18"}
- 第一行叫做状态行,包括了 HTTP的版本信息、状态码 200、状态信息 OK;
- 状态行之后所有的键值对被叫做响应头,它和请求头的信息差不多;
- 响应体:这里一般都是跟业务相关的数据,比如你想获取的用户信息;
HTTP常用的请求方法
有五种,分别是 GET、POST、PUT、DELETE、HEAD。
GET 方法
- 用来获取资源
- 不用来对服务器数据进行修改
- 没有方法体
- 具有幂等性,就是不管请求多少次,获取到的结果都是一样的。
GET /user/id HTTP/1.1
Host: api.github.com
POST 方法
- 用来修改或增加服务器资源
- 一般都有方法体,如用户更改数据就要将更改的数据传给服务器
POST /user/id HTTP/1.1
Host: api.github.com
{"name":"xxx", "age":"18"}
PUT 方法
用来修改服务器资源,这点和 POST 差不多,但是具有幂等性(就是多次请求的结果都一样),POST 具有增加的功能,所以多次请求的结果不一样,不具有幂等性。
PUT /user/id HTTP/1.1
Host: api.github.com
{"name":"xxx", "age":"18"}
DELETE 方法
用来删除资源,没有body,有幂等性。
DELETE /user/id HTTP/1.1
Host: api.github.com
HEAD 方法
获取信息,和 GET 使用一样,没有请求体,主要区别是这个HEAD发起的请求没有响应体,GET 发起的请求一般都会返回响应体。什么意思?简单来说就是如果你要用HEAD获取用户信息是获取不到的,但是 GET 可以。 所以这个 HEAD 使用来干嘛的?
- 可以用来获取信息的大小,进行分段加载。
HEAD /user/id HTTP/1.1
Host: api.github.com
Content-Length: 20001
HTTP 中的 Headers
Headers的作用:作为HTTP消息的元数据(metadata,关于数据的数据)。
Host
服务器主机地址,如:Host: api.github.com。
作用:不是用来寻找IP地址的,而是用来DNS查询,就是用主机的域名来查找IP地址的行为。如果一个服务器主机有多个子主机就需要靠这个host来确定是那个子主机。
Content-Length
内容长度,就是Body的长度。
作用:用来判断内容结束。
Content-Type
内用类型,用来指定Body的类型,主要有四类:
- text/html,用于浏览器响应网页的请求,响应Body中返回HTML文本。
- application/x-www-form-urlencoded,普通表单的提交方式,用于请求体中,请求体的如下:name=xxx&age=19,如果数据包含&符号,会被编码,就像编码Url链接一样。
- multipart/form-data,二进制文件的提交方式,如:上传图片。一般后面会跟着一个 boundary。
- 什么是boundary:boundary 是一串复杂的字符串,用来区分 Body 有二进制文件时不同数据的分界线。如:上传用户信息时有用户的头像和姓名,这时 boundary 就被用来将 头像信息 和 姓名信息 区分开。
- application/json,json格式响应,用于 Web Api的响应或者 POST/PUT 的请求。
- image/jpeg | application/zip, 单文件,用于 Web Api的响应或者 POST/PUT 的请求。如:只上传头像。
状态码
对结果做出类型化的描述,如:成功、资源未找到。常用状态码如下:
- 1xx:临时性消息
- 100:继续发送
- 101:正在切换协议
- 2xx:成功
- 3xx:资源重定向
- 301:永久重定向,可以让浏览器做标记,旧网站的数据变成新网站的数据。
- 302:暂时重定向
- 304:内容未改变,
- 4xx:客户端错误,请求有问题。
- 401:未授权
- 404:资源找不到
- 5xx:服务器错误