## HTTP协议
#### HTTP是Web常见应用的网络协议,简称超文本传输协议
http是基于TCP传输层实现的,默认的TCP端口为80
http目前使用最多的版本是1.1,最新的版本是2.0,下个版本是3.0
http协议是无状态的
每次请求都是独立的,任何两个请求之间没有什么必然的联系
## 多次http请求
客户端请求网页多数情况不是一次请求就能成功的,首先是响应html页面,然后发现HTML页面还引用的了其他资源。例如css/js/图片等,还会自动发送http请求这些需要的资源。现在的http版本支持管道机制,可以同时请求和响应多个请求,大大提高了效率
## 基于TCP协议
HTTP协议目的是规定客户端和服务的数据传输的格式和数据交互行为,并不负责数据传输的细节。http底层基于TCP实现的,现在的版本默认持久连接,多次的http请求使用一个TCP连接。
## HTTP的组成
为请求和响应两个部分,请求是指客户端想服务器发送的消息;响应是指服务器收到信息后想客户端返回的信息
### URI(统一资源标识符)
**完整uri** :
http:user:pass@host.com:8080/p/a/t/h?query=string#hash
user 用户名(可选)
pass 对应密码(可选)
host.com 主机域名地址(或者IP地址)
8080 端口号,默认是80
/P/a/t/h 资源路径
query=string 参数传递,多个参数通过&拼接
hash 锚点
## 请求(Request):
1,请求行 (方法 路径 协议)
2,请求头信息 (格式为key=value)
3,请求主体信息 (可选,发送的内容)
请求头信息与主体信息之间要有一个空行
例子:
POST /index.php http/1.1
host:localhost
content-type:application/x-www-form-urlencoded
content-length:25
name=zhangsan
## 请求行
1,请求方法 GET POST HEAD DELETE PUT TRACE OPTIONS
2,请求路径 URL的一部分
3,所用协议 目前常用是1.1
## 请求头信息
1,post请求要注明请求主体的长度
content-length:length
2,服务器要能偶解析到POST数据还需要请求头包含数据类型
content-type:application/x-www-form-urlencoded
//需要经过url编码
格式为key:value (键值对)
## 请求主体
使用&拼接在一起的key=value键值对组成
使用CMD模拟HTTP请求:
1,服务器根目录创建index.php,内容为 <?php echo "Hello World";
2,打开CMD, telnet localhost 80
3,CTRL+]
4,get /index.php http/1.1
*****
HTTP/1.1 200 OK
Date: Wed, 13 Nov 2019 05:49:40 GMT
Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j mod_fcgid/2.3.9
X-Powered-By: PHP/5.3.29
Connection: close
Content-Type: text/html
Hello World
遗失对主机的连接。
*****
## 响应(Reponse)
响应行(协议 状态码 状态文字)
响应头信息 (格式为key=value)
空行
主体信息(可能为空)
例子:
HTTP/1.1 200 OK
Content-Type: text/html
content-length:25
hello
## HTTP动词
1,GET:获取资源
2,POST:创建资源
3,PUT:修改资源
4,HEAD:获得报文首部
5,DELETE:删除文件
6,OPTIONS:询问支持的方法
7,TRACE:追踪路径
8,CONNECT:用于隧道协议连接代理
## HTTP状态码与状态文字
状态码:用来反应服务器响应状态
状态文字:用来描述状态码的
### 5种分类:
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误
## Content-Type
·内容类型,定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件
### application/x-www-form-urlencoded (原生form表单传输方式)默认的连接方式
1,数据以key/value 中间用&连接
2,key和value都要用URL编码
POST http://www.example.com HTTP/1.1
Content-Type:application/x-www-form-urlencoded;charset=utf-8
*****
### multipart/form-data (表单上传)
POST http://www.example.com HTTP/1.1
Content-Type:multipart/form-data;boundary=---WebkitFormBoundaryrGKCBY7qhFd3TrwA
---WebkitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition:form-data;name="text"
title
---WebkitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition:form-data;name="file";filename="test.png"
Content-Type:image/png
*****
### application/json (API常用格式)
POST http://www.example.com HTTP/1.1
Content-Type:application/json;charset=utf-8
{"title":"test","sub":[1,2,3]}
## text/xml (API常用格式)
POST http://www.example.com HTTP/1.1
Content-Type:text/xml