HTTP 概念


Posted by ericcch24 on 2020-10-16

  • HTTP 超文本傳輸協定:是全球資訊網的資料通訊的基礎,也就是使用網際網路的協定(標準)
  • HTTPS: 全名 超文本傳輸安全協定,那個 S 就是 Secure 的意思;HTTPS 透過 HTTP 進行通訊,但通訊過程使用 SSL/TLS 進行加密,藉由類似於前述的加密方式,在 HTTP 之上定義了相對安全的資料傳輸方法。
  • HTTP request 流程:

    1. 瀏覽器傳 HTTP request 到 server

    2. server 回傳一個 response (是只有瀏覽器能識別的 code),經過瀏覽器渲染之後才會變成我們看到的畫面。


    • 雜魚 -> 寫紙條(內容有一定格式) -> 傳給千千
    • 千千 -> 處理 -> 傳紙條給雜魚

    • 瀏覽器 -> 製造 request -> 傳給 server
    • server -> 處理 -> 傳 response 回來

  • Domain Name System:

    • 處理 domain name(請求的網址)跟實際 IP 位置的轉換
    • nslookup 網址:可以查 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, 是便當比喻的不同服務,訂飲料、即時戰況等等

哈佛 HTTP 課程補充教材

tags: Week4

#week4







Related Posts

1789. Primary Department for Each Employee

1789. Primary Department for Each Employee

22 Python - Web Crawler Request Data

22 Python - Web Crawler Request Data

蔡比八寫後端(6) - TypeORM entity & column

蔡比八寫後端(6) - TypeORM entity & column


Comments