IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> PHP精讲2021—从Yii2源码Response看web响应考察哪些知识点 -> 正文阅读

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

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

在这里插入图片描述

一、前言

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

不管你的前端是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',
    ];

对于服务端返回给客户端的数据,HTTP的状态码是非常有意义的。

有的同学不善于使用状态码,如果有异常,就写在响应内容里,但是这样就相当于放弃状态码设置的意义。

比如文件上传过大,约定俗成的状态码就是413,那么前端在拿到请求之后,可以优先识别状态码,不去解析返回值,就能在界面给用户提示,“文件过大,我忍不下。

3. 返回格式

    const FORMAT_RAW = 'raw';
    const FORMAT_HTML = 'html';
    const FORMAT_JSON = 'json';
    const FORMAT_JSONP = 'jsonp';
    const FORMAT_XML = 'xml';

YIi2框架内部给出的返回格式有四种

  1. raw
  2. html
  3. json
  4. jsonp
  5. xml

这几个格式不难理解,我在这里说下json和jsonp的区别

这是json,返回的Content-Type的值是application/json

 {"name": "xiaoyutongxue"} 

而jsonp返回的Content-Type的值是text/javascript,前端可以直接使用jsonpCallback进行回调。

4. 响应头

在这里插入图片描述

Yii2的响应头部发送是通过header()函数进行的,注意的是header()之前是不能有输出的,不然就会报错。

headers_sent()可以检测是不是之前已经有header输出了。

header("HTTP/{$this->version} {$statusCode} {$this->statusText}");

这就是响应中判断状态码的输出部分。

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

而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,可以设置多个并返回多个。

四、总结

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

在这里插入图片描述

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-08-13 11:42:08  更:2021-08-13 11:43:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/13 14:14:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码