2017-03-11 150 views
0

我對編程相當陌生,這個問題是關於確保我正確地獲得HTTP協議。我的問題是,當我閱讀HTTP請求/響應時,它看起來需要採用狀態碼,HTTP版本號,頭部以及正文後面的空白行的非常特定的格式。HTTP響應如何生成

但是,使用nodejs/express創建一個web應用後,我從來沒有真正寫過以這種格式編寫HTTP響應的代碼(我假設,儘管我不確定其他框架在軌道上的紅寶石或python/Django是相同的)。在快速應用程序中,我只是設置路線處理程序來呈現適當的頁面,當對該路線發出請求時。

這是因爲快遞實際上是在正確的HTTP格式背後的響應?換句話說,如果我查看expressJS代碼,那麼該代碼中是否會有一些實際上以HTTP格式生成HTTP響應的內容?

我的困惑是,它看起來像HTTP請求/響應格式是如此重要,但不知怎的,我從來不必編寫任何代碼來處理節點/快速應用程序。也許這就像是一個像express一樣的框架的整個要點...去掉細節,以便開發人員可以處理業務邏輯。如果這是正確的,有沒有人寫網絡應用程序沒有框架來做到這一點。你會負責編寫將服務器的響應轉換爲精確的HTTP格式的代碼嗎?

回答

0

我是相當新的編程這個問題是關於如何確保我得到HTTP協議正確。我的問題是,當我閱讀HTTP請求/響應時,它看起來需要採用狀態碼,HTTP版本號,頭部以及正文後面的空白行的非常特定的格式。

只是給你一個想法,可能有數百個與HTTP協議有關的規範。它們不僅處理協議本身,而且還處理髮送的所有內容的數據格式/編碼,包括標題和所有可發送的各種內容類型,身份驗證方案,緩存,狀態碼,URL解碼等。可以通過查看這裏看到一些涉及的規範:https://www.w3.org/Protocols/

現在一個簡單的請求和一個簡單的文本響應可以逃脫只知道這些規範中的一些,但生活並不總是如此簡單。

這是因爲express實際上是在正確的HTTP格式後面將響應放在幕後?換句話說,如果我查看expressJS代碼,那麼該代碼中是否會有一些實際上以HTTP格式生成HTTP響應的內容?

是的,會有。 Express和HTTP library內置在node.js中的組合處理規範的所有細節。這是使用庫/框架的優勢。他們甚至可以處理不同版本的協議,並且來自數千名其他開發人員的反饋幫助他們清除了邊緣案例錯誤。一個好的庫/框架允許您仍然控制有關響應的任何細節(標題,內容類型,狀態代碼等),而無需通過實際創建確切響應的詳細工作。這是一件好事。它可以讓你更快地編寫代碼,並讓你騎在已經弄清楚與您的應用邏輯無關的細節細節的其他人肩上。

事實上,人們可以對HTTP協議下面的TCP協議說同樣的話。沒有普通的應用程序開發人員想要編寫自己的TCP堆棧。相反,你只需要一個可以使用的TCP堆棧,它已經爲你調整和調試過了。

但是,創建一個帶有nodejs/express的web應用程序後,我從來沒有真正寫過以這種格式編寫HTTP響應的代碼(我假設,儘管我不確定其他人Ruby on Rails或python/Django等框架是相同的)。在快速應用程序中,我只是設置路線處理程序來呈現適當的頁面,當對該路線發出請求時。

是的,這是件好事。該框架爲您做了詳細的工作。您只需撥打res.setHeader(),res.status(),res.cookie(),res.send(),res.json()等,Express會爲您提供整個回覆。

如果這是正確的,有沒有人寫網絡應用程序沒有框架來做到這一點。你會負責編寫將服務器的響應轉換爲精確的HTTP格式的代碼嗎?

如果您沒有使用任何類型的框架或庫,並且在原始TCP層進行編程,那麼您會負責HTTP協議的所有細節。但是,除了圖書館開發人員之外,幾乎沒有人會這樣做,因爲坦率地說,這只是浪費時間。每一個平臺都至少有一個開源庫,可以實現這一點,即使您正在開發一個全新的平臺,您也可以獲得一個開源的代碼體,並將其移植到您的平臺上,比您可以編寫所有這些更快你自己。


記住的node.js的巨大優勢之一是,有開放源代碼(主要是在NPM和Github上)一個巨大的身體已經預打包node.js中工作而且,由於node.js是服務器端,代碼內存通常不太緊密,而代碼只是在服務器初始化時從本地硬盤來的地方,所以抓住正在運行並經過測試的軟件包幾乎沒有什麼不利之處,即使你只打算使用包中5%的功能。或者,最糟糕的情況是克隆現有的存儲庫並進行修改以完全滿足您的需求。

0

這是因爲express實際上是在後臺以正確的HTTP格式響應 ?

是的,沒錯,HTTP是無處不在,幾乎所有的編程語言/框架處理的HTTP幕後的實際寫作和解析。

有沒有人寫過沒有框架的網絡應用程序來做到這一點。 您是否負責編寫將服務器的 響應轉換爲確切的HTTP格式的代碼?

決不(除非你正在編寫需要的HTTP代碼什麼的非常低的水平的調整代碼)