HTTP 消息?

消息類為HTTP消息中的請(qǐng)求和響應(yīng)的實(shí)現(xiàn)提供了一個(gè)通用的接口,包括消息體,協(xié)議版本,處理消息頭的工具和一些進(jìn)行內(nèi)容協(xié)商的方法。

該類是 請(qǐng)求類響應(yīng)類 共有的父類。 因此某些方法,例如內(nèi)容協(xié)商方法等,可能只適用于請(qǐng)求和響應(yīng),而對(duì)于其他方法不適用,但是我們將其聚合在該類中 從而使得處理頭的方法可以定義在相同的位置。

什么是內(nèi)容協(xié)商?

內(nèi)容協(xié)商的核心機(jī)制,其實(shí)只是HTTP實(shí)現(xiàn)的一個(gè)簡(jiǎn)單的部分,即允許單個(gè)資源適用于不止一種內(nèi)容類型,從而允許客戶端選擇適合自己的數(shù)據(jù)類型。

一個(gè)典型的案例就是,該瀏覽器無(wú)法播放PNG格式的文件,并且只能請(qǐng)求GIF或者JPEG格式的圖片文件。而當(dāng)資源服務(wù)器接收到該請(qǐng)求時(shí), 它將會(huì)檢查可用的文件類型是否能滿足客戶端所請(qǐng)求的,并選擇本身所支持的格式中,最為適合的圖片格式,在本例中就可能會(huì)返回一個(gè)JPEG的圖片文件。

同樣的協(xié)商方式會(huì)在以下四種數(shù)據(jù)類型中提現(xiàn):

  • 媒體/文檔類型 - 可以是圖片的類型格式,或者是HTML、XML或JSON.
  • 字符集Character Set - 該文檔所屬的字符集,通常是UTF-8
  • 文檔編碼Document Encoding - 通常是返回結(jié)果的壓縮類型(譯者注:例如gzip)
  • 文檔語(yǔ)言Document Language - 對(duì)于支持多語(yǔ)言的站點(diǎn),有助于決定返回哪種語(yǔ)言格式

類的參考文檔?

CodeIgniter\HTTP\Message
body()?
返回:當(dāng)前的消息體
返回類型:string

返回當(dāng)前消息的實(shí)體部分,如果實(shí)體不存在或者已經(jīng)被發(fā)送過(guò),返回null:

echo $message->body();
setBody([$str])?
參數(shù):
  • $str (string) – 消息體對(duì)應(yīng)的字符串.
返回:

該消息實(shí)例,用于鏈?zhǔn)秸{(diào)用

返回類型:

CodeIgniter\HTTP\Message 實(shí)例.

設(shè)置當(dāng)前請(qǐng)求的實(shí)體內(nèi)容

populateHeaders()?
返回:void

掃描并處理SERVER數(shù)據(jù)中找到的請(qǐng)求頭內(nèi)容,并將其存儲(chǔ)以供下次使用。該方法用于 請(qǐng)求類 Class 從而使得當(dāng)前的請(qǐng)求頭內(nèi)容可被使用.

這里所指的請(qǐng)求頭實(shí)際上是所有以 HTTP_ 開頭的SERVER數(shù)據(jù),例如 HTTP_POST 。每個(gè)消息都會(huì)從被從標(biāo)準(zhǔn)的大小寫格式轉(zhuǎn)換為首字母大寫并以橫線(-)連接的格式。 并移除了開頭的 HTTP_ 部分,故而 HTTP_ACCEPT_LANGUAGE 變成了 Accept-Language 。

getHeaders()?
返回:一個(gè)包括了所有能確定的頭部的數(shù)組.
返回類型:array

返回所有能確定或者是先前設(shè)定過(guò)的頭

getHeader([$name[, $filter = null]])?
參數(shù):
  • $name (string) – 你想要獲取對(duì)應(yīng)的值的頭的名字
  • $filter (int) – 所需要使用的過(guò)濾器類型。可供使用的過(guò)濾器見表 過(guò)濾器 。
返回:

當(dāng)前頭的值。如果該頭有多個(gè)值,就會(huì)以數(shù)組的形式返回

返回類型:

string|array|null

使你可以獲取單個(gè)消息頭的當(dāng)前值。 $name 對(duì)應(yīng)的是大小寫敏感的頭名。由于在上述例子中已經(jīng)對(duì)頭進(jìn)行了內(nèi)部轉(zhuǎn)換,你可以通過(guò)任何大小寫方式格式來(lái)傳值:

// 這些都等同:
$message->getHeader('HOST');
$message->getHeader('Host');
$message->getHeader('host');

如果該頭有多個(gè)值,就會(huì)以數(shù)組的形式返回. 你可以使用 headerLine() 方法來(lái)將這些數(shù)據(jù)轉(zhuǎn)換為字符串的形式來(lái)返回:

echo $message->getHeader('Accept-Language');

// 輸出如下:
[
        'en',
        'en-US'
]

你可以通過(guò)將過(guò)濾器的值作為第二個(gè)參數(shù)傳遞給該函數(shù):

$message->getHeader('Document-URI', FILTER_SANITIZE_URL);
headerLine($name)?
參數(shù):
  • $name (string) – 需要獲取的頭的名字.
返回:

頭所對(duì)應(yīng)的值(字符串形式)

返回類型:

string

將該頭對(duì)應(yīng)的值以字符串形式返回。該方法使得你可以在該頭對(duì)應(yīng)多個(gè)值時(shí),將頭對(duì)應(yīng)的值輕松地以字符串形式返回。值以逗號(hào)分隔形式:

echo $message->headerLine('Accept-Language');

// 輸出:
en, en-US
setHeader([$name[, $value]])
參數(shù):
  • $name (string) – 需要設(shè)置值的頭的名字
  • $value (mixed) – 需要設(shè)置的值
返回:

當(dāng)前消息實(shí)例

返回類型:

CodeIgniter\HTTP\Message

為單個(gè)頭賦值。 $name 是該頭所對(duì)應(yīng)的大小寫敏感的命名。如果該頭部當(dāng)前不存在就會(huì)被創(chuàng)建。$value 可以是字符串或者一個(gè)字符串?dāng)?shù)組:

$message->setHeader('Host', 'codeigniter.com');
removeHeader([$name])?
參數(shù):
  • $name (string) – 需要移除的頭的名字.
返回:

當(dāng)前消息實(shí)例

返回類型:

CodeIgniter\HTTP\Message

從消息中移除指定頭. $name 是該頭所對(duì)應(yīng)的大小寫敏感的命名:

$message->remove('Host');
appendHeader([$name[, $value]]))?
參數(shù):
  • $name (string) – 需要修改的頭的名字
  • $value (mixed) – 需要為該頭增加的值
返回:

當(dāng)前消息實(shí)例

返回類型:

CodeIgniter\HTTP\Message

為一個(gè)現(xiàn)存的頭增加值。該頭的值不可以是單個(gè)字符串,必須是一個(gè)數(shù)組。如果是單個(gè)字符串的話會(huì)拋出一個(gè) LogicException 異常

$message->appendHeader('Accept-Language', 'en-US; q=0.8');
protocolVersion()?
返回:當(dāng)前HTTP協(xié)議版本
返回類型:string

返回當(dāng)前消息對(duì)應(yīng)的HTTP 協(xié)議版本,如果沒(méi)有設(shè)定過(guò)的話就會(huì)返回 null ,可選值為 1.01.1 。

setProtocolVersion($version)?
參數(shù):
  • $version (string) – HTTP協(xié)議版本
返回:

當(dāng)前消息實(shí)例

返回類型:

CodeIgniter\HTTP\Message

為當(dāng)前消息所使用的HTTP協(xié)議設(shè)定版本??少x值為 1.01.1:

$message->setProtocolVersion('1.1');
negotiateMedia($supported[, $strictMatch=false])?
參數(shù):
  • $supported (array) – 系統(tǒng)所支持的媒體類型構(gòu)成的數(shù)組
  • $strictMatch (bool) – 是否需要嚴(yán)格匹配
返回:

對(duì)于所請(qǐng)求的媒體格式,返回程序支持的媒體類型

返回類型:

string

用于處理 Accept 請(qǐng)求頭并將其與應(yīng)用程序所支持的媒體類型進(jìn)行對(duì)比來(lái)給出最合適的類型。本方法會(huì)返回一個(gè)合適的媒體類型,第一個(gè)參數(shù)是應(yīng)用程序所支持的類型,用于和客戶端所請(qǐng)求的類型進(jìn)行比對(duì):

$supported = [
        'image/png',
        'image/jpg',
        'image/gif'
];
$imageType = $message->negotiateMedia($supported);

$supported 數(shù)組里成員的順序應(yīng)該以程序優(yōu)先返回的順序進(jìn)行定義,其中第一個(gè)成員應(yīng)該是應(yīng)用程序所期待的返回類型,其余降序排列。如果和請(qǐng)求的類型匹配不上,就默認(rèn)返回?cái)?shù)組里的第一個(gè)成員。

根據(jù) RFC ,協(xié)商匹配可以選擇以返回一個(gè)默認(rèn)值(就如該方法所做的那樣),或者是返回一個(gè)空字符串。如果你希望進(jìn)行嚴(yán)格匹配并返回一個(gè)空字符串的話,請(qǐng)為第二個(gè)參數(shù)傳值 true

// 如果匹配不到就返回一個(gè)空字符串
$imageType = $message->negotiateMedia($supported, true);

匹配流程實(shí)際上同時(shí)考慮到了請(qǐng)求類型的優(yōu)先級(jí)和在RFC中的明確性。這就意味著請(qǐng)求頭的值越明確,所對(duì)應(yīng)的優(yōu)先級(jí)就越高,(除非通過(guò) q 的值來(lái)修改) 更多細(xì)節(jié)請(qǐng)閱讀 appropriate section of the RFC

negotiateCharset($supported)?
參數(shù):
  • $supported (array) – 系統(tǒng)所支持的字符集構(gòu)成的數(shù)組
返回:

對(duì)于所請(qǐng)求的字符集類型,所能匹配到的最優(yōu)先的字符集

返回類型:

string

negotiateMedia() 方法一樣,只是用于匹配 Accept-Charset 請(qǐng)求頭:

$supported = [
        'utf-8',
        'iso-8895-9'
];
$charset = $message->negotiateCharset($supported);

匹配不到的情況下,返回默認(rèn)的 utf-8 字符集。

negotiateEncoding($supported)?
參數(shù):
  • $supported (array) – 系統(tǒng)所支持的字符編碼構(gòu)成的數(shù)組
返回:

對(duì)于所請(qǐng)求的字符編碼,所能匹配到的最優(yōu)先的字符編碼

返回類型:

string

與上述兩個(gè)方法類似,用于匹配 Accept-Encoding 請(qǐng)求頭;無(wú)法匹配時(shí)返回 $supported 數(shù)組的第一個(gè)元素:

$supported = [
        'gzip',
        'compress'
];
$encoding = $message->negotiateEncoding($supported);
negotiateLanguage($supported)?
參數(shù):
  • $supported (array) – 系統(tǒng)所支持的語(yǔ)言構(gòu)成的數(shù)組
返回:

對(duì)于所請(qǐng)求的語(yǔ)言,所能匹配到的最優(yōu)先的語(yǔ)言

返回類型:

string

與上述三個(gè)個(gè)方法類似,用于匹配 Accept-Language 請(qǐng)求頭;無(wú)法匹配時(shí)返回 $supported 數(shù)組的第一個(gè)元素:

$supported = [
        'en',
        'fr',
        'x-pig-latin'
];
$language = $message->negotiateLanguage($supported);

關(guān)于語(yǔ)言標(biāo)記的更多信息,請(qǐng)參閱 RFC 1766 。