《Elixir 101》快速架設 HTTP 伺服器

閱讀時間約 9 分鐘
在 Elixir 裡要怎麼架設 HTTP 伺服器呢?

在 NodeJS 架設 HTTP 伺服器

如果是在 NodeJS 底下,我們可以很快透過以下的程式碼建立簡單的伺服器:
const http = require('http');

function serverHandler(req, res){
switch (req.url){
case '/':{
res.writeHead(200, {'Content-Type':'text/html'});
res.write('Hello world');
res.end();
break;
}

default:{
res.writeHead(404, {'Content-Type':'text/html'});
res.end('Not found');
break;
}
}
}

const server = http.createServer(serverHandler);
server.listen(3001);
但通常我們在 NodeJS 裡面不會這樣直接呼叫 http.createServer 來建立伺服器,我們會利用一些 Web 框架來幫助我們,讓開發上更加便利,例如 express,例如上述程式碼可以改成:
const server = require('express')();

server.get('/', function (req, res) {
res.send('Hello World')
});

server.listen(3000);

在 Elixir 中架設伺服器

所以一樣的,在 Elixir 中,我們透過一套名為 plug 的中間層套件,協助我們架設伺服器。
首先我們先建立一個乾淨的專案,並且啟用 supervision 模式:
$ mix new http_server --sup
讓我們看一下資料夾結構:
.
├── README.md
├── lib
│ ├── http_server
│ │ └── application.ex
│ └── http_server.ex
├── mix.exs
└── test
├── http_server_test.exs
└── test_helper.exs

安裝 plug

首先我們需要先安裝 plug。在 Elixir 安裝套件很簡單。
先讓我們打開資料夾中的 mix.exs 檔案,他內容會長這樣:
defmodule HttpServer.MixProject do
use Mix.Project

def project do
[
app: :http_server,
version: "0.1.0",
elixir: "~> 1.9",
start_permanent: Mix.env() == :prod,
deps: deps()
]
end

# Run "mix help compile.app" to learn about applications.
def application do
[
extra_applications: [:logger],
mod: {HttpServer.Application, []}
]
end

# Run "mix help deps" to learn about dependencies.
defp deps do
[
# {:dep_from_hexpm, "~> 0.3.0"},
# {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
]
end
end
然後讓我們看到 defp deps do 這段函式區塊:
# Run "mix help deps" to learn about dependencies.
defp deps do
[
# {:dep_from_hexpm, "~> 0.3.0"},
# {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
]
end
我們在他的 [] 的陣列裡加入 {:plug_cowboy, "~> 2.0"},這時候應該會長這個樣子:
# Run "mix help deps" to learn about dependencies.
defp deps do
[
{:plug_cowboy, "~> 2.0"}
]
end

首頁顯示 Hello World

安裝完後,我們在 lib 資料夾底下,建立一個檔案名為 router.ex,然後裡面寫入:
defmodule Router do
import Plug.Conn

def init(options) do
options
end

def call(conn, _opts) do
conn
|> put_resp_content_type("text/plain")
|> send_resp(200, "Hello world")
end
end

讓伺服器隨同程式上線

再來,我們必須讓伺服器隨著程式啟用時上線。所以我們要來更改 lib/http_server/application.ex 檔案。他應該會長這樣:
defmodule HttpServer.Application do
# See https://hexdocs.pm/elixir/Application.html
# for more information on OTP Applications
@moduledoc false

use Application

def start(_type, _args) do
children = [
# Starts a worker by calling: HttpServer.Worker.start_link(arg)
# {HttpServer.Worker, arg}
]

# See https://hexdocs.pm/elixir/Supervisor.html
# for other strategies and supported options
opts = [strategy: :one_for_one, name: HttpServer.Supervisor]
Supervisor.start_link(children, opts)
end
end
我們在 start 函式中的 children 陣列加入一行:
{Plug.Cowboy, scheme: :http, plug: Router, options: [port: 4001]}
他就變成:
children = [
{Plug.Cowboy, scheme: :http, plug: Router, options: [port: 4001]}
]

執行程式

程式碼都修改好後,我們在終端機打上:
$ mix run --no-halt
如果沒有東西話記得先切到 http_server 底下:
$ cd http_server
最後打開瀏覽器,輸入 http://localhost:4001,就大功告成啦!
參考文獻
1會員
5內容數
身為一個軟體工程師,在現今如此快速變化的世界中,該如何確保自生不被滅亡呢?
留言0
查看全部
發表第一個留言支持創作者!
工法人的沙龍 的其他內容
最近又重新開始學 Elixir,這時遇到一個問題:在 Elixir 裡面要怎麼建立函式,還有函式要怎麼回傳值?首先這要從 Elixir 有兩種函數類型說起:匿名函式(Anonymous Functions)、具名函示(Named Functions)
最近開始接觸 Elixir 這門語言,語法風格接近 Ruby。而他有一種動靜皆備的特性,老實說還蠻吸引我的。
最近又重新開始學 Elixir,這時遇到一個問題:在 Elixir 裡面要怎麼建立函式,還有函式要怎麼回傳值?首先這要從 Elixir 有兩種函數類型說起:匿名函式(Anonymous Functions)、具名函示(Named Functions)
最近開始接觸 Elixir 這門語言,語法風格接近 Ruby。而他有一種動靜皆備的特性,老實說還蠻吸引我的。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
AWS Lambda是? AWS Lambda 就像是開發者的救星,因為它是一種 Serverless 服務,意思是你不用再為架設和維護伺服器煩惱了。對於每天都忙得焦頭爛額的開發者來說,產品開發已經夠讓人抓狂了,還要處理伺服器的設定和維運(e.g. OS、Network、機器管理、防火牆),想想就
Thumbnail
展覽中我們似乎可以從作品中看出一些東西、但又不那麼明確,覺得他就是個色彩斑斕的抽象畫,但又依稀在其中看到一些具體的形象。我覺得那就像是記憶畫面在我們心靈裡沉積,並變化為精神、變成情感的一個過程。
Thumbnail
在台南,如果您正在尋找一家花店,不妨考慮心情故事花房。這家花店在台南的安南區以及台南市區建立起了深厚的口碑,並以其優質的服務和實惠的價格而聞名。無論是公家單位、殯儀館、銀行還是醫院,心情故事花房都是這些場所的常用花店之一。 心情故事花房經過30多年的深耕與努力,已經成為台南地區的首選花店之一。
感覺很像坂本真綾的歌名的標題,那麼馬上來介紹如何練這五種能力到滿 前置條件:滿15等,且可遊玩生存戰 順便教如何解鎖生存戰 等級15以上 萊斯特會打電話給玩家,去地圖上的白色L 再來小羅會打電話給玩家,去地圖上白色T 最後小羅打電話來,解完指定的生存戰(故意輸掉也行)就解鎖
Thumbnail
股價會大幅上漲,大致有三種情況:一是概念性題材+主力抄作;二是跌深的反彈;第三則是公司未來獲利有大成長的機會。第一種情況,我們外部投資者不容易掌握,而且風險較高;第二種上漲不會持久,而且空間也不大;惟有第三種,因為有各種資訊可以研判,而且上漲週期較長,比較適合長線投資者操作。 我個人比較傾向專注在
Thumbnail
最近很夯的債券,很多人買了之後發現了很多奇奇怪怪的問題,讓我們在這裡簡單快速的用容易了解的方式來搞懂債券的相關必要知識!
Thumbnail
Super 是一個能無痛將 Notion 頁面內容轉化成精美的個人、產品介紹等多用途網站的工具,讓你實現將 Notion 內容即時同步至 Super,管理網站外觀與設定!也有範本方便一鍵複製套用、快速架設網站,不論是 landing page、履歷網站、作品集或文件資源庫,都能輕鬆完成!
Thumbnail
宇宙是嚴格的生命教練,又是溫柔地守護母親; 所說的話,祂都有在聽,並提醒著此刻真正要學習的就是靜觀、順流。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
AWS Lambda是? AWS Lambda 就像是開發者的救星,因為它是一種 Serverless 服務,意思是你不用再為架設和維護伺服器煩惱了。對於每天都忙得焦頭爛額的開發者來說,產品開發已經夠讓人抓狂了,還要處理伺服器的設定和維運(e.g. OS、Network、機器管理、防火牆),想想就
Thumbnail
展覽中我們似乎可以從作品中看出一些東西、但又不那麼明確,覺得他就是個色彩斑斕的抽象畫,但又依稀在其中看到一些具體的形象。我覺得那就像是記憶畫面在我們心靈裡沉積,並變化為精神、變成情感的一個過程。
Thumbnail
在台南,如果您正在尋找一家花店,不妨考慮心情故事花房。這家花店在台南的安南區以及台南市區建立起了深厚的口碑,並以其優質的服務和實惠的價格而聞名。無論是公家單位、殯儀館、銀行還是醫院,心情故事花房都是這些場所的常用花店之一。 心情故事花房經過30多年的深耕與努力,已經成為台南地區的首選花店之一。
感覺很像坂本真綾的歌名的標題,那麼馬上來介紹如何練這五種能力到滿 前置條件:滿15等,且可遊玩生存戰 順便教如何解鎖生存戰 等級15以上 萊斯特會打電話給玩家,去地圖上的白色L 再來小羅會打電話給玩家,去地圖上白色T 最後小羅打電話來,解完指定的生存戰(故意輸掉也行)就解鎖
Thumbnail
股價會大幅上漲,大致有三種情況:一是概念性題材+主力抄作;二是跌深的反彈;第三則是公司未來獲利有大成長的機會。第一種情況,我們外部投資者不容易掌握,而且風險較高;第二種上漲不會持久,而且空間也不大;惟有第三種,因為有各種資訊可以研判,而且上漲週期較長,比較適合長線投資者操作。 我個人比較傾向專注在
Thumbnail
最近很夯的債券,很多人買了之後發現了很多奇奇怪怪的問題,讓我們在這裡簡單快速的用容易了解的方式來搞懂債券的相關必要知識!
Thumbnail
Super 是一個能無痛將 Notion 頁面內容轉化成精美的個人、產品介紹等多用途網站的工具,讓你實現將 Notion 內容即時同步至 Super,管理網站外觀與設定!也有範本方便一鍵複製套用、快速架設網站,不論是 landing page、履歷網站、作品集或文件資源庫,都能輕鬆完成!
Thumbnail
宇宙是嚴格的生命教練,又是溫柔地守護母親; 所說的話,祂都有在聽,並提醒著此刻真正要學習的就是靜觀、順流。