PHP精讲2021—从Yii2源码Response看web响应考察哪些知识点

举报
小雨青年 发表于 2022/03/28 23:28:12 2022/03/28
【摘要】 生活中没有弱者,仅有不愿努力的人。 🐮 目录 一、前言二、源码分析1. 执行流程2. HTTP状态码3. 返回格式4. 响应头5. 快捷方法 三、知识点汇总1. HTTP状态...

生活中没有弱者,仅有不愿努力的人。 🐮

在这里插入图片描述

一、前言

不管你是做接口还是做网站,都避免不了要返回数据给前端。

不管你的前端是js还是iOS,你的服务器数据总要返回出来。

不管你是token验证还是session校验,你总是要返回身份认证。

二、源码分析

Yii2的响应类Response的所在位置是vendor/yiisoft/yii2/web/Response.php,web相关的请求都会走这个类的方法。

1. 执行流程

web返回网页请求数据的流程是

  1. 判断是否已经发送完成
  2. 执行发送前的触发器
  3. 准备工作
  4. 执行准备后的触发器
  5. 发送响应头部
  6. 发送响应内容
  7. 执行发送后的触发器
  8. 设置发送状态为已发送

除去各个动作的触发器和状态判断,Yii2的核心流程有三点

  1. 准备。根据设置的格式对响应内容进行格式化。
  2. 发送响应头部。具体的操作有
    1. 设置header()
    2. 设置HTTP状态码
    3. 发送cookies
  3. 发送响应内容。

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框架内部给出的返回格式有四种

  1. raw
  2. html
  3. json
  4. jsonp
  5. 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最后会被浏览器拿到存在本地

image-20210811165145287

5. 快捷方法

在响应类里,框架给出了几个直接使用的方法,这样就不需要自己去设置响应头部了

  1. sendFile() 下载文件
  2. redirect() 跳转页面

这里不作为重点讲解。

在这里插入图片描述

三、知识点汇总

1. HTTP状态码

HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。它由 RFC 2616 规范定义的,并得到RFC 2518、RFC 2817、RFC 2295、RFC 2774、RFC 4918等规范扩展。

所有状态码的第一个数字代表了响应的五种状态之一。

image-20210811172442360

image-20210811172501362

image-20210811172517455

image-20210811172533741

image-20210811172548595

2. 301和302的区别

301重定向表示资源的永久迁移,一般网站改版地址变化会采用301。

302重定向表示暂时的资源移动,原来的资源还是有效的。

3. 浏览器是如何获取Cookie的

PHP端使用setcookie()函数设置。返回响应的header中字段为Set-Cookie,可以设置多个并返回多个。

四、总结

我们能通过阅读框架源码理解项目中的每个步骤的具体操作,并能在此学到相关的基础知识,这些知识可以被用在实际项目中或者面试题里,还可以潜移默化提高自己的内功。

在这里插入图片描述

文章来源: coderfix.blog.csdn.net,作者:小雨青年,版权归原作者所有,如需转载,请联系作者。

原文链接:coderfix.blog.csdn.net/article/details/119631757

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。