jas0nhuang

[筆記] 傳紙條與 HTTP 基本概念

傳紙條

告白篇

  1. 來源
  2. 目的地
  3. 三次前置作業,確保收發功能(三次握手:確定發送、接收功能正常)

訂便當

  1. 格式統一
  2. 特殊需求(頭-特殊資訊、身體-內容)
  3. 回覆格式:以數字/狀態碼回應 200、300、400、404、500、503(也有頭-數字、身體-內容)
  4. 不同動作:GET POST DELET PUT

發大財

  1. 統一服務代碼:80、3000、4000、5000……
  2. 格式簡化:對不同服務可以有不同格式
  3. 加速:有些服務不用確認如 streaming
  4. 地址、校名:ip Domain
  • 為何需要協定(protocol)?
    為了讓人能夠溝通,需要規範,所以其實語言就是一種 protocol 啦!?

HTTP 是什麼

H [超] T[文本] T[傳輸] P[協定]!!!

它是一個「協定」,我們要做的事情是去瞭解它的「規則」。

HTTP 屬於網路分層中的「應用層」(Application),每層都有相關的「協定」,這個到 TCP/IP 的部分會更詳細的討論。
Web Layers

HTTP request 與 response

client ---request---> server
client <--response--- server

以瀏覽器為例:

  1. 我們在網址列輸入 https://www.google.com

  2. 瀏覽器幫我們傳一個 Request 到 server(幫我們寫紙條)
    Request 差不多長這樣(在每個瀏覽器上會有些不同):
    (因為是 GET 所以只有 head 沒有 body)

    :authority: www.google.com
    :method: GET
    :path: /
    :scheme: https
    accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
    accept-encoding: gzip, deflate, br
    accept-language: en-US,en;q=0.9
    ..................................................
  3. server 會回傳一個帶有 HTML 原始碼的 Response。(完成紙條上的要求)

  4. 瀏覽器接收到這個 Response 然後渲染(render)出來。

DNS

網路世界的郵差,進行 IP 與 Domain Name 的轉換、翻譯。
DNS 伺服器也有分層,company > isp > country > root
可以用 nslookup 查看IP 與 Domain Name 的對照。

一個神奇的檔案:/etc/hosts 裡面寫有電腦預設的 IP / Domain Name 對照表

瀏覽器與其它

除了瀏覽器可以傳送 request 與接收 response 之外,我們也可以自已寫程式完成這個任務。
使用 request 這個套件就可以寫出一個這樣的 node 程式。
(node 也有內建函式可以用。http.request(url[, options][, callback])

GET、POST 與其它

執行什麼動作:

  1. GET:最常使用,用於取得資料,通常不會有 request body,只需要 header
  2. POST:傳送資料,通常會有 request body,body 內容為要向伺服器傳送的資料
  3. DELETE:刪除資料
  4. PUT:會完全取代所選取的資料
  5. PATCH:單純對所選取的資料做某些內容的修改、或增加內容
  6. OPTIONS:會回傳可以用的方法。(例如:Allow: GET,POST)有點像是一個可執行動作的查詢功能。

HTTP 狀態碼

常見 HTTP 狀態碼:

1XX:Server 正在做事情。
2XX:

  • 204 處理了,但是不需回應,(如 DELETE)

3XX:

  • 301 Location: XXXX 瀏覽器會記住 LOC (永久移動)
  • 302 (暫時移動)

4XX:

  • 404 沒有
  • 418 查無

5XX:server錯誤

  • 500
  • 503

Google 418
Huli 418
維基百科 - HTTP 狀態碼

超簡單 HTTP Server

const http = require('http')

const server = http.createServer(function(req, res) {
console.log(req.url)
res.write('hello')
res.end()
}

server.listen(5000) // port