網頁程式設計教學:從網頁連線來看網頁程式

PUBLISHED ON DEC 3, 2018 — WEB

    在本文中,我們介紹一下網頁連線,但不會深入 HTTP 協定的細節。網頁連線代表網頁程式背後運作的方式,雖然這些東西不太會表現在程式碼上,但要意識到這個過程,以了解網頁程式的特性。

    網頁程式的組成

    網頁程式包含以下數個部分:

    網頁程式的組成

    我們將這些部分整理如下:

    • 使用者 (user agent)
    • 代理者 (proxy)
    • 網頁伺服器 (web server)
    • (選擇性) 資料庫 (database)

    網頁程式透過使用者和網頁伺服器相互溝通的方式來運作。我們一般所談的網頁程式是指網頁伺服器的部分,但也有網頁爬蟲這類身份為使用者的程式。在本節中,我們逐一來看各個部分。

    使用者 (user agent),又稱客戶端 (client),會主動向伺服器發出請求 (requests)。最常見的使用者是瀏覽器 (web browser),但還有其他形式的客戶端,像是網頁爬蟲 (web crawler) 或 curl(1)HTTPie 等做為 HTTP 客戶端的命令列工具。典型的網頁連線皆是由客戶端發起,伺服端接收。

    在使用者和網頁伺服器之間,往往不會直接相連,在連線的過程中會有數個代理者 (proxy) 存在,像是提供連線的 ISP,IP 分享器也是另一種形式的代理者。一般來說,客戶端和網頁伺服器不會知道在連線過程中有那些代理者的存在,因為這些代理者的活動都封裝在網路協定 (network protocol) 內。透過一些軟體,可以得知連線的過程 (路徑),但對網頁程式本身來說,重要性不是那麼高。

    網頁程式扮演網頁伺服器 (web server) 的角色,不過,我們很少直接寫對外連線的網頁伺服器。一般來說,我們會用更加成熟穩定的網頁伺服器,像是 Apache、Nginx、IIS (Internet Information Server) 等,做為主機對外的窗口。網頁程式設計師會再寫一個和這些網頁伺服器溝通的應用程式。我們在講網頁程式一般就是指這個部分。

    資料庫是用來儲存持久性資料的軟體,本身不算是網頁程式的一部分,而是和網頁程式相互合作以達成網頁程式所需的功能。有時候後端不僅是和資料庫溝通,而會和其他軟體互動;例如,NCBI 的 BLAST 是一個線上序列比對 (sequence alignment) 的網頁,該網頁的核心功能來自同名的命令列工具,BLAST 的輸出是透過特定生物資訊軟體比對序列資料庫的序列而得,而非單純由網頁程式直接讀取序列資料庫。

    註:序列比對是生物資訊 (bioinformatics) 中常見的一個任務,可用來比對 DNA、RNA、胺基酸 (amino acid) 等序列性資料。BLAST 是快速的序列比對演算法,可將特定序列和資料庫中大量的序列進行比較後選出相似的結果。

    網頁連線的特性

    典型的網頁連線有以下三種特性:

    • 無持續連結性 (Connectionless)
    • 無狀態 (Stateless)
    • 格式中立 (Format neutral)

    網頁連線從使用者 (user agent) 發出請求 (request) 到從網頁伺服器取得回應 (response) 後就斷開,網頁伺服器不會保留使用者的狀態。不過,這和我們平常上網的經驗相違背,有許多網站可儲存會員狀態 (membership),也會記住使用者的狀態;這並不代表我們這裡講錯了,只是網頁技術在長年的發展中用不同方式去克服原本的限制,學習網頁程式也要學習如何使用這些技術來達到我們的需求。

    一般認知上,網頁連線會傳遞網頁 (web page),但其實也可以傳遞其他格式的檔案,像是 web API 透過 JSON 在客戶端及伺服端間傳遞資料等。

    繼續深入

    一般程式人在學網頁程式設計時,很少會去買 HTTP 協定的專書來看,因為該協定的細節都由函式庫或框架處理掉了,我們很少要親自去處理這些事項。不過,有時候查詢一下 HTTP 協定,對寫程式會有一些幫助。像是 HTTP 方法 (methods)、HTTP 狀態碼 (status codes)、HTTP 標頭 (header) 等,自然而然就會知道相關函式庫或框架的 API 要如何使用。

    直接讀 W3C 的 HTTP 文件 可能太硬了,可以到 MDN 或是 TutorialsPoint 查閱 HTTP 相關的文件。這類文件不用從頭讀到尾,也不需強記;這樣讀其實也記不太住,需要時再去查詢相關段落即可。

    TAGS: WEB