HTTP协议
目录
HTTP协议概念
HTTP协议即超文本传输协议(Hypertext Transfer Protocol)。是一种详细规定了了浏览器与万维网服务器之间互相通信的规则。
HTTP协议特点
1)客户/服务器模式
2)简单快速:客户向服务器请求服务时,只需传送请求方法和路径。
3)灵活:HTTP协议允许传输任意类型的数据对象
4)无连接:无连接的含义是限制每次连接只处理一个请求。
5)无状态:HTTP协议是无状态协议。无状态是指对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传。另一方面,在服务器不需要先前信息时它的应答就比较快。
HTTP协议分类
HTTP请求协议:浏览器向服务器发起请求的时候需要遵循的协议
HTTP响应协议:服务器向浏览器发起响应的时候需要遵循的协议。
HTTP请求
请求行
1)形式:请求方式 资源路径 协议版本号
2)GET/index.php HTTP/1.1
最早的时候HTTP协议有过1.0,请求行独占一行(第一行)
请求头
请求头就是各项协议内容,具体的协议内容不会每次都使用全部
1)Host:请求的主机地址(必须)
2)Accept:当前请求能够接受服务器返回的类型(MIME类型)
3)Accept-Language:接收的语言
4)User-Agent:客户浏览器电脑的一些信息
请求头不固定,每个请求协议也是独占一行,最后会有一行空行(用来区分请求头和请求体)
请求体
请求数据:POST请求才会有请求体。GET请求所有的数据都是跟在URL之后,会在请求行中的资源路径上体现。
基本格式:资源名字=资源值&资源名字=资源值…
HTTP响应
响应行
1)形式:协议版本号 状态码 状态信息
2)200 ok:成功
3)403 Forbidden:没权限访问
4)404 Not Found:未找到页面
5)500 Server Interval Error:服务器内部错误
响应头
具体协议内容
1)时间:Wed 16 Sep 2018 11:43:33 GMT
2)服务器 Server:Apache/2.4(win64) PHP/7
3)内容长度 Content-Length:1571,数据具体的字节数(响应体)
4)内容类型 Conetent-Type:告诉浏览器对应的数据格式
列举了几个常见的响应头,并不是全部:响应头一个占一行,最后一行空行(区分响应头和响应体)
响应体
实际服务器响应给浏览器的内容
常见的HTTP状态码
状态码 200:成功
状态码 403:forbidden,拒绝访问(没有权限)
状态码 404:not found,找不到页面
状态码 500:服务器问题
W3C里面的HTML下面的HTTP消息,查看状态码
1XX:信息 2XX:成功 3XX:重定向 4XX:客户端错误 5XX:服务器错误
HTTP响应
常见的HTTP响应设置及使用
PHP中针对HTTP协议(响应)进行了底层设计,可以通过函数header来实现修改HTTP响应(响应头)
注意事项:
1、Header可以设计HTTP响应,因为HTTP协议特点是:响应行、响应头(空行结尾),响应体。认为通过header设计响应头的时候,不应该有任何内容输出,所以一旦产生内容输出(哪怕是一个空格),系统都回认为响应头已经结束而响应体开始了,所以如果先输出内容后设置响应头(header使用),理论设置无效。
2、在PHP5以后,增加程序缓存内容:允许服务器脚本在输出内容的时候,不直接返回给浏览器而是现在服务器端使用程序缓存保留(php.ini中使用output_buffering),有了该内容之后,在程序缓存内会自动调整响应头和响应体(允许响应头在已经输出的内容之后再设置),但是此时会报错(警告)。
总结:header设置响应体之前不要有任何输出。
Location:重定向,立即跳转(响应体不用解析)
浏览器在解析服务器响应的时候:先判定响应行,继续响应头,最后响应体:location是在响应头中,所以浏览器一旦见到该协议项,不再向下解析。
Refersh:重定向,定时跳转(响应体会解析)
延时重定向:浏览器会根据具体时间延迟后在访问指定跳转链接:浏览器在准备跳转访问之前,会继续解析HTTP协议(响应头和响应体)
Conetent-type:内容类型,MIME类型
通过内容告知(MIME类型),浏览器正确解析内容
Content-disposition:内容类型,MIMIE类型扩展,激活浏览器文件下载对话框。
浏览器在解析内容的时候,默认是直接解析:那么有时候需要浏览器不解析,当做内容下载成文件
PHP模拟HTTP请求
原理
PHP可以通过模拟HTTP协议发起HTTP请求
CURL是一个非常强大的开源库,支持很多协议,包括HTTP、FTP、Telnet等,我们使用它来发送HTTP请求。它给我们带来的好处是可以通过灵活的选项设置不同的HTTP协议参数,并且支持HTTPS。CURL可以根据URL前缀是“HTTP”还是“HTTPS”自动选择是否加密发送内容
前提条件:HTTP协议是客户端/服务端模式,HTTP协议不局限于一定要浏览器访问。
Curl扩展库使用
1、开启CURL扩展
2、有的时候,PHP版本会出现即使开启了扩展也无法使用扩展的可能:因为CURL找不到对应的dll文件,需要将相关DLL文件放在C:\windows
3、重启Apache应用
1)建立连接:curl_init():激活一个CURL连接功能
2)设置请求选项:curl_setopt():设定选项
CURLOPT_URL:需要获取的 URL 地址,也可以在curl_init() 初始化会话的时候。
CURLOPT_RETURNTRANSFER:将服务器执行的结果(响应)以文件流的形式返回给请求界面(PHP脚本)
CURLOPT_POST :是否采用POST方式发起请求(默认请求是GET)
CURLOPT_POSTFIELDS:用来传递POST提交的数据。分为两种方式:字符串(name =abc&password=123)以及数组形式(array(‘name’=>’abc’,…))
CURLOPT_HEADER:是否得到相应的header信息(响应头),默认不获取。 启用时会将头文件的信息作为数据流输出。
3)执行请求:curl_exec():执行选项(与服务器发起请求),得到服务器返回的内容
如有乱码,加一个header('Content-type:text/html;charset=utf-8');
4)关闭连接:curl_close():关闭资源