PHP精讲2021—从Yii2源码Response看web响应考察哪些知识点
生活中没有弱者,仅有不愿努力的人。 🐮
一、前言
不管你是做接口还是做网站,都避免不了要返回数据给前端。
不管你的前端是js还是iOS,你的服务器数据总要返回出来。
不管你是token验证还是session校验,你总是要返回身份认证。
二、源码分析
Yii2的响应类Response
的所在位置是vendor/yiisoft/yii2/web/Response.php
,web相关的请求都会走这个类的方法。
1. 执行流程
web返回网页请求数据的流程是
- 判断是否已经发送完成
- 执行发送前的触发器
- 准备工作
- 执行准备后的触发器
- 发送响应头部
- 发送响应内容
- 执行发送后的触发器
- 设置发送状态为已发送
除去各个动作的触发器和状态判断,Yii2的核心流程有三点
- 准备。根据设置的格式对响应内容进行格式化。
- 发送响应头部。具体的操作有
- 设置
header()
- 设置HTTP状态码
- 发送cookies
- 设置
- 发送响应内容。
2. HTTP状态码
httpStatuses
被保存在一个静态变量里,也就是说实际业务中最常用的状态码就是这些。我们可以通过setStatusCode()
方法设置返回的状态码。
/**
* @var array list of HTTP status codes and the corresponding texts
*/
public static $httpStatuses = [
100 => 'Continue',
101 => 'Switching Protocols',
102 => 'Processing',
118 => 'Connection timed out',
200 => 'OK',
201 => 'Created',
202 => 'Accepted',
203 => 'Non-Authoritative',
204 => 'No Content',
205 => 'Reset Content',
206 => 'Partial Content',
207 => 'Multi-Status',
208 => 'Already Reported',
210 => 'Content Different',
226 => 'IM Used',
300 => 'Multiple Choices',
301 => 'Moved Permanently',
302 => 'Found',
303 => 'See Other',
304 => 'Not Modified',
305 => 'Use Proxy',
306 => 'Reserved',
307 => 'Temporary Redirect',
308 => 'Permanent Redirect',
310 => 'Too many Redirect',
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 Time-out',
409 => 'Conflict',
410 => 'Gone',
411 => 'Length Required',
412 => 'Precondition Failed',
413 => 'Request Entity Too Large',
414 => 'Request-URI Too Long',
415 => 'Unsupported Media Type',
416 => 'Requested range unsatisfiable',
417 => 'Expectation failed',
418 => 'I\'m a teapot',
421 => 'Misdirected Request',
422 => 'Unprocessable entity',
423 => 'Locked',
424 => 'Method failure',
425 => 'Unordered Collection',
426 => 'Upgrade Required',
428 => 'Precondition Required',
429 => 'Too Many Requests',
431 => 'Request Header Fields Too Large',
449 => 'Retry With',
450 => 'Blocked by Windows Parental Controls',
451 => 'Unavailable For Legal Reasons',
500 => 'Internal Server Error',
501 => 'Not Implemented',
502 => 'Bad Gateway or Proxy Error',
503 => 'Service Unavailable',
504 => 'Gateway Time-out',
505 => 'HTTP Version not supported',
507 => 'Insufficient storage',
508 => 'Loop Detected',
509 => 'Bandwidth Limit Exceeded',
510 => 'Not Extended',
511 => 'Network Authentication Required',
];
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
对于服务端返回给客户端的数据,HTTP的状态码是非常有意义的。
有的同学不善于使用状态码,如果有异常,就写在响应内容里,但是这样就相当于放弃状态码设置的意义。
比如文件上传过大,约定俗成的状态码就是413,那么前端在拿到请求之后,可以优先识别状态码,不去解析返回值,就能在界面给用户提示,“文件过大,我忍不下。”
3. 返回格式
const FORMAT_RAW = 'raw';
const FORMAT_HTML = 'html';
const FORMAT_JSON = 'json';
const FORMAT_JSONP = 'jsonp';
const FORMAT_XML = 'xml';
- 1
- 2
- 3
- 4
- 5
YIi2框架内部给出的返回格式有四种
- raw
- html
- json
- jsonp
- xml
这几个格式不难理解,我在这里说下json和jsonp的区别
这是json,返回的Content-Type
的值是application/json
{"name": "xiaoyutongxue"}
- 1
而jsonp返回的Content-Type
的值是text/javascript
,前端可以直接使用jsonpCallback
进行回调。
4. 响应头
Yii2的响应头部发送是通过header()
函数进行的,注意的是header()
之前是不能有输出的,不然就会报错。
headers_sent()
可以检测是不是之前已经有header输出了。
header("HTTP/{$this->version} {$statusCode} {$this->statusText}");
- 1
这就是响应中判断状态码的输出部分。
HTTP/1.1 200 OK
Cooike也是响应头的一部分,核心的PHP方法是通过setcookie()
实现的,最终的输出结果是
Set-Cookie: PHPSESSID=815*****1lmp0k1; expires=Fri, 10-Sep-2021 08:44:18 GMT; Max-Age=2592000; path=/; domain=blog.csdn.net/diandianxiyu_geek; HttpOnly
- 1
而cooike最后会被浏览器拿到存在本地
5. 快捷方法
在响应类里,框架给出了几个直接使用的方法,这样就不需要自己去设置响应头部了
sendFile()
下载文件redirect()
跳转页面
这里不作为重点讲解。
三、知识点汇总
1. HTTP状态码
HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。它由 RFC 2616 规范定义的,并得到RFC 2518、RFC 2817、RFC 2295、RFC 2774、RFC 4918等规范扩展。
所有状态码的第一个数字代表了响应的五种状态之一。
2. 301和302的区别
301重定向表示资源的永久迁移,一般网站改版地址变化会采用301。
302重定向表示暂时的资源移动,原来的资源还是有效的。
3. 浏览器是如何获取Cookie的
PHP端使用setcookie()
函数设置。返回响应的header中字段为Set-Cookie
,可以设置多个并返回多个。
四、总结
我们能通过阅读框架源码理解项目中的每个步骤的具体操作,并能在此学到相关的基础知识,这些知识可以被用在实际项目中或者面试题里,还可以潜移默化提高自己的内功。
文章来源: coderfix.blog.csdn.net,作者:小雨青年,版权归原作者所有,如需转载,请联系作者。
原文链接:coderfix.blog.csdn.net/article/details/119631757
- 点赞
- 收藏
- 关注作者
评论(0)