HTTP
HTTP协议
HTTP协议概念
HTTP协议,即超文本传输协议(Hypertext transfer protocol)。是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。
HTTP协议是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。HTTP协议特点
- 客户/服务器模式:客户端(浏览器)/服务端
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
- 灵活:HTTP允许传输任意类型的数据对象(MIME类型)
- 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
HTTP协议分类
- http请求协议:浏览器向服务器发起请求的时候需要遵循的协议
- http响应协议:服务器向浏览器发起响应的时候需要遵循的协议
HTTP请求
请求行
- 形式:请求方式 资源路径 协议版本号
- GET /index.php HTTP/1.1
最早的时候HTTP协议有过1.0,请求行独占一行(第一行)
请求头
请求头就是各项协议内容:具体的协议内容不会每次都使用全部
- Host:请求的主机地址(必须)
- Accept:当前请求能够接收服务器返回的类型(MIME类型)
- Accept-Language:接收的语言
- User-Agent:客户浏览器所在电脑的一些信息
请求头不固定数量,每个请求协议也是独占一行,最后会有一行空行(用来区分请求头和请求体)
请求体
-
请求数据:POST请求会有请求体。GET请求所有的数据都是跟在URL之后,会在请求行中的资源路径上体现。
-
基本格式:资源名字=资源值&资源名字=资源值…
HTTP响应
响应行
- 形式(独占一行):协议版本号 + 状态码 + 状态消息 🌴
HTTP/1.1 200 ok
- 200 ok: 成功
- 403 Forbidden: 没权限访问
- 404 Not Found: 未找到页面
- 500 Server Internal Error: 服务器内部错误
响应头
具体协议内容 1)时间:Wed, 16 Sep 2017 11:43:33 GMT 2)服务器:Server: Apache/2.2.22 (Win32) PHP/5.3.13 3)内容长度:Content-Length: 1571,数据具体的字节数(响应体) 4)内容类型:Content-Type: text/html:告诉浏览器对应的数据格式
列举了几个常见的响应头,并不是全部:响应头一个占一行,最后一行空行(区分响应头和响应体)
响应体
实际服务器响应给浏览器的内容
HTTP状态码
🌈 W3C https://www.w3school.com.cn/tags/html_ref_httpmessages.asp
状态码200:成功
状态码403:forbidden,拒绝访问(没有权限)
状态码404:NOT FOUND,找不到
状态码500:服务器问题
1xx 信息
🌈 服务器正在处理过程中
消息: | 描述: |
---|---|
100 Continue | 服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求。 |
101 Switching Protocols | 服务器转换协议:服务器将遵从客户的请求转换到另外一种协议。 |
2xx 成功
🌈 服务器正常且正确处理
消息: | 描述: |
---|---|
200 OK | 请求成功(其后是对GET和POST请求的应答文档。) |
201 Created | 请求被创建完成,同时新的资源被创建。 |
202 Accepted | 供处理的请求已被接受,但是处理未完成。 |
203 Non-authoritative Information | 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝。 |
204 No Content | 没有新文档。浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。 |
205 Reset Content | 没有新文档。但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容。 |
206 Partial Content | 客户发送了一个带有Range头的GET请求,服务器完成了它。 |
3xx 重定向
🌈 请求的目标已经转移或者需要更新
消息: | 描述: |
---|---|
300 Multiple Choices | 多重选择。链接列表。用户可以选择某链接到达目的地。最多允许五个地址。 |
301 Moved Permanently | 所请求的页面已经转移至新的url。 |
302 Found | 所请求的页面已经临时转移至新的url。 |
303 See Other | 所请求的页面可在别的url下被找到。 |
304 Not Modified | 未按预期修改文档。客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。 |
305 Use Proxy | 客户请求的文档应该通过Location头所指明的代理服务器提取。 |
306 Unused | 此代码被用于前一版本。目前已不再使用,但是代码依然被保留。 |
307 Temporary Redirect | 被请求的页面已经临时移至新的url。 |
4xx 客户端错误
消息: | 描述: |
---|---|
400 Bad Request | 服务器未能理解请求。 |
401 Unauthorized | 被请求的页面需要用户名和密码。 |
402 Payment Required | 此代码尚无法使用。 |
403 Forbidden | 对被请求页面的访问被禁止。 |
404 Not Found | 服务器无法找到被请求的页面。 |
405 Method Not Allowed | 请求中指定的方法不被允许。 |
406 Not Acceptable | 服务器生成的响应无法被客户端所接受。 |
407 Proxy Authentication Required | 用户必须首先使用代理服务器进行验证,这样请求才会被处理。 |
408 Request Timeout | 请求超出了服务器的等待时间。 |
409 Conflict | 由于冲突,请求无法被完成。 |
410 Gone | 被请求的页面不可用。 |
411 Length Required | "Content-Length" 未被定义。如果无此内容,服务器不会接受请求。 |
412 Precondition Failed | 请求中的前提条件被服务器评估为失败。 |
413 Request Entity Too Large | 由于所请求的实体的太大,服务器不会接受请求。 |
414 Request-url Too Long | 由于url太长,服务器不会接受请求。当post请求被转换为带有很长的查询信息的get请求时,就会发生这种情况。 |
415 Unsupported Media Type | 由于媒介类型不被支持,服务器不会接受请求。 |
416 | 服务器不能满足客户在请求中指定的Range头。 |
417 Expectation Failed |
5xx 服务器错误
消息: | 描述: |
---|---|
500 Internal Server Error | 请求未完成。服务器遇到不可预知的情况。 |
501 Not Implemented | 请求未完成。服务器不支持所请求的功能。 |
502 Bad Gateway | 请求未完成。服务器从上游服务器收到一个无效的响应。 |
503 Service Unavailable | 请求未完成。服务器临时过载或当机。 |
504 Gateway Timeout | 网关超时。 |
505 HTTP Version Not Supported | 服务器不支持请求中指明的HTTP协议版本。 |
HTTP响应设置及使用
PHP中针对HTTP协议(响应)进行了底层设计,可以通过函数header来实现修改HTTP响应(响应头)
注意事项:
- Header可以设计HTTP响应,因为HTTP协议特点是:响应行,响应头(空行结尾),响应体。认为通过header设计响应头的时候,不应该有任何内容输出,所以一旦产生内容输出(哪怕一个空格),系统都会认为响应头已经结束而响应体开始了,所有如果先输出内容后设置响应头(header使用),理论设置无效;
- 在PHP5以后,增加程序缓存内容:允许服务器脚本在输出内容的时候,不直接返回浏览器而是现在服务器端使用程序缓存保留(php.ini中使用output_buffering),有了该内容之后,在程序缓存内会自动调整响应头和响应体(允许响应头在已经输出的内容之后再设置),但是此时会报错(警告)。 总结:header设置响应体之前不要有任何输出
Location
Location:重定向,立即跳转(响应体不用解析) 浏览器在解析服务器响应的时候:先判定响应行,继续响应头,最后响应体:location是在响应头中,所以浏览器一旦见到该协议项,不再向下解析。
//content-type设置
header('Content-type:text/html;charset=utf-8');
echo '中国你好!';
//location:立即重定向
header('Location:index.php');
echo '世界你好!';
效果:两个 echo 都不会输出,直接跳转到 index.php 页面
Refresh
Refresh:重定向,定时跳转(响应体会解析) 延时重定向:浏览器会根据具体时间延迟后在访问指定跳转链接:浏览器在准备跳转访问之前,会继续解析HTTP协议(响应头和响应体)
//content-type设置
header('Content-type:text/html;charset=utf-8');
echo '中国你好!';
//refresh:延时重定向
header('Refresh:3;url=index.php');
echo '世界你好!';
效果:先输出两个 echo , 再跳转页面
Content-type
Content-type:内容类型,MIME类型 通过内容告知(MIME类型),浏览器正确解析内容
Content-disposition
Content-disposition:内容类型,MIME类型扩展,激活浏览器文件下载对话框 浏览器在解析内容的时候,默认是直接解析:那么有时候需要浏览器不解析,当做内容下载成文件
//Content-disposition
header('Content-disposition:attachment;filename=girl.jpg');
echo 'hello world';
效果:
PHP模拟HTTP请求
原理: PHP可以通过模拟HTTP协议发起HTTP请求
CURL是一个非常强大的开源库,支持很多协议,包括HTTP、FTP、TELNET等,我们使用它来发送HTTP请求。它给我 们带来的好处是可以通过灵活的选项设置不同的HTTP协议参数,并且支持HTTPS。CURL可以根据URL前缀是“HTTP” 还是“HTTPS”自动选择是否加密发送内容。
前提条件:HTTP协议的客户端/服务端模式,HTTP协议不局限于一定要浏览器访问
CURL 扩展库使用
PHP5方案:
- 开启
CURL
扩展extension=curl
-
有的时候PHP版本会出现即使开启了扩展也无法使用扩展的可能:因为CURL找不到对应的dll文件:需要将相关的DLL文件复制一份到
C:\Windows
下 - 重启Apache服务
✨ PHP 7.3.10 已经没有上面这俩个文件,解决方法:
- 将 extension=curl 前的分号去掉;
- 将 php 目录下的 libssh2.dll 拷贝到 apache 安装目录的bin目录下
- 重启 apache
命令执行:
- 建立连接:curl_init():激活一个CURL连接功能 ,开启会话:
$ch = curl_init();
- 设置请求选项:curl_setopt():设定选项
全部选项 👉 https://www.runoob.com/php/func-curl_setopt.html
CURLOPT_URL :连接对象
CURLOPT_RETURNTRANSFER :将服务器执行的结果(响应)以文件流的形式返回给请求界面(PHP脚本)
CURLOPT_POST :是否才有POST方式发起请求(默认请求是GET)
CURLOPT_POSTFIELDS :用来传递POST提交的数据,分为两种方式:字符串(name=abc&password=123)以及数组形式(array(‘name’=>’abc’,…))
CURLOPT_HEADER :是否得到响应的header信息(响应头),默认不获取
//设置连接选项
curl_setopt($ch,CURLOPT_URL,'localhost/index.php'); //连接选项
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE); //文件流形式返回数据(不直接显示)
curl_setopt($ch,CURLOPT_HEADER,1); //是否获取响应头信息
- 执行请求:curl_exec():执行选项(与服务器发起请求),得到服务器返回的内容 乱码原因:20select.php中的内容有告知浏览器,但是当前是被服务器脚本23curl_http.php访问的,没有做解析;输出给浏览器之后,需要当前23curl_http.php告知浏览器对应的字符集
- 关闭连接:curl_close():关闭资源
curl_close($ch);
//如果要使用post
curl_setopt($ch,CURLOPT_POST,TRUE);
curl_setopt($ch,CURLOPT_POSTFIELDS,array());
//执行
$content = curl_exec($ch);
echo $content;
//关闭资源
curl_close($ch);
🍎
resource(2) of type (curl)
HTTP/1.1 200 OK
Date: Fri, 25 Oct 2019 06:56:40 GMT
Server: Apache/2.4.41 (Win64) OpenSSL/1.1.1c PHP/7.3.10
X-Powered-By: PHP/7.3.10
Content-Length: 211
Content-Type: text/html; charset=UTF-8
首页 -
HTML 教程 -
CSS 教程 -
JavaScript 教程 -
PHP 教程