請求與響應(yīng)對象

在用 Express 構(gòu)建 Web 服務(wù)器時,大部分工作都是從請求對象開始,到響應(yīng)對象終止。這兩個對象起源于 Node,Express 對其進行了擴展肾档,在進行探討前摹恰,我們首先看一下服務(wù)端如何通過url對客戶端返回一個頁面。
URL的組成部分
Screenshot from 2017-07-30 21-43-57.png
  • 協(xié)議
    • 協(xié)議確定如何傳輸請求怒见,我們主要使用http與https俗慈,常見的還有ftp與file
  • 主機名
    • 主機名標(biāo)識服務(wù)器。運行在本地計算機(localhost)和本地網(wǎng)絡(luò)的服務(wù)器可以簡單地表示,比如用一個單詞,或一個數(shù)字 IP 地址遣耍。在 Internet 環(huán)境下,主機名通常以一個頂級域名(TLD)結(jié)尾,比如 .com 或 .net闺阱。另外,也許還會有子域名作為主機名的前綴。子域名可以是任何形式的,其中 www 最為常見舵变。子域名通常是可選的酣溃。
  • 端口
    • 每一臺服務(wù)器都有一系列端口號。一些端口號比較“特殊”,如 80 和 443 端口纪隙。如果省略端口值,那么默認(rèn) 80 端口負責(zé) HTTP 傳輸,443 端口負責(zé) HTTPS 傳輸赊豌。如果不使用 80 和 443 端口,就需要一個大于 1023 1 的端口號。通常使用容易記憶的端口號,如3000绵咱、8080 或 8088碘饼。
  • 路徑
    • URL 中影響應(yīng)用程序的第一個組成部分通常是路徑(在考慮協(xié)議、主機名和端口的基礎(chǔ)上做決定很合理,但是不夠好)悲伶。路徑是應(yīng)用中的頁面或其他資源的唯一標(biāo)識艾恼。
  • 查詢字符串
    • 查詢字符串是一種鍵值對集合,是可選的。它以問號(?)開頭,鍵值對則以與號(&)分隔開拢切。所有的名稱和值都必須是 URL 編碼的。對此,JavaScript 提供了一個嵌入式的函數(shù) encodeURIComponent 來處理秆吵。例如,空格被加號(+)替換淮椰。其他特殊字符被數(shù)字型字符替換。
  • 信息片斷
    • 該信息不會發(fā)送到服務(wù)端纳寂,一般只涉及到前段設(shè)置錨點主穗,用于頁面的跳轉(zhuǎn)
http請求方法
  • HTTP 協(xié)議確定了客戶端與服務(wù)器通信的請求方法集合(通常稱為 HTTP verbs)。很顯然,GET 和 POST 最為常見毙芜。在瀏覽器中鍵入一個 URL(或點擊一個鏈接),服務(wù)器會接收到一個 HTTP GET 請求,其中的重要信息是 URL 路徑和查詢字符串钢拧。至于如何響應(yīng),則需要應(yīng)用程序結(jié)合方法凯正、路徑和查詢字符串來決定。
  • 對于一個網(wǎng)站來說,大部分頁面都響應(yīng) GET 請求骡苞。 POST 請求通常用來提交信息到服務(wù)器后臺(例如表單處理)。服務(wù)器將請求中包含的所有信息(例如表單)處理完成之后,用以響應(yīng)的 HTML 通常與相應(yīng)的 GET 請求是一樣的裙顽。與服務(wù)器通信時,瀏覽器只使用 GET 和POST 方法(如果沒有使用 AJAX)
請求報頭
  • 我們?yōu)g覽網(wǎng)頁時,發(fā)送到服務(wù)器的并不只是 URL。當(dāng)你訪問一個網(wǎng)站時,瀏覽器會發(fā)送很多“隱形”信息。服務(wù)器會因此得知優(yōu)先響應(yīng)哪種語言的頁面(例如,在西班牙下載 Chrome 瀏覽器,如果有西班牙語的版本,就會接收到一個西班牙語的訪問頁面)绑雄。它也會發(fā)送“用戶代理”信息(瀏覽器、操作系統(tǒng)和硬件設(shè)備)和其他一些信息奥邮。所有能夠確保你了解請求對象頭文件屬性的信息都將會作為請求報頭發(fā)送万牺。
響應(yīng)報頭
  • 正如瀏覽器以請求報頭的形式發(fā)送隱藏信息到服務(wù)器,當(dāng)服務(wù)器響應(yīng)時,同樣會回傳一些瀏覽器沒必要渲染和顯示的信息,通常是元數(shù)據(jù)和服務(wù)器信息。我們已經(jīng)熟悉內(nèi)容類型頭信息,它告訴瀏覽器正在被傳輸?shù)膬?nèi)容類型(網(wǎng)頁洽腺、圖片脚粟、樣式表、客戶端腳本等)蘸朋。特別要注意的是,不管 URL 路徑是什么,瀏覽器都根據(jù)內(nèi)容類型報頭處理信息核无。因此你可以通過一個叫作 /image.jpg 的路徑提供網(wǎng)頁,也可以通過一個叫作 /text.html 的路徑提供圖片。除了內(nèi)容類型之外,報頭還會指出響應(yīng)信息是否被壓縮,以及使用的是哪種編碼度液。響應(yīng)報頭還可以包含關(guān)于瀏覽器對資源緩存時長的提示厕宗。響應(yīng)報頭也會返回一些服務(wù)器信息。
互聯(lián)網(wǎng)媒體類型
  • 內(nèi)容類型報頭信息極其重要,沒有它,客戶端很難判斷如何渲染接收到的內(nèi)容堕担。內(nèi)容類型報頭就是一種互聯(lián)網(wǎng)媒體類型,由一個類型已慢、一個子類型以及可選的參數(shù)組成。例如,text/html;charset=UTF-8 說明類型是 text,子類型是 html,字符編碼是 UTF-8霹购∮踊荩互聯(lián)網(wǎng)編號分配機構(gòu)維護了一個官方的互聯(lián)網(wǎng)媒體類型清(http://www.iana.org/assignments/media-
    types/media-types.xhtml)。我們常見的 content type齐疙、Internet media type 和 MIME type 是可以互換的膜楷。MIME(多用途互聯(lián)網(wǎng)郵件擴展)是互聯(lián)網(wǎng)媒體類型的前身,它們大部分是相同的。
請求體
  • 除請求報頭外,請求還有一個主體(就像作為實際內(nèi)容返回的響應(yīng)主體一樣)贞奋。一般 GET請求沒有主體內(nèi)容,但 POST 請求是有的赌厅。 POST 請求體最常見的媒體類型是 application/x-www-form-urlendcoded ,是鍵值對集合的簡單編碼,用 & 分隔(基本上和查詢字符串的格式一樣)。如果 POST 請求需要支持文件上傳,則媒體類型是 multipart/form-data ,它是一種更為復(fù)雜的格式轿塔。最后是 AJAX 請求,它可以使application/json 特愿。
請求對象

請求對象(通常傳遞到回調(diào)方法,這意味著你可以隨意命名,通常命名為 req 或 request )它的生命周期始于 Node 的一個核心對象 http.IncomingMessage 的實例。Express 添加了一些附加功能勾缭。我們來看看請求對象中最有用的屬性和方法(除了來自 Node 的req.headers 和req.url ,所有這些方法都由 Express 添加)揍障。

  • req.params

    • 一個數(shù)組,包含命名過的路由參數(shù)。
  • req.param(name)

    • 返回命名的路由參數(shù),或者 GET 請求或 POST 請求參數(shù)俩由。建議你忽略此方法毒嫡。
  • req.query

    • 一個對象,包含以鍵值對存放的查詢字符串參數(shù)(通常稱為 GET 請求參數(shù))。
  • req.body

    • 一個對象,包含 POST 請求參數(shù)幻梯。這樣命名是因為 POST 請求參數(shù)在 REQUEST 正文中傳遞,而不像查詢字符串在 URL 中傳遞兜畸。要使 req.body 可用,需要中間件能夠解析請求正文內(nèi)容類型
  • req.route

    • 關(guān)于當(dāng)前匹配路由的信息努释。主要用于路由調(diào)試。
  • req.cookies/req.singnedCookies

    • 一個對象,包含從客戶端傳遞過來的 cookies 值膳叨。
  • req.headers

    • 從客戶端接收到的請求報頭洽洁。
  • req.accepts([types])

    • 一個簡便的方法,用來確定客戶端是否接受一個或一組指定的類型(可選類型可以是單個的 MIME 類型,如 application/json 、一個逗號分隔集合或是一個數(shù)組)菲嘴。寫公共API 的人對該方法很感興趣饿自。假定瀏覽器默認(rèn)始終接受 HTML。
  • req.ip

    • 客戶端的 IP 地址龄坪。
  • req.path

    • 請求路徑(不包含協(xié)議昭雌、主機、端口或查詢字符串)健田。
  • req.host

    • 一個簡便的方法,用來返回客戶端所報告的主機名烛卧。這些信息可以偽造,所以不應(yīng)該用于安全目的。
  • req.xhr

    • 一個簡便屬性,如果請求由 Ajax 發(fā)起將會返回 true 妓局。
  • req.protocol

    • 用于標(biāo)識請求的協(xié)議( http 或 https )总放。
  • req.secure

    • 一個簡便屬性,如果連接是安全的,將返回 true 。等同于req.protocol==='https' 好爬。
  • req.url/req.originalUrl

    • 有點用詞不當(dāng),這些屬性返回了路徑和查詢字符串(它們不包含協(xié)議局雄、主機或端口)。req.url 若是出于內(nèi)部路由目的,則可以重寫,但是 req.orginalUrl 旨在保留原始請求和查詢字符串存炮。
  • req.acceptedLanguages

    • 一個簡便方法,用來返回客戶端首選的一組(人類的)語言炬搭。這些信息是從請求報頭中解析而來的。
響應(yīng)對象

響應(yīng)對象(通常傳遞到回調(diào)方法,這意味著你可以隨意命名它,通常命名為 res 穆桂、 resp 或response )的生命周期始于 Node 核心對象 http.ServerResponse 的實例宫盔。Express 添加了一些附加功能。我們來看看響應(yīng)對象中最有用的屬性和方法(所有這些方法都是由 Express添加的)享完。

  • res.status(code)

    • 設(shè)置 HTTP 狀態(tài)代碼灼芭。Express 默認(rèn)為 200(成功),所以你可以使用這個方法返回狀態(tài)404(頁面不存在)或 500(服務(wù)器內(nèi)部錯誤),或任何一個其他的狀態(tài)碼。對于重定向(狀態(tài)碼 301般又、302彼绷、303 和 307),有一個更好的方法: redirect 。
  • res.set(name,value)

    • 設(shè)置響應(yīng)頭倒源。這通常不需要手動設(shè)置苛预。
  • res.cookie(name,vaue,[options]),res.clearCookie(name,[options])

    • 設(shè)置或清除客戶端 cookies 值句狼。需要中間件支持笋熬。
  • res.redirect([status],url)

    • 重定向瀏覽器。默認(rèn)重定向代碼是 302(建立)腻菇。通常,你應(yīng)盡量減少重定向,除非永久移動一個頁面,這種情況應(yīng)當(dāng)使用代碼 301(永久移動)胳螟。
  • res.send(body),res.send(status,body)

    • 向客戶端發(fā)送響應(yīng)及可選的狀態(tài)碼昔馋。Express 的默認(rèn)內(nèi)容類型是text/html 秘遏。如果你想改為 text/plain ,需要在 res.send 之前調(diào)用res.set('Content-Type','text/plain') 嘉竟。如果 body 是一個對象或一個數(shù)組,響應(yīng)將會以 JSON 發(fā)送(內(nèi)容類型需要被正確設(shè)置),不過既然你想發(fā)送 JSON,我推薦你調(diào)用 res.json 舍扰。
  • res.json(json),res.json(status,json)

    • 向客戶端發(fā)送 JSON 以及可選的狀態(tài)碼。
  • res.jsonp(json),req.jsonp(status,json)

    • 向客戶端發(fā)送 JSONP 及可選的狀態(tài)碼陵且。
  • res.type(type)

    • 一個簡便的方法,用于設(shè)置 Content-Type 頭信息慕购。基本上相當(dāng)于 res.set('Content-Type','type') ,只是如果你提供了一個沒有斜杠的字符串,它會試圖把其當(dāng)作文件的擴展名映射為一個互聯(lián)網(wǎng)媒體類型沪悲。比如, res.type('txt') 會將 Content-Type 設(shè)為text/plain 可训。此功能在有些領(lǐng)域可能會有用(例如自動提供不同的多媒體文件)但是通常應(yīng)該避免使用它,以便明確設(shè)置正確的互聯(lián)網(wǎng)媒體類型握截。
  • res.format(object)

    • 這個方法允許你根據(jù)接收請求報頭發(fā)送不同的內(nèi)容烂叔。這是它在 API 中的主要用途,我們這里有一個非常簡單的例子:
      res.format({'text/plain':'hithere','text/html':'<b>hi there</b>'}) 。
  • res.attachment([filename]),res.download(path,[filename],[callback])

    • 這兩種方法會將響應(yīng)報頭 Content-Disposition 設(shè)為 attachment ,這樣瀏覽器就會選擇下載而不是展現(xiàn)內(nèi)容胯努。你可以指定 filename 給瀏覽器作為對用戶的提示叶沛。用 res.download 可以指定要下載的文件,而 res.attachment 只是設(shè)置報頭忘朝。另外,你還要將內(nèi)容發(fā)送到客戶端。
  • res.sendFile(path,[option],[callback])

    • 這個方法可根據(jù)路徑讀取指定文件并將內(nèi)容發(fā)送到客戶端晦墙。使用該方法很方便晌畅。使用靜態(tài)中間件,并將發(fā)送到客戶端的文件放在公共目錄下,這很容易寡痰。然而,如果你想根據(jù)條件在相同的 URL 下提供不同的資源,這個方法可以派上用場。
  • res.links(links)

    • 設(shè)置鏈接響應(yīng)報頭谓谦。這是一個專用的報頭,在大多數(shù)應(yīng)用程序中幾乎沒有用處反粥。
  • res.locals,res.render(view,[locals],callback)

    • res.locals 是一個對象,包含用于渲染視圖的默認(rèn)上下文疲迂。res.render 使用配置的模板引擎渲染視圖(不能把 res.render 的 locals 參數(shù)與 res.locals 混為一談,上下文在 res.locals 中會被重寫,但在沒有被重寫的情況下仍然可用)。 res.render 的默認(rèn)響應(yīng)代碼為 200,使用 res.status 可以指定一個不同的代碼郑气。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市示弓,隨后出現(xiàn)的幾起案子奏属,更是在濱河造成了極大的恐慌,老刑警劉巖囱皿,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耕渴,死亡現(xiàn)場離奇詭異齿兔,居然都是意外死亡窄做,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門吻商,熙熙樓的掌柜王于貴愁眉苦臉地迎上來糟红,“玉大人,你說我怎么就攤上這事柒爸∩又桑” “怎么了求橄?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵罐农,是天一觀的道長涵亏。 經(jīng)常有香客問我气筋,道長,這世上最難降的妖魔是什么宠默? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任或南,我火速辦了婚禮采够,結(jié)果婚禮上冰垄,老公的妹妹穿的比我還像新娘。我一直安慰自己隅要,他們只是感情好步清,可當(dāng)我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布廓啊。 她就那樣靜靜地躺著谴轮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪第步。 梳的紋絲不亂的頭發(fā)上雌续,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天驯杜,我揣著相機與錄音鸽心,去河邊找鬼居暖。 笑死,一個胖子當(dāng)著我的面吹牛糯景,可吹牛的內(nèi)容都是我干的蟀淮。 我是一名探鬼主播钞澳,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼策治,長吁一口氣:“原來是場噩夢啊……” “哼通惫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起珊燎,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤料按,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后垄潮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弯洗,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡牡整,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了迫摔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沐扳。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖句占,靈堂內(nèi)的尸體忽然破棺而出沪摄,到底是詐尸還是另有隱情,我是刑警寧澤纱烘,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布杨拐,位于F島的核電站,受9級特大地震影響擂啥,放射性物質(zhì)發(fā)生泄漏戏阅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一啤它、第九天 我趴在偏房一處隱蔽的房頂上張望奕筐。 院中可真熱鬧舱痘,春花似錦芭逝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽途蒋。三九已至螃壤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留驾茴,地道東北人。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓们拙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親殊者。 傳聞我的和親對象是個殘疾皇子摔刁,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容