美思 [網頁設計] 教學:網頁程式的組成和特性

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

前言

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

網頁程式的組成

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

網頁程式的組成

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

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

網頁程式透過使用者和網頁伺服器相互溝通的方式來運作。

我們一般所談的網頁程式是指網頁伺服端的部分,但也有網頁爬蟲這類身份為使用者的應用程式。在本節中,我們逐一來看各個部分。

使用者 (User Agent)

使用者 (user agent),又稱客戶端 (client),會主動向網頁伺服器發出請求 (requests)。我們這裡的使用者並不一定是真人,也有可能是電腦軟體。像是網路爬蟲就是自動化的網頁客戶端程式;這類程式不需要人為介入,可以重覆執行,存取多個網站。

最常見的使用者是瀏覽器 (web browser),但還有其他形式的客戶端,像是網頁爬蟲 (web crawler) 或 curl(1)HTTPie 等做為 HTTP 客戶端的命令列工具。即使透過瀏覽器連線,不代表遠端使用者是真人,像是 Selenium 就可用電腦程式自動化操作瀏覽器。

網頁連線皆是由客戶端發起請求,伺服端接收後給予回應 (response)。

代理者 (Proxy)

在使用者和網頁伺服器之間,往往不會直接相連,在連線的過程中會有數個代理者 (proxy) 存在。像是提供連線的 ISP 就是代理者。IP 分享器也是另一種形式的代理者。

一般來說,客戶端程式和網頁伺服器不會知道在連線過程中經過那些代理者,因為這些代理者的活動都封裝在網路協定 (network protocol) 內。透過一些軟體,可以得知連線的過程 (路徑)。對學習網頁程式本身來說,代理者的重要性不是那麼高。

網頁伺服器 (Web Server)

網頁程式本質上是網頁伺服器 (web server) 程式。

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

資料庫 (Database)

資料庫 (database) 是用來儲存持久性資料的軟體,本身不算是網頁程式的一部分,和網頁程式相互合作以滿足儲存資料的功能。

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

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

網頁連線的特性

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

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

網頁連線從使用者 (user agent) 發出請求 (request) 到從網頁伺服器取得回應 (response) 後就斷開,網頁伺服器不會保留使用者的狀態。

不過,這和我們平常上網的經驗相違背,有許多網站可儲存會員狀態 (membership),也會記住使用者的狀態;這並不代表我們這裡講錯了,只是網頁技術在長年的發展中用不同方式去克服原本的限制,學習網頁程式也要學習如何使用這些技術來達到我們的需求。

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

繼續深入

一般程式人在學網頁程式設計時,很少會去買 HTTP 協定的專書來看,因為該協定的細節都由函式庫或框架處理掉了,我們很少要親自去處理這些事項。

不過,有時候查詢一下 HTTP 協定,對寫程式會有幫助。像是 HTTP 方法 (methods)、HTTP 狀態碼 (status codes)、HTTP 標頭 (header) 等。不論網頁框架的 API 怎麼變,皆不會違反 HTTP 協定的運作方式;透過查詢 HTTP 協定相關的資訊,自然而然就會知道相關框架的 API 要如何使用。

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

關於作者

身為資訊領域碩士,美思認為開發應用程式的目的是為社會帶來價值。如果在這個過程中該軟體能成為永續經營的項目,那就是開發者和使用者雙贏的局面。

美思喜歡用開源技術來解決各式各樣的問題,但必要時對專有技術也不排斥。閒暇之餘,美思將所學寫成文章,放在這個網站上和大家分享。