header 协议格式
1、请求头:报文主要包含四个部分:
- 请求行(例如
GET /images/logo.gif HTTP/1.1
,表示从/images目录下请求logo.gif) - 请求头(例如
Host: abc.xxx.com;Connection: keep-alive
) - 空行
- 消息数据实体(正文)
注:在HTTP/1.1协议中,所有的请求头,除Host外,都是可选的。
HTTP消息头支持自定义, 自定义的专用消息头一般会添加X-
前缀。
请求行和标题必须以 CRLF
(回车换行符) 作为结尾。空行内必须只有 CRLF
而无其他空格。
根据HTTP标准,HTTP请求可以使用多种请求方法。
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD
方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT
方法。
2、响应头:报文也是四个部分:
- 状态行(例如
HTTP/1.1 200 OK
,请求成功) - 响应头(例如
Date: Thu, 09 Sep…;Content-Type: application/json; charset=utf-8
) - 空行
- 响应正文
状态行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
HTTP-Version表示服务器HTTP协议的版本;
Status-Code表示服务器发回的响应状态代码;
Reason-Phrase表示状态代码的文本描述。
示例
请求(Request)示例:
POST /get/your/answer HTTP/1.1
Host: abc.xxx.com
Connection: keep-alive
Content-Length: 123
Accept: application/json, text/plain, */*
Origin: xxxxx(一个有效域名)
User-Agent: Mozilla/5.0 (Linux; Android 5.1.1;……) Chrome/39.0.0.0 Mobile
Content-Type: application/x-www-form-urlencoded
Referer: xxxxx(一个有效的URL)
Accept-Language: zh-CN,en-US;q=0.8
Cookie: cookid=whoami_hahaha
X-Requested-With: (自定义消息头,一般会添加 X- 前缀)
msg=haha&version=1.1.10&type=1234(注意,POST请求的数据在这里)
另,GET请求header头,数据参数不会出现在消息实体中,而是在请求行
中,示例:
GET /your/intf?type=1&show=2 HTTP/1.1(注意,GET请求的数据在这里)
Host: xxx
Connection: keep-alive
……
应答(Response)示例:
HTTP/1.1 200 OK
Date: Thu, 09 Sep 2021 01:11:16 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Server: Apache
tracecode: 12345678
Connection: close
{"result":{"errcode":0,"message":"你瞅啥","data":["abc"]}}
或者
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
……
HTTP版本升级带来的变化
1、在HTTP 0.9和1.0中,TCP连接在每一次请求/回应对之后关闭。
在HTTP 1.1中,引入了保持连线(keep-alive
)的机制,一个连接可以重复在多个请求/回应使用。持续连线的方式可以大大减少等待时间,因为在发出第一个请求后,双方不需要重新运行TCP握手程序。
2、HTTP 1.1还改进了HTTP 1.0的带宽。
例如,HTTP 1.1引入了分块传输编码,以允许传递内容可以持续在线,被流传输,而不必使用缓冲器。
HTTP管道允许客户端在收到每个回应之前发送多个请求,进一步减少用户感受到的滞后时间。协议的另一个补充是字节服务,允许客户端请求资源的某一部分,服务器仅回应某资源的指明部分。
3、在HTTP1.0,单一TCP连接内仅执行一个“客户端发送请求—服务器发送应答”周期,之后释放TCP连接。
在HTTP1.1优化支持持续活跃连接:客户端连续多次发送请求、接收应答;批量多请求时,同一TCP连接在活跃(Keep-Live)间期内复用,避免重复TCP初始握手活动,减少网络负荷和响应周期。
此外,支持应答到达前继续发送请求(通常是两个),称为“流线化”(stream)。
HTTP状态码
HTTP 状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息--表示请求已接收,继续处理。
2xx:成功--表示请求已被成功接收、理解、接受。
3xx:重定向--要完成请求必须进行更进一步的操作。
4xx:客户端错误--请求有语法错误或请求无法实现。
5xx:服务器端错误--服务器未能实现合法的请求。
30x-跳转示例:
header("HTTP/1.1 301 Moved Permanently");
header('Location:新的url地址');