Http(HyperText Transfer Protocol),叫做超文本传输协议,它属于应用层协议,是基于Tcp连接的。它是一种基于请求/响应模式的,无状态的协议。
http1.0的特点:一次连接一次响应后就断开;
http1.1的特点:持续连接,在一次连接中可发送多个请求,不必等待每次请求的响应是否到来。
一般用浏览器来发送http协议,但是也可用别的工具来发送http协议。如telnet。
telnet的连接方式:
1.打开windows的cmd.exe,然后输入:
telnet [IP地址或域名] [port端口]
2.按下 CTRL+]
后回车打开回显功能(能看见你输入的内容)
接着尝试访问tel.php的内容
<?php
echo "hello";
?>
在回显界面输入
GET /phpTest/tel.php HTTP/1.1
Host:localhost
结果如下
详细解析:
头信息:
1.GET是请求方法method
2./phpTest/tel.php 是请求资源
3.HTTP/1.1 是请求所用的协议版本
头信息结束后有一个空行
空行后回车会显示响应信息
响应行:协议版本 状态码 状态文字
响应头信息的格式 key:value
用telnet模拟发送POST请求来访问tel2.php
<?php
var_dump($_POST);
?>
带信息请求需要在头信息附加Content-type和Content-length
头信息在空行后,需要填写附带的主体信息,该信息的长度需与Content-length一致
HTTP请求
由三部分组成:请求行,消息报头,请求正文,请求格式为:Method Request-URI HTTP-Version CRLF 除了作为结尾的CRLF外,不允许出现单独的CR或LF字符,CRLF表示回车换行。
请求方法 | 说明 |
---|---|
get | 请求获取由Request-URI所标识的资源,(查询) |
post | 在Request-URI所标识的资源后附加新的资源,(查询+更新) |
put | 请求服务器存储一个资源,并用Request-URI作为其标识,(增加) |
delete | 请求服务器删除由Request-URI所标识的资源,(删除) |
head | 请求获取由Request-URI所标识的资源的响应消息报头,常用于测试超链接的有效性,是否可以访问,以及最近是否更新等 |
trace | 请求服务器回送受到的请求信息,主要用于测试或诊断 |
connect | 保留将来使用 |
options | 请求查询服务器的性能,或者查询与资源相关的选项和需求 |
当我们通过浏览器地址栏中直接输入网址的方式去访问网页时,浏览器采用的就是GET方法向服务器获取资源
Tips:在HTML中书写get和post不区分大小写,但在HTTP协议中的GET和POST只能是大写形式
HEAD只确认一个内容(如图片)是否还正常存在,而不返回该内容,这时用HEAD
如下,访问tel.php并没有输出hello的内容信息,而是返回响应信息而已
TRACE用代理上网,比如代理访问news.163.com,你想看看代理有没有修改你的HTTP请求,就可以用TRACE测试一下
OPTIONS返回服务器可用的请求方法
状态码
状态码 | 定义 | 说明 |
---|---|---|
1xx | 指示信息-表示请求已接收,继续处理 | |
2xx | 表示请求已经被成功接收,理解,接受 | |
3xx | 重定向-要完成请求必须进行更进一步的操作 | |
4xx | 客户端错误-请求有语法错误或请求无法实现 | |
5xx | 服务器端错误-服务器未能实现合法的请求 |
304 not modify
浏览器用缓存技术,使得再次请求时,不从服务器获取,而是从浏览器缓存获取。
如第一次请求某一资源时,它的响应信息有一个ETag和Last-Modified来标志该资源是否在缓存里和是否被修改过
当第二次请求时,浏览器带着ETag信息和Last-Modified分别包装成If-None-Match和If-Modified-Since去请求资源,如果服务器没有修改过该资源,则服务器不必传送该资源,浏览器直接从缓存里获取
用telnet来模拟304 not modify
第一次请求(用HEAD方法,不返回内容,但可以看到Content-length是有内容的):
第二次请求(携带If-None-Match和If-Modified-Since信息):
可以看到状态码304,并且服务器的响应信息并没有返回内容
重定向
302临时重定向
header(‘Location: http://www.baidu.com‘);
301永久重定向
header(‘Location: http://www.baidu.com‘,true,301);
307重定向中保持原有的数据保持
1.如test.html做一个表单,将数据post到tel.php
<form action="tel.php" method="post">
<input type="text" name="username" />
<input type="submit" name="submit" />
</form>
2.tel.php将页面重定向到tel2.php
<?php
header('Location: tel2.php');
?>
3.tel2.php输出post数据
<?php
var_dump($_POST);
?>
根据上面的流程,运行一下test.html表单页面
可以看到tel.php临时重定向到tel2.php后,tel2.php并无法获取到POST的数据
解决方法,用307重定向
修改tel.php内容为:
<?php
header('Location: tel2.php',true,307);
?>
然后再运行一个test.html表单页面
307重定向后原数据也得到保持