
后端Web框架【免費下載鏈接】CodeIgniter4Open Source PHP Framework (originally from EllisLab)項目地址https://gitcode.com/gh_mirrors/co/CodeIgniter4點擊查看免費下載本指南以 CodeIgniter 4 官方用戶指南 request.rst 為主體系統(tǒng)講解框架中CodeIgniter\HTTP\Request類的設計定位、完整 API 與底層實現。閱讀本文后你將掌握如何獲取并校驗客戶端 IP、如何讀取與偽造 HTTP 請求方法、如何安全地帶過濾地訪問$_SERVER/$_ENV等 PHP 全局數據以及如何在測試場景中通過setGlobal()/fetchGlobal()注入和取回數據。一、Request 類的定位一個類兩種角色Request類是 CodeIgniter 4 對 HTTP 請求的面向對象OOP表示。它的設計初衷是同時服務于兩類請求傳入請求Incoming瀏覽器等客戶端發(fā)往應用程序的請求傳出請求Outgoing應用程序向第三方服務發(fā)出的請求。為此Request類提供了這兩類請求共同需要的通用功能而具體的差異化能力則交給兩個繼承它的子類去擴展子類用途對應文檔CodeIgniter\HTTP\IncomingRequest處理來自瀏覽器等客戶端的請求IncomingRequest 類CodeIgniter\HTTP\CURLRequest應用向第三方應用發(fā)送請求基于 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(); } }因此在實際開發(fā)中你通常直接使用兩個子類而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 的實現其執(zhí)行流程為若屬性已緩存$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用于指定協(xié)議格式取值為ipv4或ipv6默認同時檢查兩種格式。值得注意的是getIPAddress()內部已經自動完成 IP 校驗無需再額外調用本方法。棄用說明自4.0.5起該方法被標記為棄用官方建議改用 Validation 庫 中的valid_ip規(guī)則未來版本將徹底移除。四、請求方法HTTP Method的讀取與設置4.1 getMethod()讀取請求方法getMethod()返回$_SERVER[REQUEST_METHOD]的值即當前請求的 HTTP 方法echo $request-getMethod(); // 輸出: POST示例出自 request/003.php關于大小寫需要特別留意HTTP 方法區(qū)分大小寫按約定標準化方法使用全大寫 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供傳出請求場景使用。五、讀取服務器與環(huán)境數據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變?yōu)閎ar%3Cscript%3EtestFetchGlobalReturnsSelectedKeys驗證了數組鍵的批量讀取。七、實戰(zhàn)小結與安全建議優(yōu)先使用繼承子類日常開發(fā)中訪問Request功能應通過IncomingRequest控制器內可用$this-request屬性控制器外可通過 Services 獲取傳出場景使用CURLRequest具體見 IncomingRequest 類文檔 與 CURLRequest 類文檔。避開兩個已棄用方法isValidIP()用 Validation 的valid_ip規(guī)則替代getEnv()用env()輔助函數替代。IP 獲取務必配置可信代理一旦應用部署在反向代理Nginx、負載均衡等之后請務必在Config\App::$proxyIPs白名單中登記代理地址否則getIPAddress()可能讀取到偽造的客戶端 IP。訪問全局數據時善用過濾器getServer()/fetchGlobal()的$filter/$flags參數可讓你在取數的同時完成輸入凈化避免先取回再手工處理的繁瑣與遺漏。保持對象不變性需要臨時改變請求方法如測試、偽裝時使用withMethod()它返回新實例而不會污染原請求對象。延伸閱讀Request類還繼承自Message類后者提供了headers()、header()、getBody()、getProtocolVersion()等消息級能力完整方法清單可在 incomingrequest.rst 的“Class Reference”一節(jié)查看。贊分享后端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開發(fā)工具CLIStarlette 請求對象完全指南從 ASGI scope 到 Request 的優(yōu)雅封裝Starlette 請求對象完全指南從 ASGI scope 到 Request 的優(yōu)雅封裝 導讀 Request 是 Starlette 為 ASGI 應用后端Web框架創(chuàng)作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考