摘要:簡述交互主要分為請求和響應兩種方式。狀態碼構建響應時,最先應做的是標識請求是否成功處理的狀態,可通過設置屬性,該屬性使用一個有效的狀態碼。
簡述
HTTP交互主要分為 request(請求) 和 response(響應) 兩種方式。
對于Yii2來說,HTTP的request請求是用 YII::$app->request 來表示的對象,這是Yii提供的處理HTTP的request請求的插件,里面有很多實用的功能代碼:
request; if ($request->isGet) { echo $request->get("id", "get獲取的值為空"); } else if ($request->isPost) { $request->post("name", "post傳遞的值為空"); } echo $request->userIp; // 獲取當前IP地址 ?>
對于Yii2來說,HTTP的response請求是用 YII::$app->response 來表示的對象,這是Yii提供的處理HTTP的response請求的插件,里面與很多實用的功能代碼:
response; // 設置服務器返回的狀態碼設置 $response->statusCode = "404"; // 設置pragma的設置,提醒瀏覽器不設置緩存 $response->headers->add("pragma", "no-chche"); // 設置pragma的設置,提醒瀏覽器設置緩存5秒 $response->headers->set("pragma", "max-age=5"); $response->headers->remove("pragma"); // 設置頁面跳轉到指定路徑 $response->headers->add("location", "https://rongx.github.io"); // 設置頁面跳轉,狀態碼設置為302(調用Controller里面的方法) $this->redirect("https://rongx.github.io", 302); // 設置文件下載鏈接 $response->headers->add("content-dispostion", "attachment; filename="a.jpg""); // 提供文件下載,文件路徑實相對與入口文件來說的 $response->sendFile("./b.jpg"); ?>
其實在 yiiwebController 里面也有很多處理HTTP的小插件功能代碼。
請求參數(request)要獲取請求參數,你可以調用 request 組件的 yiiwebRequest::get() 方法和 yiiwebRequest::post() 方法。他們分別返回 $_GET 和$_POST 的值。
$request = Yii::$app->request; $get = $request->get(); // 等價于: $get = $_GET; $id = $request->get("id"); // 等價于: $id = isset($_GET["id"]) ? $_GET["id"] : null; $id = $request->get("id", 1); // 等價于: $id = isset($_GET["id"]) ? $_GET["id"] : 1; $post = $request->post(); // 等價于: $post = $_POST; $name = $request->post("name"); // 等價于: $name = isset($_POST["name"]) ? $_POST["name"] : null; $name = $request->post("name", ""); // 等價于: $name = isset($_POST["name"]) ? $_POST["name"] : "";
信息:建議你像上面那樣通過 request 組件來獲取請求參數,而不是 直接訪問 $_GET 和 $_POST。
信息:這使你更容易編寫測試用例,因為你可以偽造數據來創建一個模擬請求組件。
當實現 RESTful APIs 接口的時候,你經常需要獲取通過PUT, PATCH或者其他的 request methods 請求方法提交上來的參數。
你可以通過調用 yiiwebRequest::getBodyParam() 方法來獲取這些參數。例如:
$request = Yii::$app->request; // 返回所有參數 $params = $request->bodyParams; // 返回參數 "id" $param = $request->getBodyParam("id");
信息:不同于 GET 參數,POST,PUT,PATCH 等等這些提交上來的參數是在請求體中被發送的。
信息:當你通過上面介紹的方法訪問這些參數的時候,request 組件會解析這些參數。
信息:你可以通過配置 yiiwebRequest::parsers 屬性來自定義怎樣解析這些參數。
請求方法(request)你可以通過 request 表達式來獲取當前請求使用的HTTP方法。
這里還提供了一整套布爾屬性用于檢測當前請求是某種類型。例如:
$request = Yii::$app->request; if ($request->isAjax) { /* 該請求是一個 AJAX 請求 */ } if ($request->isGet) { /* 請求方法是 GET */ } if ($request->isPost) { /* 請求方法是 POST */ } if ($request->isPut) { /* 請求方法是 PUT */ }請求URLs(request)
request 組件提供了許多方式來檢測當前請求的URL。
假設被請求的URL是 http://example.com/admin/index.php/product?id=100, 你可以像下面描述的那樣獲取URL的各個部分:
yiiwebRequest::url:返回 /admin/index.php/product?id=100, 此URL不包括host info部分。
yiiwebRequest::absoluteUrl:返回 http://example.com/admin/index.php/product?id=100, 包含host infode的整個URL。
yiiwebRequest::hostInfo:返回 http://example.com, 只有host info部分。
yiiwebRequest::pathInfo:返回 /product, 這個是入口腳本之后,問號之前(查詢字符串)的部分。
yiiwebRequest::queryString:返回 id=100,問號之后的部分。
yiiwebRequest::baseUrl:返回 /admin, host info之后, 入口腳本之前的部分。
yiiwebRequest::scriptUrl:返回 /admin/index.php, 沒有path info和查詢字符串部分。
yiiwebRequest::serverName:返回 example.com, URL中的host name。
yiiwebRequest::serverPort:返回 80, 這是web服務中使用的端口。
HTTP頭(request)你可以通過 yiiwebRequest::headers 屬性返回的 yiiwebHeaderCollection 獲取HTTP頭信息。 例如:
// $headers 是一個 yiiwebHeaderCollection 對象 $headers = Yii::$app->request->headers; // 返回 Accept header 值 $accept = $headers->get("Accept"); if ($headers->has("User-Agent")) { /* 這是一個 User-Agent 頭 */ }
請求組件也提供了支持快速訪問常用頭的方法,包括:
yiiwebRequest::userAgent:返回 User-Agent 頭。
yiiwebRequest::contentType:返回 Content-Type 頭的值, Content-Type 是請求體中MIME類型數據。
yiiwebRequest::acceptableContentTypes:返回用戶可接受的內容MIME類型。 返回的類型是按照他們的質量得分來排序的。得分最高的類型將被最先返回。
yiiwebRequest::acceptableLanguages:返回用戶可接受的語言。 返回的語言是按照他們的偏好層次來排序的。第一個參數代表最優先的語言。
假如你的應用支持多語言,并且你想在終端用戶最喜歡的語言中顯示頁面,那么你可以使用語言協商方法 yiiwebRequest::getPreferredLanguage()。
這個方法通過 yiiwebRequest::acceptableLanguages 在你的應用中所支持的語言列表里進行比較篩選,返回最適合的語言。
提示:你也可以使用 yiifiltersContentNegotiator 過濾器進行動態確定哪些內容類型和語言應該在響應中使用。
這個過濾器實現了上面介紹的內容協商的屬性和方法。
你可以通過 yiiwebRequest::userHost 和 yiiwebRequest::userIP 分別獲取host name和客戶機的IP地址, 例如,
$userHost = Yii::$app->request->userHost; $userIP = Yii::$app->request->userIP;響應(response)
當應用完成處理一個請求后, 會生成一個yiiwebResponse響應對象并發送給終端用戶 響應對象包含的信息有HTTP狀態碼,HTTP頭和主體內容等。
網頁應用開發的最終目的本質上就是根據不同的請求構建這些響應對象。
在大多是情況下主要處理繼承自 yiiwebResponse 的 response 應用組件, 盡管如此,Yii也允許你創建你自己的響應對象并發送給終端用戶。
狀態碼構建響應時,最先應做的是標識請求是否成功處理的狀態,可通過設置 yiiwebResponse::statusCode 屬性,該屬性使用一個有效的HTTP 狀態碼。
例如,為標識處理已被處理成功, 可設置狀態碼為200,如下所示:
Yii::$app->response->statusCode = 200;
盡管如此,大多數情況下不需要明確設置狀態碼,因為 yiiwebResponse::statusCode 狀態碼默認為200, 如果需要指定請求失敗,可拋出對應的HTTP異常,如下所示:
throw new yiiwebNotFoundHttpException;
當錯誤處理器 捕獲到一個異常,會從異常中提取狀態碼并賦值到響應, 對于上述的 yiiwebNotFoundHttpException 對應HTTP 404狀態碼,以下為Yii預定義的HTTP異常:
yiiwebBadRequestHttpException: status code 400.
yiiwebConflictHttpException: status code 409.
yiiwebForbiddenHttpException: status code 403.
yiiwebGoneHttpException: status code 410.
yiiwebMethodNotAllowedHttpException: status code 405.
yiiwebNotAcceptableHttpException: status code 406.
yiiwebNotFoundHttpException: status code 404.
yiiwebServerErrorHttpException: status code 500.
yiiwebTooManyRequestsHttpException: status code 429.
yiiwebUnauthorizedHttpException: status code 401.
yiiwebUnsupportedMediaTypeHttpException: status code 415.
如果想拋出的異常不在如上列表中,可創建一個yiiwebHttpException異常,帶上狀態碼拋出,如下:
throw new yiiwebHttpException(402);HTTP 頭部
可在 response 組件中操控yiiwebResponse::headers來發送HTTP頭部信息,例如:
$headers = Yii::$app->response->headers; // 增加一個 Pragma 頭,已存在的Pragma 頭不會被覆蓋。 $headers->add("Pragma", "no-cache"); // 設置一個Pragma 頭. 任何已存在的Pragma 頭都會被丟棄 $headers->set("Pragma", "no-cache"); // 刪除Pragma 頭并返回刪除的Pragma 頭的值到數組 $values = $headers->remove("Pragma");
補充: 頭名稱是大小寫敏感的,在yiiwebResponse::send()方法調用前新注冊的頭信息并不會發送給用戶。
響應主體大多是響應應有一個主體存放你想要顯示給終端用戶的內容。
如果已有格式化好的主體字符串,可賦值到響應的yiiwebResponse::content屬性,例如:
Yii::$app->response->content = "hello world!";
如果在發送給終端用戶之前需要格式化,應設置 yiiwebResponse::format 和 yiiwebResponse::data 屬性。
yiiwebResponse::format 屬性指定 yiiwebResponse::data 中數據格式化后的樣式,例如:
$response = Yii::$app->response; $response->format = yiiwebResponse::FORMAT_JSON; $response->data = ["message" => "helloworld"];
Yii支持以下可直接使用的格式,每個實現了 yiiwebResponseFormatterInterface 類, 可自定義這些格式器或通過配置 yiiwebResponse::formatters 屬性來增加格式器。
yiiwebResponse::FORMAT_HTML: 通過 yiiwebHtmlResponseFormatter 來實現.
yiiwebResponse::FORMAT_XML: 通過 yiiwebXmlResponseFormatter來實現.
yiiwebResponse::FORMAT_JSON: 通過 yiiwebJsonResponseFormatter來實現.
yiiwebResponse::FORMAT_JSONP: 通過 yiiwebJsonResponseFormatter來實現.
上述響應主體可明確地被設置,但是在大多數情況下是通過 操作 方法的返回值隱式地設置,常用場景如下所示:
public function actionIndex(){ return $this->render("index"); }
上述的 index 操作返回 index 視圖渲染結果,返回值會被 response 組件格式化后發送給終端用戶。
因為響應格式默認為 yiiwebResponse::FORMAT_HTML, 只需要在操作方法中返回一個字符串, 如果想使用其他響應格式,應在返回數據前先設置格式,例如:
public function actionInfo(){ Yii::$app->response->format = yiiwebResponse::FORMAT_JSON; return [ "message" => "hello world", "code" => 100, ]; }
如上所述,觸雷使用默認的 response 應用組件,也可創建自己的響應對象并發送給終端用戶,可在操作方法中返回該響應對象,如下所示:
public function actionInfo(){ return Yii::createObject([ "class" => "yiiwebResponse", "format" => yiiwebResponse::FORMAT_JSON, "data" => [ "message" => "hello world", "code" => 100, ], ]); }
注意: 如果創建你自己的響應對象,將不能在應用配置中設置 response 組件,盡管如此, 可使用 依賴注入應用通用配置到你新的響應對象。
瀏覽器跳轉瀏覽器跳轉依賴于發送一個Location HTTP 頭,因為該功能通常被使用,Yii提供對它提供了特別的支持。
可調用 yiiwebResponse::redirect() 方法將用戶瀏覽器跳轉到一個URL地址。
該方法設置合適的 帶指定URL的 Location 頭并返回它自己為響應對象,在操作的方法中,可調用縮寫版 yiiwebController::redirect(),例如:
public function actionOld(){ return $this->redirect("http://example.com/new", 301); }
在如上代碼中,操作的方法返回redirect() 方法的結果,如前所述,操作的方法返回的響應對象會被當總響應發送給終端用戶。
除了操作方法外,可直接調用 yiiwebResponse::redirect() 再調用 yiiwebResponse::send() 方法來確保沒有其他內容追加到響應中。
Yii::$app->response->redirect("http://example.com/new", 301)->send();
補充: yiiwebResponse::redirect() 方法默認會設置響應狀態碼為302,該狀態碼會告訴瀏覽器請求的資源 臨時 放在另一個URI地址上,可傳遞一個301狀態碼告知瀏覽器請求的資源已經 永久 重定向到新的URId地址。
如果當前請求為AJAX 請求,發送一個 Location 頭不會自動使瀏覽器跳轉,為解決這個問題, yiiwebResponse::redirect() 方法設置一個值為要跳轉的URL的X-Redirect 頭, 在客戶端可編寫JavaScript 代碼讀取該頭部值然后讓瀏覽器跳轉對應的URL。
補充: Yii 配備了一個yii.js JavaScript 文件提供常用JavaScript功能,包括基于X-Redirect頭的瀏覽器跳轉, 因此,如果你使用該JavaScript 文件( 通過yiiwebYiiAsset 資源包注冊),就不需要編寫AJAX跳轉的代碼。
發送文件和瀏覽器跳轉類似,文件發送是另一個依賴指定HTTP頭的功能,Yii提供方法集合來支持各種文件發送需求,它們對HTTP頭都有內置的支持。
yiiwebResponse::sendFile(): 發送一個已存在的文件到客戶端
yiiwebResponse::sendContentAsFile(): 發送一個文本字符串作為文件到客戶端
yiiwebResponse::sendStreamAsFile(): 發送一個已存在的文件流作為文件到客戶端
這些方法都將響應對象作為返回值,如果要發送的文件非常大,應考慮使用 yiiwebResponse::sendStreamAsFile() 因為它更節約內存,以下示例顯示在控制器操作中如何發送文件:
public function actionDownload(){ return Yii::$app->response->sendFile("path/to/file.txt"); }
如果不是在操作方法中調用文件發送方法,在后面還應調用 yiiwebResponse::send() 沒有其他內容追加到響應中。
Yii::$app->response->sendFile("path/to/file.txt")->send();
一些瀏覽器提供特殊的名為X-Sendfile的文件發送功能,原理為將請求跳轉到服務器上的文件, Web應用可在服務器發送文件前結束,為使用該功能,可調用yiiwebResponse::xSendFile(), 如下簡要列出一些常用Web服務器如何啟用X-Sendfile 功能:
Apache: X-Sendfile
Lighttpd v1.4: X-LIGHTTPD-send-file
Lighttpd v1.5: X-Sendfile
Nginx: X-Accel-Redirect
Cherokee: X-Sendfile and X-Accel-Redirect
發送響應在 send() 方法調用前響應中的內容不會發送給用戶,該方法默認在yiibaseApplication::run() 結尾自動調用,盡管如此,可以明確調用該方法強制立即發送響應。
yiiwebResponse::send() 方法使用以下步驟來發送響應:
觸發 yiiwebResponse::EVENT_BEFORE_SEND 事件.
調用 yiiwebResponse::prepare() 來格式化 yiiwebResponse::data 為yiiwebResponse::content.
觸發 yiiwebResponse::EVENT_AFTER_PREPARE 事件.
調用 yiiwebResponse::sendHeaders() 來發送注冊的HTTP頭
調用 yiiwebResponse::sendContent() 來發送響應主體內容
觸發 yiiwebResponse::EVENT_AFTER_SEND 事件.
一旦yiiwebResponse::send() 方法被執行后,其他地方調用該方法會被忽略, 這意味著一旦響應發出后,就不能再追加其他內容。
如你所見yiiwebResponse::send() 觸發了幾個實用的事件,通過響應這些事件可調整或包裝響應。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21623.html
摘要:簡述這里簡單歸納總結關于的錯誤處理和日志記錄的操作。錯誤處理器會正確地設置響應的狀態碼并使用合適的錯誤視圖頁面來顯示錯誤信息。記錄一個警告消息用來指示一些已經發生的意外。的義務是正確處理日志消息。相應的消息通過被記錄。 簡述 這里簡單歸納總結關于Yii的錯誤處理和日志記錄的操作。 錯誤處理(Errors) Yii 內置了一個yiiwebErrorHandler錯誤處理器,它使錯誤處理更...
摘要:認證事件類在登錄和注銷流程引發一些事件。成功注銷后引發。提供兩種授權方法存取控制過濾器和基于角色的存取控制。允許已認證用戶執行操作。指定一個回調函數用于判定該規則是否滿足條件。 簡述 在程序開發過程中,往往都不能忽視安全問題,無論你的框架有多么完美,都會有破綻,所以完善自己的系統,從程序開發的安全角度去思考問題,把一切潛在的危機扼殺在搖籃中。 認證(Authentication) 認證...
摘要:簡述是一個強大的代碼生成器,主要用于后臺代碼生成。下面列出由生成的文件,以便你研習功能和實現,或修改它們控制器模型和視圖補充被設計成高度可定制和可擴展的代碼生成工具。使用生成代碼是一個基于界面的代碼生成工具。 簡述 Gii 是一個強大的代碼生成器,主要用于后臺代碼生成。 開始 Gii Gii 是 Yii 中的一個模塊??梢酝ㄟ^配置應用的 yiibaseApplication::modu...
摘要:簡述模塊是中的架構的板塊,主要負責數據的展示,渲染模板文件,展示數據內容。此外在一個視圖中還可以引入多個視圖文件,也是通過方法實現。布局文件的數據默認以顯示,也可以用數據塊的形式渲染到視圖上。必須要確認生成一次,才會正式生成新首頁。 簡述 View模塊是Yii中的MVC架構的V板塊,主要負責數據的展示,渲染模板文件,展示數據內容。 基本概念 MVC在Yii里面有一個Views文件夾,里...
摘要:運行來安裝指定的擴展。這更便于用戶辨別是否是的擴展。當用戶運行安裝一個擴展時,文件會被自動更新使之包含新擴展的信息。上述代碼表明該擴展依賴于包。例如,上述的條目聲明將對應于別名。為達到這個目的,你應當在公開發布前做測試。 簡述 擴展是專門設計的在 Yii 應用中隨時可拿來使用的, 并可重發布的軟件包。 基礎 例如, yiisoft/yii2-debug 擴展在你的應用的每個頁面底部添加...
閱讀 2797·2021-11-17 09:33
閱讀 4469·2021-09-22 15:57
閱讀 2872·2019-08-30 14:16
閱讀 3139·2019-08-29 14:07
閱讀 2418·2019-08-26 11:55
閱讀 3428·2019-08-23 17:07
閱讀 1729·2019-08-23 16:50
閱讀 2541·2019-08-23 16:08