国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Yii 的修行之路 - HTTP的請求與響應(yīng)

import. / 3258人閱讀

摘要:簡述交互主要分為請求和響應(yīng)兩種方式。狀態(tài)碼構(gòu)建響應(yīng)時,最先應(yīng)做的是標(biāo)識請求是否成功處理的狀態(tài),可通過設(shè)置屬性,該屬性使用一個有效的狀態(tài)碼。

簡述

HTTP交互主要分為 request(請求) 和 response(響應(yīng)) 兩種方式。

對于Yii2來說,HTTP的request請求是用 YII::$app->request 來表示的對象,這是Yii提供的處理HTTP的request請求的插件,里面有很多實(shí)用的功能代碼:

request;
        if ($request->isGet) {
            echo $request->get("id", "get獲取的值為空");
        } else if ($request->isPost) {
            $request->post("name", "post傳遞的值為空");
        }   
        echo $request->userIp; // 獲取當(dāng)前IP地址
?>

對于Yii2來說,HTTP的response請求是用 YII::$app->response 來表示的對象,這是Yii提供的處理HTTP的response請求的插件,里面與很多實(shí)用的功能代碼:

response;
        // 設(shè)置服務(wù)器返回的狀態(tài)碼設(shè)置
        $response->statusCode = "404";
        // 設(shè)置pragma的設(shè)置,提醒瀏覽器不設(shè)置緩存
        $response->headers->add("pragma", "no-chche");
        // 設(shè)置pragma的設(shè)置,提醒瀏覽器設(shè)置緩存5秒
        $response->headers->set("pragma", "max-age=5");
        $response->headers->remove("pragma");
        // 設(shè)置頁面跳轉(zhuǎn)到指定路徑
        $response->headers->add("location", "https://rongx.github.io");
        // 設(shè)置頁面跳轉(zhuǎn),狀態(tài)碼設(shè)置為302(調(diào)用Controller里面的方法)
        $this->redirect("https://rongx.github.io", 302);
        // 設(shè)置文件下載鏈接
        $response->headers->add("content-dispostion", "attachment; filename="a.jpg"");
        // 提供文件下載,文件路徑實(shí)相對與入口文件來說的
        $response->sendFile("./b.jpg");
?>

其實(shí)在 yiiwebController 里面也有很多處理HTTP的小插件功能代碼。

請求參數(shù)(request)

要獲取請求參數(shù),你可以調(diào)用 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 組件來獲取請求參數(shù),而不是 直接訪問 $_GET 和 $_POST。

信息:這使你更容易編寫測試用例,因?yàn)槟憧梢詡卧鞌?shù)據(jù)來創(chuàng)建一個模擬請求組件。

當(dāng)實(shí)現(xiàn) RESTful APIs 接口的時候,你經(jīng)常需要獲取通過PUT, PATCH或者其他的 request methods 請求方法提交上來的參數(shù)。

你可以通過調(diào)用 yiiwebRequest::getBodyParam() 方法來獲取這些參數(shù)。例如:

$request = Yii::$app->request; // 返回所有參數(shù) 
$params = $request->bodyParams; // 返回參數(shù) "id"
$param = $request->getBodyParam("id");

信息:不同于 GET 參數(shù),POST,PUT,PATCH 等等這些提交上來的參數(shù)是在請求體中被發(fā)送的。

信息:當(dāng)你通過上面介紹的方法訪問這些參數(shù)的時候,request 組件會解析這些參數(shù)。

信息:你可以通過配置 yiiwebRequest::parsers 屬性來自定義怎樣解析這些參數(shù)。

請求方法(request)

你可以通過 request 表達(dá)式來獲取當(dāng)前請求使用的HTTP方法。

這里還提供了一整套布爾屬性用于檢測當(dāng)前請求是某種類型。例如:

$request = Yii::$app->request;

if ($request->isAjax) { /* 該請求是一個 AJAX 請求 */ }
if ($request->isGet)  { /* 請求方法是 GET */ }
if ($request->isPost) { /* 請求方法是 POST */ }
if ($request->isPut)  { /* 請求方法是 PUT */ }
請求URLs(request)

request 組件提供了許多方式來檢測當(dāng)前請求的URL。

假設(shè)被請求的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服務(wù)中使用的端口。

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類型數(shù)據(jù)。

yiiwebRequest::acceptableContentTypes:返回用戶可接受的內(nèi)容MIME類型。 返回的類型是按照他們的質(zhì)量得分來排序的。得分最高的類型將被最先返回。

yiiwebRequest::acceptableLanguages:返回用戶可接受的語言。 返回的語言是按照他們的偏好層次來排序的。第一個參數(shù)代表最優(yōu)先的語言。

假如你的應(yīng)用支持多語言,并且你想在終端用戶最喜歡的語言中顯示頁面,那么你可以使用語言協(xié)商方法 yiiwebRequest::getPreferredLanguage()。

這個方法通過 yiiwebRequest::acceptableLanguages 在你的應(yīng)用中所支持的語言列表里進(jìn)行比較篩選,返回最適合的語言。

提示:你也可以使用 yiifiltersContentNegotiator 過濾器進(jìn)行動態(tài)確定哪些內(nèi)容類型和語言應(yīng)該在響應(yīng)中使用。
這個過濾器實(shí)現(xiàn)了上面介紹的內(nèi)容協(xié)商的屬性和方法。

客戶端信息(request)

你可以通過 yiiwebRequest::userHost 和 yiiwebRequest::userIP 分別獲取host name和客戶機(jī)的IP地址, 例如,

$userHost = Yii::$app->request->userHost;
$userIP = Yii::$app->request->userIP;
響應(yīng)(response)

當(dāng)應(yīng)用完成處理一個請求后, 會生成一個yiiwebResponse響應(yīng)對象并發(fā)送給終端用戶 響應(yīng)對象包含的信息有HTTP狀態(tài)碼,HTTP頭和主體內(nèi)容等。

網(wǎng)頁應(yīng)用開發(fā)的最終目的本質(zhì)上就是根據(jù)不同的請求構(gòu)建這些響應(yīng)對象。

在大多是情況下主要處理繼承自 yiiwebResponse 的 response 應(yīng)用組件, 盡管如此,Yii也允許你創(chuàng)建你自己的響應(yīng)對象并發(fā)送給終端用戶。

狀態(tài)碼

構(gòu)建響應(yīng)時,最先應(yīng)做的是標(biāo)識請求是否成功處理的狀態(tài),可通過設(shè)置 yiiwebResponse::statusCode 屬性,該屬性使用一個有效的HTTP 狀態(tài)碼。

例如,為標(biāo)識處理已被處理成功, 可設(shè)置狀態(tài)碼為200,如下所示:

Yii::$app->response->statusCode = 200;

盡管如此,大多數(shù)情況下不需要明確設(shè)置狀態(tài)碼,因?yàn)?yiiwebResponse::statusCode 狀態(tài)碼默認(rèn)為200, 如果需要指定請求失敗,可拋出對應(yīng)的HTTP異常,如下所示:

throw new yiiwebNotFoundHttpException;

當(dāng)錯誤處理器 捕獲到一個異常,會從異常中提取狀態(tài)碼并賦值到響應(yīng), 對于上述的 yiiwebNotFoundHttpException 對應(yīng)HTTP 404狀態(tài)碼,以下為Yii預(yù)定義的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.

如果想拋出的異常不在如上列表中,可創(chuàng)建一個yiiwebHttpException異常,帶上狀態(tài)碼拋出,如下:

throw new yiiwebHttpException(402);
HTTP 頭部

可在 response 組件中操控yiiwebResponse::headers來發(fā)送HTTP頭部信息,例如:

$headers = Yii::$app->response->headers;

// 增加一個 Pragma 頭,已存在的Pragma 頭不會被覆蓋。
$headers->add("Pragma", "no-cache");

// 設(shè)置一個Pragma 頭. 任何已存在的Pragma 頭都會被丟棄
$headers->set("Pragma", "no-cache");

// 刪除Pragma 頭并返回刪除的Pragma 頭的值到數(shù)組
$values = $headers->remove("Pragma");

補(bǔ)充: 頭名稱是大小寫敏感的,在yiiwebResponse::send()方法調(diào)用前新注冊的頭信息并不會發(fā)送給用戶。

響應(yīng)主體

大多是響應(yīng)應(yīng)有一個主體存放你想要顯示給終端用戶的內(nèi)容。

如果已有格式化好的主體字符串,可賦值到響應(yīng)的yiiwebResponse::content屬性,例如:

Yii::$app->response->content = "hello world!";

如果在發(fā)送給終端用戶之前需要格式化,應(yīng)設(shè)置 yiiwebResponse::format 和 yiiwebResponse::data 屬性。

yiiwebResponse::format 屬性指定 yiiwebResponse::data 中數(shù)據(jù)格式化后的樣式,例如:

$response = Yii::$app->response; 
$response->format = yiiwebResponse::FORMAT_JSON; 
$response->data = ["message" => "helloworld"];

Yii支持以下可直接使用的格式,每個實(shí)現(xiàn)了 yiiwebResponseFormatterInterface 類, 可自定義這些格式器或通過配置 yiiwebResponse::formatters 屬性來增加格式器。

yiiwebResponse::FORMAT_HTML: 通過 yiiwebHtmlResponseFormatter 來實(shí)現(xiàn).

yiiwebResponse::FORMAT_XML: 通過 yiiwebXmlResponseFormatter來實(shí)現(xiàn).

yiiwebResponse::FORMAT_JSON: 通過 yiiwebJsonResponseFormatter來實(shí)現(xiàn).

yiiwebResponse::FORMAT_JSONP: 通過 yiiwebJsonResponseFormatter來實(shí)現(xiàn).

上述響應(yīng)主體可明確地被設(shè)置,但是在大多數(shù)情況下是通過 操作 方法的返回值隱式地設(shè)置,常用場景如下所示:

public function actionIndex(){ 
    return $this->render("index"); 
}

上述的 index 操作返回 index 視圖渲染結(jié)果,返回值會被 response 組件格式化后發(fā)送給終端用戶。

因?yàn)轫憫?yīng)格式默認(rèn)為 yiiwebResponse::FORMAT_HTML, 只需要在操作方法中返回一個字符串, 如果想使用其他響應(yīng)格式,應(yīng)在返回數(shù)據(jù)前先設(shè)置格式,例如:

public function actionInfo(){ 
    Yii::$app->response->format = yiiwebResponse::FORMAT_JSON; 
    return [ 
        "message" => "hello world", "code" => 100, 
    ]; 
}

如上所述,觸雷使用默認(rèn)的 response 應(yīng)用組件,也可創(chuàng)建自己的響應(yīng)對象并發(fā)送給終端用戶,可在操作方法中返回該響應(yīng)對象,如下所示:

public function actionInfo(){ 
    return Yii::createObject([ 
        "class" => "yiiwebResponse", 
        "format" => yiiwebResponse::FORMAT_JSON, 
        "data" => [ "message" => "hello world", "code" => 100, ], 
    ]); 
}

注意: 如果創(chuàng)建你自己的響應(yīng)對象,將不能在應(yīng)用配置中設(shè)置 response 組件,盡管如此, 可使用 依賴注入應(yīng)用通用配置到你新的響應(yīng)對象。

瀏覽器跳轉(zhuǎn)

瀏覽器跳轉(zhuǎn)依賴于發(fā)送一個Location HTTP 頭,因?yàn)樵摴δ芡ǔ1皇褂茫琘ii提供對它提供了特別的支持。

可調(diào)用 yiiwebResponse::redirect() 方法將用戶瀏覽器跳轉(zhuǎn)到一個URL地址。

該方法設(shè)置合適的 帶指定URL的 Location 頭并返回它自己為響應(yīng)對象,在操作的方法中,可調(diào)用縮寫版 yiiwebController::redirect(),例如:

public function actionOld(){ 
    return $this->redirect("http://example.com/new", 301); 
}

在如上代碼中,操作的方法返回redirect() 方法的結(jié)果,如前所述,操作的方法返回的響應(yīng)對象會被當(dāng)總響應(yīng)發(fā)送給終端用戶。

除了操作方法外,可直接調(diào)用 yiiwebResponse::redirect() 再調(diào)用 yiiwebResponse::send() 方法來確保沒有其他內(nèi)容追加到響應(yīng)中。

Yii::$app->response->redirect("http://example.com/new", 301)->send();

補(bǔ)充: yiiwebResponse::redirect() 方法默認(rèn)會設(shè)置響應(yīng)狀態(tài)碼為302,該狀態(tài)碼會告訴瀏覽器請求的資源 臨時 放在另一個URI地址上,可傳遞一個301狀態(tài)碼告知瀏覽器請求的資源已經(jīng) 永久 重定向到新的URId地址。

如果當(dāng)前請求為AJAX 請求,發(fā)送一個 Location 頭不會自動使瀏覽器跳轉(zhuǎn),為解決這個問題, yiiwebResponse::redirect() 方法設(shè)置一個值為要跳轉(zhuǎn)的URL的X-Redirect 頭, 在客戶端可編寫JavaScript 代碼讀取該頭部值然后讓瀏覽器跳轉(zhuǎn)對應(yīng)的URL。

補(bǔ)充: Yii 配備了一個yii.js JavaScript 文件提供常用JavaScript功能,包括基于X-Redirect頭的瀏覽器跳轉(zhuǎn), 因此,如果你使用該JavaScript 文件( 通過yiiwebYiiAsset 資源包注冊),就不需要編寫AJAX跳轉(zhuǎn)的代碼。

發(fā)送文件

和瀏覽器跳轉(zhuǎn)類似,文件發(fā)送是另一個依賴指定HTTP頭的功能,Yii提供方法集合來支持各種文件發(fā)送需求,它們對HTTP頭都有內(nèi)置的支持。

yiiwebResponse::sendFile(): 發(fā)送一個已存在的文件到客戶端

yiiwebResponse::sendContentAsFile(): 發(fā)送一個文本字符串作為文件到客戶端

yiiwebResponse::sendStreamAsFile(): 發(fā)送一個已存在的文件流作為文件到客戶端

這些方法都將響應(yīng)對象作為返回值,如果要發(fā)送的文件非常大,應(yīng)考慮使用 yiiwebResponse::sendStreamAsFile() 因?yàn)樗?jié)約內(nèi)存,以下示例顯示在控制器操作中如何發(fā)送文件:

public function actionDownload(){ 
    return Yii::$app->response->sendFile("path/to/file.txt"); 
}

如果不是在操作方法中調(diào)用文件發(fā)送方法,在后面還應(yīng)調(diào)用 yiiwebResponse::send() 沒有其他內(nèi)容追加到響應(yīng)中。

Yii::$app->response->sendFile("path/to/file.txt")->send();

一些瀏覽器提供特殊的名為X-Sendfile的文件發(fā)送功能,原理為將請求跳轉(zhuǎn)到服務(wù)器上的文件, Web應(yīng)用可在服務(wù)器發(fā)送文件前結(jié)束,為使用該功能,可調(diào)用yiiwebResponse::xSendFile(), 如下簡要列出一些常用Web服務(wù)器如何啟用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

發(fā)送響應(yīng)

在 send() 方法調(diào)用前響應(yīng)中的內(nèi)容不會發(fā)送給用戶,該方法默認(rèn)在yiibaseApplication::run() 結(jié)尾自動調(diào)用,盡管如此,可以明確調(diào)用該方法強(qiáng)制立即發(fā)送響應(yīng)。

yiiwebResponse::send() 方法使用以下步驟來發(fā)送響應(yīng):

觸發(fā) yiiwebResponse::EVENT_BEFORE_SEND 事件.

調(diào)用 yiiwebResponse::prepare() 來格式化 yiiwebResponse::data 為yiiwebResponse::content.

觸發(fā) yiiwebResponse::EVENT_AFTER_PREPARE 事件.

調(diào)用 yiiwebResponse::sendHeaders() 來發(fā)送注冊的HTTP頭

調(diào)用 yiiwebResponse::sendContent() 來發(fā)送響應(yīng)主體內(nèi)容

觸發(fā) yiiwebResponse::EVENT_AFTER_SEND 事件.

一旦yiiwebResponse::send() 方法被執(zhí)行后,其他地方調(diào)用該方法會被忽略, 這意味著一旦響應(yīng)發(fā)出后,就不能再追加其他內(nèi)容。

如你所見yiiwebResponse::send() 觸發(fā)了幾個實(shí)用的事件,通過響應(yīng)這些事件可調(diào)整或包裝響應(yīng)。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/21623.html

相關(guān)文章

  • Yii 修行之路 - Errors(錯誤處理) & Logging(日志記錄)

    摘要:簡述這里簡單歸納總結(jié)關(guān)于的錯誤處理和日志記錄的操作。錯誤處理器會正確地設(shè)置響應(yīng)的狀態(tài)碼并使用合適的錯誤視圖頁面來顯示錯誤信息。記錄一個警告消息用來指示一些已經(jīng)發(fā)生的意外。的義務(wù)是正確處理日志消息。相應(yīng)的消息通過被記錄。 簡述 這里簡單歸納總結(jié)關(guān)于Yii的錯誤處理和日志記錄的操作。 錯誤處理(Errors) Yii 內(nèi)置了一個yiiwebErrorHandler錯誤處理器,它使錯誤處理更...

    _ang 評論0 收藏0
  • Yii修行之路 - Security 安全

    摘要:認(rèn)證事件類在登錄和注銷流程引發(fā)一些事件。成功注銷后引發(fā)。提供兩種授權(quán)方法存取控制過濾器和基于角色的存取控制。允許已認(rèn)證用戶執(zhí)行操作。指定一個回調(diào)函數(shù)用于判定該規(guī)則是否滿足條件。 簡述 在程序開發(fā)過程中,往往都不能忽視安全問題,無論你的框架有多么完美,都會有破綻,所以完善自己的系統(tǒng),從程序開發(fā)的安全角度去思考問題,把一切潛在的危機(jī)扼殺在搖籃中。 認(rèn)證(Authentication) 認(rèn)證...

    AaronYuan 評論0 收藏0
  • Yii 修行之路 - Gii 代碼生成器

    摘要:簡述是一個強(qiáng)大的代碼生成器,主要用于后臺代碼生成。下面列出由生成的文件,以便你研習(xí)功能和實(shí)現(xiàn),或修改它們控制器模型和視圖補(bǔ)充被設(shè)計成高度可定制和可擴(kuò)展的代碼生成工具。使用生成代碼是一個基于界面的代碼生成工具。 簡述 Gii 是一個強(qiáng)大的代碼生成器,主要用于后臺代碼生成。 開始 Gii Gii 是 Yii 中的一個模塊。可以通過配置應(yīng)用的 yiibaseApplication::modu...

    fuchenxuan 評論0 收藏0
  • Yii 修行之路 - View 視圖渲染

    摘要:簡述模塊是中的架構(gòu)的板塊,主要負(fù)責(zé)數(shù)據(jù)的展示,渲染模板文件,展示數(shù)據(jù)內(nèi)容。此外在一個視圖中還可以引入多個視圖文件,也是通過方法實(shí)現(xiàn)。布局文件的數(shù)據(jù)默認(rèn)以顯示,也可以用數(shù)據(jù)塊的形式渲染到視圖上。必須要確認(rèn)生成一次,才會正式生成新首頁。 簡述 View模塊是Yii中的MVC架構(gòu)的V板塊,主要負(fù)責(zé)數(shù)據(jù)的展示,渲染模板文件,展示數(shù)據(jù)內(nèi)容。 基本概念 MVC在Yii里面有一個Views文件夾,里...

    Mr_houzi 評論0 收藏0
  • Yii修行之路 - Extension 擴(kuò)展

    摘要:運(yùn)行來安裝指定的擴(kuò)展。這更便于用戶辨別是否是的擴(kuò)展。當(dāng)用戶運(yùn)行安裝一個擴(kuò)展時,文件會被自動更新使之包含新擴(kuò)展的信息。上述代碼表明該擴(kuò)展依賴于包。例如,上述的條目聲明將對應(yīng)于別名。為達(dá)到這個目的,你應(yīng)當(dāng)在公開發(fā)布前做測試。 簡述 擴(kuò)展是專門設(shè)計的在 Yii 應(yīng)用中隨時可拿來使用的, 并可重發(fā)布的軟件包。 基礎(chǔ) 例如, yiisoft/yii2-debug 擴(kuò)展在你的應(yīng)用的每個頁面底部添加...

    bovenson 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<