
后端Web框架【免费下载链接】CodeIgniter4Open Source PHP Framework (originally from EllisLab)项目地址https://gitcode.com/gh_mirrors/co/CodeIgniter4点击查看免费下载本指南以 CodeIgniter 4 官方用户指南 request.rst 为主体系统讲解框架中CodeIgniter\HTTP\Request类的设计定位、完整 API 与底层实现。阅读本文后你将掌握如何获取并校验客户端 IP、如何读取与伪造 HTTP 请求方法、如何安全地带过滤地访问$_SERVER/$_ENV等 PHP 全局数据以及如何在测试场景中通过setGlobal()/fetchGlobal()注入和取回数据。一、Request 类的定位一个类两种角色Request类是 CodeIgniter 4 对 HTTP 请求的面向对象OOP表示。它的设计初衷是同时服务于两类请求传入请求Incoming浏览器等客户端发往应用程序的请求传出请求Outgoing应用程序向第三方服务发出的请求。为此Request类提供了这两类请求共同需要的通用功能而具体的差异化能力则交给两个继承它的子类去扩展子类用途对应文档CodeIgniter\HTTP\IncomingRequest处理来自浏览器等客户端的请求IncomingRequest 类CodeIgniter\HTTP\CURLRequest应用向第三方应用发送请求基于 cURLCURLRequest 类从源码看Request类位于 system/HTTP/Request.php它继承自OutgoingRequest并实现RequestInterface同时通过use RequestTrait引入大部分实际方法实现。构造时Request.php#L32-L43若未显式指定请求方法它会从$_SERVER[REQUEST_METHOD]读取缺省时回退为Method::GETpublic function __construct($config null) { $this-config $config ?? config(App::class); if ($this-method null || $this-method ) { $this-method $this-getServer(REQUEST_METHOD) ?? Method::GET; } if (! $this-uri instanceof URI) { $this-uri new URI(); } }因此在实际开发中你通常直接使用两个子类而Request类与RequestTrait中的方法IP 获取、方法读写、全局数据访问则会被它们自动继承。提示RequestTrait位于 system/HTTP/RequestTrait.php其中标注了 4.7.0 起$globals属性与populateGlobals()方法已逐步迁移到独立的 Superglobals 服务但公开 API 保持不变本文所述方法仍可正常使用。二、获取客户端 IPgetIPAddress()getIPAddress()用于返回当前用户的 IP 地址。若 IP 无效则返回0.0.0.0echo $request-getIPAddress();示例出自 request/001.php底层实现逻辑结合 RequestTrait.php#L62-L105 的实现其执行流程为若属性已缓存$this-ipAddress ! 直接返回缓存值从$_SERVER[REMOTE_ADDR]读取地址CLI 请求下该项为null直接返回0.0.0.0遍历Config\App::$proxyIPs中配置的可信代理若REMOTE_ADDR命中可信代理则改从对应 HTTP 头如X-Forwarded-For、X-Real-IP读取真实客户端 IP使用FormatRules::valid_ip校验最终地址不合法则返回0.0.0.0。关键Config\App::$proxyIPs反向代理配置getIPAddress()会参考Config\App::$proxyIPs设置只有当请求来自允许的代理 IP 时才会采信 HTTP 头中上报的客户端 IP避免伪造。配置位于 app/Config/App.php#L162-L183public array $proxyIPs [];示例配置键为代理 IP 或 CIDR 网段值为对应客户端 IP 的 HTTP 头public array $proxyIPs [ 10.0.1.200 X-Forwarded-For, 192.168.5.0/24 X-Real-IP, ];注意proxyIPs必须以“代理 IP 地址为键、HTTP 头名为值”的数组形式给出否则getIPAddress()会抛出ConfigException。底层通过checkIPAgainstProxy()支持 IPv4 / IPv6 及 CIDR 网段匹配见 RequestTrait.php#L167-L219。常见坑双栈服务器上代理的 IPv4 地址可能被报告为 IPv4 映射的 IPv6 形式如::ffff:192.168.5.21与192.168.5.0/24这类 IPv4 条目不匹配。此时需将映射形式如::ffff:192.168.5.21或::ffff:192.168.5.0/120也加入proxyIPs。该提示同样适用于isSecure()对X-Forwarded-Proto/Front-End-Https头的信任判断详见 incomingrequest.rst。三、IP 合法性校验isValidIP()已弃用isValidIP($ip[, $which ])接收一个 IP 地址返回布尔值表示其是否合法if (! $request-isValidIP($ip)) { echo Not Valid; } else { echo Valid; }示例出自 request/002.php第二个可选参数$which用于指定协议格式取值为ipv4或ipv6默认同时检查两种格式。值得注意的是getIPAddress()内部已经自动完成 IP 校验无需再额外调用本方法。弃用说明自4.0.5起该方法被标记为弃用官方建议改用 Validation 库 中的valid_ip规则未来版本将彻底移除。四、请求方法HTTP Method的读取与设置4.1 getMethod()读取请求方法getMethod()返回$_SERVER[REQUEST_METHOD]的值即当前请求的 HTTP 方法echo $request-getMethod(); // 输出: POST示例出自 request/003.php关于大小写需要特别留意HTTP 方法区分大小写按约定标准化方法使用全大写 US-ASCII 字母如GET、POST、DELETE。CodeIgniter 4 中 HTTP 方法以常量形式集中定义在 system/HTTP/Method.phpMethod::GET、Method::POST、Method::PUT、Method::PATCH、Method::DELETE等以及返回全部方法的Method::all()。如需小写形式自行用strtolower()包装即可。注意v4.5.0 之前getMethod()默认返回小写字符串如get、post这被官方认定为一个 bug当前版本返回大写。在 incomingrequest.rst 中另有更完整的is()方法v4.3.0 起可对 HTTP 方法、ajax、json做布尔判断。4.2 setMethod() 与 withMethod()设置/伪造请求方法方法版本行为返回值setMethod($method)自 4.0.5 弃用直接修改当前实例用于请求伪装/spoofing返回$thiswithMethod($method)4.0.5 新增克隆当前实例并修改方法原实例不变返回新请求实例withMethod()的不变性immutability实现见 Request.php#L68-L75public function withMethod($method) { $request clone $this; $request-method $method; return $request; }官方明确建议新代码一律使用withMethod()setMethod()仅作向后兼容保留源码中标注deprecated 4.0.5。OutgoingRequest基类中同样存在这两组方法见 system/HTTP/OutgoingRequest.php供传出请求场景使用。五、读取服务器与环境数据getServer() / getEnv()5.1 getServer()读取 $_SERVERgetServer()与IncomingRequest中的getPost()、getGet()、getCookie()用法一致只是数据源为$_SERVER。其签名如下getServer([$index null[, $filter null[, $flags null]]])读取单个值$request-getServer(some_data);示例出自 request/004.php同时读取多个键时把所需的键以数组传入返回以键名为下标的结果数组$request-getServer([SERVER_PROTOCOL, REQUEST_URI]);示例出自 request/005.php5.2 getEnv()读取 $_ENV已弃用getEnv()用法与getServer()完全一致只是数据源为$_ENV$request-getEnv(some_data);示例出自 request/006.php同样支持数组形式的批量读取$request-getEnv([CI_ENVIRONMENT, S3_BUCKET]);示例出自 request/007.php弃用说明自4.4.4起官方在源码中明确标注“该方法自始就无法正常工作”并建议改用全局辅助函数env()。请勿在新代码中使用getEnv()。5.3 参数详解与过滤能力getServer()的完整参数与 PHPfilter_input系列保持一致参考 RequestTrait.php#L230-L233参数类型说明$indexmixed取值键名为null时返回整个全局数组为数组时批量返回多个键$filterint要应用的过滤器类型取值见 PHP 手册“Types of filters”$flagsint\|array要应用的过滤器标志取值见 PHP 手册“Filter flags”fetchGlobal()是这一切的底层引擎未指定$filter时默认使用FILTER_UNSAFE_RAW原样返回不丢失任何内容指定过滤器后标量值经filter_var()处理数组值会通过array_walk_recursive()递归应用过滤器见 RequestTrait.php#L288-L366。六、操作 PHP 全局setGlobal() 与 fetchGlobal()这两个方法直接面向 PHP 超级全局变量$_GET、$_POST、$_COOKIE、$_SERVER、$_REQUEST是测试与自定义数据流场景的重要工具。6.1 setGlobal()手动设置全局值setGlobal($method, $value)$method全局名称小写如get、post、server、cookie、request$value要写入的数据返回$this以支持链式调用。底层实现见 RequestTrait.php#L260-L269它同时更新内部的$globals缓存并通过service(superglobals)-setGlobalArray()同步到新的 Superglobals 服务保证向后兼容。6.2 fetchGlobal()从全局读取并可选过滤fetchGlobal($method [, $index null[, $filter null[, $flags null]]])$method输入过滤器常量对应的全局名称小写其余参数与getServer()相同。其特性包括$index为null时返回整个全局数组支持数组下标语法取深层值例如fetchGlobal(post, clients[address][zipcode])可直接获取嵌套数组中的元素支持批量获取多个键传入数组支持递归过滤嵌套数组。这些行为在 tests/system/HTTP/RequestTest.php 中均有完整测试佐证例如testFetchGlobalsFiltersValues验证了FILTER_SANITIZE_ENCODED过滤后barscript变为bar%3Cscript%3EtestFetchGlobalReturnsSelectedKeys验证了数组键的批量读取。七、实战小结与安全建议优先使用继承子类日常开发中访问Request功能应通过IncomingRequest控制器内可用$this-request属性控制器外可通过 Services 获取传出场景使用CURLRequest具体见 IncomingRequest 类文档 与 CURLRequest 类文档。避开两个已弃用方法isValidIP()用 Validation 的valid_ip规则替代getEnv()用env()辅助函数替代。IP 获取务必配置可信代理一旦应用部署在反向代理Nginx、负载均衡等之后请务必在Config\App::$proxyIPs白名单中登记代理地址否则getIPAddress()可能读取到伪造的客户端 IP。访问全局数据时善用过滤器getServer()/fetchGlobal()的$filter/$flags参数可让你在取数的同时完成输入净化避免先取回再手工处理的繁琐与遗漏。保持对象不变性需要临时改变请求方法如测试、伪装时使用withMethod()它返回新实例而不会污染原请求对象。延伸阅读Request类还继承自Message类后者提供了headers()、header()、getBody()、getProtocolVersion()等消息级能力完整方法清单可在 incomingrequest.rst 的“Class Reference”一节查看。赞分享后端Web框架【免费下载链接】CodeIgniter4Open Source PHP Framework (originally from EllisLab)项目地址https://gitcode.com/gh_mirrors/co/CodeIgniter4点击查看免费下载相关推荐FastAPI Request 类参考直接访问原始 HTTP 请求对象的机制与源码解析FastAPI Request 类参考直接访问原始 HTTP 请求对象的机制与源码解析 本篇基于 FastAPI 官方参考文档 docs/en/docs/re后端Web框架API设计OpCore Simplify智能自动化黑苹果配置的革命性工具OpCore Simplify智能自动化黑苹果配置的革命性工具 还在为复杂的黑苹果配置过程而烦恼吗OpCore Simplify作为一款革命性的 OpenC开发工具CLIStarlette 请求对象完全指南从 ASGI scope 到 Request 的优雅封装Starlette 请求对象完全指南从 ASGI scope 到 Request 的优雅封装 导读 Request 是 Starlette 为 ASGI 应用后端Web框架创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考