- HTTP 超文本傳輸協定:是全球資訊網的資料通訊的基礎,也就是使用網際網路的協定(標準)
- HTTPS: 全名 超文本傳輸安全協定,那個 S 就是 Secure 的意思;HTTPS 透過 HTTP 進行通訊,但通訊過程使用 SSL/TLS 進行加密,藉由類似於前述的加密方式,在 HTTP 之上定義了相對安全的資料傳輸方法。
HTTP request 流程:
瀏覽器傳 HTTP request 到 server
server 回傳一個 response (是只有瀏覽器能識別的 code),經過瀏覽器渲染之後才會變成我們看到的畫面。
- 雜魚 -> 寫紙條(內容有一定格式) -> 傳給千千
千千 -> 處理 -> 傳紙條給雜魚
- 瀏覽器 -> 製造 request -> 傳給 server
- server -> 處理 -> 傳 response 回來
Domain Name System:
- 處理 domain name(請求的網址)跟實際 IP 位置的轉換
nslookup 網址
:可以查 IP 位置
- 處理 domain name(請求的網址)跟實際 IP 位置的轉換
- localhost:也叫 local ,正確的解釋是:本地伺服器
- 127.0.0.1:在 windows 等系統的正確解釋是:本機地址(本機伺服器)
- 在說明 DNS Server 前,可能要先說明什麼叫 Domain Name,在網路上辨別一台電腦的方式是利用 IP,但是一組 IP 數字很不容易記,且沒有什麼聯想的意義,因此,我們會為網路上的伺服器取一個有意義又容易記的名字,這個名字我們就叫它「Domain Name」。但由於在 Internet 上真實在辨識機器的還是 IP,所以當使用者輸入Domain Name後,瀏覽器必須要先去一台有 Domain Name 和 IP 對應資料的主機去查詢這台電腦的 IP,而這台被查詣的主機,我們稱它為 Domain Name Server,簡稱 DNS,
參考資料
Domain Name(網域名稱)
一個是“本地”,一個是“本機”。不過從這兩個詞來看,還是不能比較兩者的區別。我們再看看他們的工作原理。
- localhot:是不經網絡卡傳輸的,它不受網路防火牆和網絡卡相關的的限制。
- 127.0.0.1:是通過網絡卡傳輸的,它依賴網絡卡,並受到網路防火牆和網絡卡相關的限制。
- 本地主機 localhost 是一個域名,這個域名對應的的IP位址是127.0.0.1,這個域名不能直接綁定套接字,需要DNS進行域名解析,只是說解析是在本地完成,不需要遠程的域名伺服器進行解析。
- 127.0.0.1 這個地址通常分配給 loopback 接口。loopback 是一個特殊的網絡接口(可理解成虛擬網卡),用於本機中各個應用之間的網絡交互。只要作業系統的網絡組件是正常的,loopback 就能工作。
參考資料
- 瀏覽器只是一個程式,幫你處理上面的流程。如果沒有瀏覽器,一樣可以發 request ,拿 response。
存一個 html 檔並導入下面 js 檔案
node index.js > google.html
,就可以實際執行。const request = require('request'); request('http://www.google.com', function (error, response, body) { console.error('error:', error); // Print the error if one occurred console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received console.log('body:', body); // Print the HTML for the Google homepage. });
request 與 response 都分別有各自的 Header & Body(符合 HTTP 通訊協定,其他通訊協定有符合該通訊協定的 Header & Body),分別代表不同的資訊。
- Header 放額外附加的資訊,Body 放主要資訊。
- Header 的名稱與內容資訊必須為字串
const request = require('request');
const options = {
url: 'https://api.twitch.tv/kraken/games/top',
headers: {
'Client-ID': '1oymoviz1aa1vi91cj12n1nisqs5ay',
'Accept': 'application/vnd.twitchtv.v5+json'
}
};
request(options, (error, response, body) => {
let data;
try {
data = JSON.parse(body);
} catch (error) {
console.log('串接失敗', error);
}
for(let i = 0; i < data.top.length; i++) {
console.log(`${data.top[i].viewers} ${data.top[i].game.name}`);
}
})
常用的 HTTP 請求方法
- get 種類的 request:
- 使用頻率高,請求展示指定資源。使用 GET 的請求只應用於取得資料。
- 流程:發一個 get 的 request 到圖中的 URL 網址(也就是在網址列打一個網址然後 enter),然後得到回傳的 response 之後顯示出結果。
- post 種類的 request:
- 用於提交指定資源的實體,通常會改變伺服器的狀態或副作用(side effect)。
- 這時候會有 request body ,因為有輸入資訊,例如登入頁面的帳號密碼。
- 相當於訂便當比喻中的資訊:雞腿飯 2、排骨飯 5
- put
- 會取代指定資源所酬載請求(request payload)的所有表現。
- 會覆蓋掉原本的資訊。
- patch
- 套用指定資源的部份修改。
- 只會根據提出的地方修改。
- delete
- 會刪除指定資源。
HTTP Status Code 狀態碼
==response.statusCode
==
- 200 => OK
- 204 => No Content 成功處理請求但沒有返回任何內容
- 301 => Moved Permanently 被請求的資源已永久移到新位置。
- 302 => Found 要求用戶端臨時重新導向,與 301 的差別是暫時轉移。
- 400 => bad request,例如語法錯誤,太大。
- 404 => Not Found,請求沒有的東西。
- 500 => Internal Server Error,伺服器端有錯誤,常見於搶票的時候。
- 503 => Service Unavaliable,臨時的伺服器維護或是過載。
實作簡易 HTTP server
let http = require('http')
let server = http.createServer(function(req, res) {
if (req.url === '/') { //localhost:5000/斜線後面接的東西
res.write('welcome!')
res.end()
return
}
if (req.url === '/hello') {
res.write('hello')
res.end()
return
}
if (req.url === '/redirect') {
res.writeHead(302, { //302 是回傳狀態碼,後面接 header
'Location': 'https://google.com'
})
res.end()
return
}
res.writeHead(404)
res.end()
})
server.listen(5000) //port, 是便當比喻的不同服務,訂飲料、即時戰況等等