1. 程式人生 > >Node+Express中請求和響應物件

Node+Express中請求和響應物件

在用 Express 構建 Web 伺服器時,大部分工作都是從請求物件開始,到響應物件終止

url的組成:


協議
協議確定如何傳輸請求。我們主要是處理 http 和 https。其他常見的協議還有 file 和 ftp。
主機名
主機名標識伺服器。執行在本地計算機(localhost)和本地網路的伺服器可以簡單地表示,比如用一個單詞,或一個數字 IP 地址。在 Internet 環境下,主機名通常以一個頂級域名(TLD)結尾,比如 .com 或 .net。另外,也許還會有子域名作為主機名的字首。請求和響應物件子域名可以是任何形式的,其中 www 最為常見。子域名通常是可選的。

每一臺伺服器都有一系列埠號。一些埠號比較“特殊”,如 80 和 443 埠。如果省略埠值,那麼預設 80 埠負責 HTTP 傳輸,443 埠負責 HTTPS 傳輸。如果不使用 80 和 443 埠,就需要一個大於 10231的埠號。通常使用容易記憶的埠號,如3000、8080 或 8088。
路徑


URL 中影響應用程式的第一個組成部分通常是路徑(在考慮協議、主機名和埠的基礎上做決定很合理,但是不夠好)。路徑是應用中的頁面或其他資源的唯一標識。
查詢字串
查詢字串是一種鍵值對集合,是可選的。它以問號(?)開頭,鍵值對則以與號(&)分隔開。所有的名稱和值都必須是 URL 編碼的。對此,JavaScript 提供了一個嵌入式的函式 encodeURIComponent 來處理。例如,空格被加號(+)替換。其他特殊字元被數字型字元替換。
資訊片段
資訊片段(或雜湊)被嚴格限制在瀏覽器中使用,不會傳遞到伺服器。用它控制單頁應用或 AJAX 富應用越來越普遍。最初,資訊片段只是用來讓瀏覽器展現文件中通過錨點標記(<a id="chapter06">)指定的部分

HTTP請求方法
HTTP 協議確定了客戶端與伺服器通訊的請求方法集合(通常稱為 HTTP verbs)。很顯然,GET 和 POST 最為常見。在瀏覽器中鍵入一個 URL(或點選一個連結),伺服器會接收到一個 HTTP GET 請求,其中的重要資訊是 URL 路徑和查詢字串。至於如何響應,則需要應用程式結合方法、路徑和查詢字串來決定。對於一個網站來說,大部分頁面都響應 GET 請求。POST 請求通常用來提交資訊到伺服器後臺(例如表單處理)。伺服器將請求中包含的所有資訊(例如表單)處理完成之後,用以響應的 HTML 通常與相應的 GET 請求是一樣的。與伺服器通訊時,瀏覽器只使用 GET 和

POST 方法(如果沒有使用 AJAX)。另一方面,網路服務通常會使用更多的創造性 HTTP 方法。例如,一個 HTTP 方法被命名注 1: 0~1023 埠為“知名埠”。為 DELETE,它就用來接受 API 指令執行刪除功能。
使用 Node 和 Express,可以完全掌控響應方法(儘管一些更復雜的方法支援得不是很好)。在 Express 中,通常要針對特殊方法編寫處理程式。

請求報頭
我們瀏覽網頁時,傳送到伺服器的並不只是 URL。當你訪問一個網站時,瀏覽器會發送很多“隱形”資訊。這裡討論的並不是個人資訊洩露問題(瀏覽器被惡意軟體侵染時會出現這個問題)。伺服器會因此得知優先響應哪種語言的頁面(例如,在西班牙下載 Chrome 瀏覽器,如果有西班牙語的版本,就會接收到一個西班牙語的訪問頁面)。它也會發送“用戶代理”資訊(瀏覽器、作業系統和硬體裝置)和其他一些資訊。所有能夠確保你瞭解請求物件標頭檔案屬性的資訊都將會作為請求報頭髮送。如果想檢視瀏覽器傳送的資訊,可以建立一個非常簡單的 Express 路由來展示一下:
app.get('/headers', function(req,res){
res.set('Content-Type','text/plain');
var s = '';
for(var name in req.headers) s += name + ': ' + req.headers[name] + '\n';
res.send(s);
});

響應報頭
正如瀏覽器以請求報頭的形式傳送隱藏資訊到伺服器,當伺服器響應時,同樣會回傳一些瀏覽器沒必要渲染和顯示的資訊,通常是元資料和伺服器資訊。我們已經熟悉內容型別頭資訊,它告訴瀏覽器正在被傳輸的內容型別(網頁、圖片、樣式表、客戶端指令碼等)。特別要注意的是,不管 URL 路徑是什麼,瀏覽器都根據內容型別報頭處理資訊。因此你可以通過一個叫作 /image.jpg 的路徑提供網頁,也可以通過一個叫作 /text.html 的路徑提供圖片。(這樣做並不合情理,這裡要講的重點是路徑是抽象的,瀏覽器只根據內容型別來決定內容該如何渲染。)除了內容型別之外,報頭還會指出響應資訊是否被壓縮,以及使用的是哪種編碼。響應報頭還可以包含關於瀏覽器對資源快取時長的提示。優化網站時需要著重考慮這一點。響應報頭還經常會包含一些關於伺服器的資訊,一般會指出伺服器的型別,有時甚至會包含作業系統的詳細資訊。返回伺服器資訊存在一個問題,那就是它會給黑客一個可乘之機,從而使站點陷入危險。非常重視安全的伺服器經常忽略此資訊,甚至提供虛假資訊。禁用 Express 的 X-Powered-By 頭資訊很簡單:
app.disable('x-powered-by');在瀏覽器的開發者工具中可以找到響應報頭資訊。例如,在 Chrome 瀏覽器中檢視響應報
頭資訊的操作如下:
請求和響應物件 
(1) 開啟控制檯。
(2) 點選網路標籤頁。
(3) 重新載入頁面。
(4) 在請求列表中選取網頁(通常是第一個)。
(5) 點選報頭標籤頁,你就可以看到所有響應報頭資訊了。

網際網路媒體型別

內容型別報頭資訊極其重要,沒有它,客戶端很難判斷如何渲染接收到的內容。內容型別報頭就是一種網際網路媒體型別,由一個型別、一個子型別以及可選的引數組成。例如,text/html;charset=UTF-8 說明型別是 text,子型別是 html,字元編碼是 UTF-8。網際網路編號分配機構維護了一個官方的網際網路媒體型別清單http://www.iana.org/assignments/media-types/media-types.xhtml)。我們常見的 content type、Internet media type 和 MIME type 是可以互換的。MIME(多用途網際網路郵件擴充套件)是網際網路媒體型別的前身,它們大部分是相
同的。

請求體
請求報頭外,請求還有一個主體(就像作為實際內容返回的響應主體一樣)。一般 GET請求沒有主體內容,但 POST 請求是有的。POST 請求體最常見的媒體型別是 application/x-www-form-urlendcoded,是鍵值對集合的簡單編碼,用 & 分隔(基本上和查詢字串的格式一樣)。如果 POST 請求需要支援檔案上傳,則媒體型別是 multipart/form-data,它是一種更為複雜的格式。最後是 AJAX 請求,它可以使用 application/json。

引數

“引數”這個詞可以有很多種解釋,它通常是困惑的源頭。對於任何一個請求,引數可以來自查詢字串、會話、請求體或指定的路由引數。在 Node 應用中,請求物件的引數方法會重寫所有的引數。因此我們最好不要深究。通常這會帶來問題,一個引數在查詢字串中,另一個在 POST 請求體中或會話中,哪個會贏呢?這會產生讓人抓狂的 bug。PHP 是產生這種混亂的主要原因:為了儘量“方便”,它將所有引數重新寫入了一個稱為 $_REQUEST 的變數,由於某種原因,人們曾認為這是個前所未有的好主意。我們將學習儲存不同型別引數的專用屬性,我認為這能夠減少困惑。

請求物件
請求物件(通常傳遞到回撥方法,這意味著你可以隨意命名,通常命名為 req 或 request)的生命週期始於 Node 的一個核心物件 http.IncomingMessage 的例項。Express 添加了一些附加功能。我們來看看請求物件中最有用的屬性和方法(除了來自 Node 的 req.headers 和req.url,所有這些方法都由 Express 新增)。
req.params
一個數組,包含命名過的路由引數。
req.param(name)
返回命名的路由引數,或者 GET 請求或 POST 請求引數。建議你忽略此方法。
req.query
一個物件,包含以鍵值對存放的查詢字串引數(通常稱為 GET 請求引數)。
req.body
一個物件,包含 POST 請求引數。這樣命名是因為 POST 請求引數在 REQUEST 正文中傳遞,而不像查詢字串在 URL 中傳遞。要使 req.body 可用,需要中介軟體能夠解析請求正文內容型別
req.route
關於當前匹配路由的資訊。主要用於路由除錯。
req.cookies/req.singnedCookies
一個物件,包含從客戶端傳遞過來的 cookies 值。
從客戶端接收到的請求報頭。
req.accepts([types])
一個簡便的方法,用來確定客戶端是否接受一個或一組指定的型別(可選型別可以是單個的 MIME 型別,如 application/json、一個逗號分隔集合或是一個數組)。寫公共API 的人對該方法很感興趣。假定瀏覽器預設始終接受 HTML。
req.ip
客戶端的 IP 地址。
req.path
請求路徑(不包含協議、主機、埠或查詢字串)。
req.host
一個簡便的方法,用來返回客戶端所報告的主機名。這些資訊可以偽造,所以不應該用於安全目的。
請求和響應物件 
req.xhr
一個簡便屬性,如果請求由 Ajax 發起將會返回 true。
req.protocol
用於標識請求的協議(http 或 https)

req.secure
一個簡便屬性,如果連線是安全的,將返回 true。等同於 req.protocol==='https'。
req.url/req.originalUrl
有點用詞不當,這些屬性返回了路徑和查詢字串(它們不包含協議、主機或埠)。
req.url 若是出於內部路由目的,則可以重寫,但是 req.orginalUrl 旨在保留原始請求
和查詢字串。
req.acceptedLanguages
一個簡便方法,用來返回客戶端首選的一組(人類的)語言。這些資訊是從請求報頭中
解析而來的。

響應物件
響應物件(通常傳遞到回撥方法,這意味著你可以隨意命名它,通常命名為 res、resp 或response)的生命週期始於 Node 核心物件 http.ServerResponse 的例項。Express 添加了一些附加功能。我們來看看響應物件中最有用的屬性和方法(所有這些方法都是由 Express新增的)。
res.status(code)
設定 HTTP 狀態程式碼。Express 預設為 200(成功),所以你可以使用這個方法返回狀態404(頁面不存在)或 500(伺服器內部錯誤),或任何一個其他的狀態碼。對於重定向(狀態碼 301、302、303 和 307),有一個更好的方法:redirect。
res.set(name,value)
設定響應頭。這通常不需要手動設定。
res.cookie(name,vaue,[options]),res.clearCookie(name,[options])
設定或清除客戶端 cookies 值。需要中介軟體支援
res.redirect([status],url)
重定向瀏覽器。預設重定向程式碼是 302(建立)。通常,你應儘量減少重定向,除非永久移動一個頁面,這種情況應當使用程式碼 301(永久移動)。
res.send(body),res.send(status,body)
向客戶端傳送響應及可選的狀態碼。Express 的預設內容型別是 text/html。如果你想改為 text/plain,需要在 res.send 之前呼叫 res.set('Content-Type','text/plain\')。如果 body 是一個物件或一個數組,響應將會以 JSON 傳送(內容型別需要被正確設定),不過既然你想傳送 JSON,我推薦你呼叫 res.json。
res.json(json),res.json(status,json)
向客戶端傳送 JSON 以及可選的狀態碼。
res.jsonp(json),req.jsonp(status,json)
向客戶端傳送 JSONP 及可選的狀態碼。
res.type(type)
一個簡便的方法,用於設定 Content-Type 頭資訊。基本上相當於 res.set('Content-Type','type'),只是如果你提供了一個沒有斜槓的字串,它會試圖把其當作檔案的副檔名對映為一個網際網路媒體型別。比如,res.type('txt') 會將 Content-Type 設為text/plain。此功能在有些領域可能會有用(例如自動提供不同的多媒體檔案),但是通常應該避免使用它,以便明確設定正確的網際網路媒體型別。
res.format(object)
這個方法允許你根據接收請求報頭髮送不同的內容。這是它在 API 中的主要用途,我們將會在第 15 章詳細討論。這裡有一個非常簡單的例子:res.format({'text/plain':'hithere','text/html':'<b>hi there</b>'})。
res.attachment([filename]),res.download(path,[filename],[callback])
這兩種方法會將響應報頭 Content-Disposition 設為 attachment,這樣瀏覽器就會選擇下載而不是展現內容。你可以指定 filename 給瀏覽器作為對使用者的提示。用 res.download 可以指定要下載的檔案,而 res.attachment 只是設定報頭。另外,你還要將內容傳送到客戶端。
res.sendFile(path,[option],[callback])
這個方法可根據路徑讀取指定檔案並將內容傳送到客戶端。使用該方法很方便。使用靜態中介軟體,並將傳送到客戶端的檔案放在公共目錄下,這很容易。然而,如果你想根據條件在相同的 URL 下提供不同的資源,這個方法可以派上用場。
res.links(links)
設定連結響應報頭。這是一個專用的報頭,在大多數應用程式中幾乎沒有用處。
res.locals,res.render(view,[locals],callback)
res.locals 是一個物件,包含用於渲染檢視的預設上下文。res.render 使用配置的模
請求和響應物件 
板引擎渲染檢視(不能把 res.render 的 locals 引數與 res.locals 混為一談,上下文
res.locals 中會被重寫,但在沒有被重寫的情況下仍然可用)。res.render 的預設響
應程式碼為 200,使用 res.status 可以指定一個不同的程式碼。

相關推薦

Node+Express請求響應物件

在用 Express 構建 Web 伺服器時,大部分工作都是從請求物件開始,到響應物件終止。 url的組成: 協議 協議確定如何傳輸請求。我們主要是處理 http 和 https。其他常見的協議還有 file 和 ftp。主機名 主機名標識伺服器。執行在本地計算機(lo

HTTP請求響應淺析

cati odi 客戶端 9.png bubuko 連接 str tps size HTTP中的請求 HTTP中請求由三部分組成: HTTP中請求行:請求行分為三部分(請求方法+請求地址+協議和版本)例: POST/GET https://www.baidu.com/

9.13 檢視層之請求物件響應物件

解耦: 從瀏覽器訪問都是get請求,post請求可以是從form表單method=post       二、請求物件:         匹配到根路徑:    

Spring Boot擴充套件XML請求響應的支援

在Spring Boot中,我們大多時候都只提到和用到了針對HTML和JSON格式的請求與響應處理。那麼對於XML格式的請求要如何快速的在Controller中包裝成物件,以及如何以XML的格式返回一個物件呢? 實現原理:訊息轉換器(Message Converter) 在擴充套件上述問題之前,我們先要知

Spring Boot如何擴充套件對XML格式請求響應的支援

在Spring Boot中,對於XML格式的請求要如何快速的在Controller中包裝成物件,以及如何再以XML的格式返回一個物件呢? 實現原理:訊息轉換器(Message Converter) 在擴充套件上述問題之前,我們先要知道Spring Boot中處理HTTP請求的實現是採用的Sp

Django檢視層之請求物件(request)響應物件(HttpResponse)

1.請求物件(request) request屬性 django將請求報文中的請求行,首部資訊,內容主體封裝成HttpRequest類中的屬性。除了特殊說明的之外,其他的均為只讀。 1.HttpRequest.GET   一個類似於字典的物件,包含 HTTP GET 的所有引數。詳情請參考 Qu

Spring Boot擴充套件XML請求響應實戰

一 點睛 對於XML格式的請求要如何快速的在Controller中包裝成物件,以及如何以XML的格式返回一個物件,被篇將討論這一方面的主題。 二 訊息轉換器 Spring Boot中處理HTTP請求的實現是採用的Spring MVC。而在Spring MVC中有一個訊息

Node.jsGetPost請求

   對於HTTP請求來說,我們通常使用的是Get和Post,除此之外還有put,delete等,而對於get來說,比較lightweight,只是對字串的傳輸,它會被新增到URL地址裡,屬於URL的一部分;而對於Post來說,就顯得重了一些,它的資料以包的形式存在,除了可以

JavaWeb的Http協議請求響應

1:HTTP的定義 HTTP是hypertext transfer protocol(超文字傳輸協議)的簡寫,它是TCP/IP協議的一個應用層協議 用於定義WEB瀏覽器與WEB伺服器之間交換資料的過程 客戶端連上web伺服器後,若想獲得web伺服器中的某個web資源,需

HTTP請求響應 中文urlEncode urlDecode編碼問題

http請求時,如果附帶的引數被URLEncode之後,到達web容器之後,開發者獲取到的引數值會自動變成了encode之前的值。這是一個很好的特點,開發者完全可以忽略http的引數是否需要decode這種事 tomcat會對請求引數中的中文自動進行urlDecode解

HTTP協議的請求物件響應物件

HTTP協議: 什麼是HTTP,Http是超文字傳輸協議,從瀏覽器到伺服器稱為請求,從伺服器回到瀏覽器稱之為響應 請求物件:(HttpServletRequest): 請求物件分為請求頭,請求行以及請求實體下面分別來講一下:        請求行包括:傳輸方式(g

Spring Boot如何擴充套件XML請求響應的支援

開發十年,就只剩下這套架構體系了! >>>   

ThinkPHP5學習筆記(6)請求響應

thinkphp在線視頻課程:http://www.kancloud.cn/tpshop/thinkphp5/220692Request請求對象和Response響應對象$_GET、$_POST、$_REQUEST、$_COOKIE調用請求對象$request=Request::instance()$this

ThinPHP_5的請求響應

nbsp 響應 XML quest efault dex 動態 ont instance    thinkphp的請求對象request  所有請求的參數都可以通過request接收 方法一:   request();助手函數 方法二:   use think\Requ

HTTP請求響應2:方法(Method)

trace 行處理 診斷 ack 中間 delete nds 最優 eas 方法表明了client希望server對資源運行的動作。經常使用的方法包含:GET、HEAD、POST、PUT、TRACE、OPTIONS和DELETE,每一個server能夠實現這些方法中

node 命令 & && 的區別

package tex 三次 ont str 總結 lin cal amp node first.js & node second.js 執行結果: 第一次:   first.js  second.js 第二次:   second.js  first.j

web應用程序的請求響應

pan web lar 服務器端 web應用 返回 ont span 靜態資源 瀏覽器拿到index.html文件後,就開始解析其中的html代碼,遇到js/css/image等靜態資源時,就向服務器端去請求下載(會使用多線程下載,每個瀏覽器的線程數不一樣),這個時候就用

django rest-framework 2.請求響應

str val cor 之前 man .post 狀態碼 del exc 一、請求對象 REST 框架引入Request來擴展常規的HttpRequest,並提供了更靈活的請求解析。Request對象的核心功能是request.data屬性。 導入方式: from rest

請求響應

location oct 求一個 不變 pragma 部分 情況 區別 password 服務器處理請求的流程: 服務器每次收到請求時,都會為這個請求開辟一個新的線程。 服務器會把客戶端的請求數據封裝到request對象中,request就是請求數據的載體!

在IIS Express配置啟動web site

res step ram pre 編輯 log .config host file Step 1 進入 C:\Users\【User】\Documents\IISExpress\config 。 編輯applicationhost.config文件 加入站點信息如下