iT邦幫忙

2022 iThome 鐵人賽

DAY 27
0
Modern Web

Rails,我要進來囉系列 第 27

第二十七天:Rails 的 API-only mode,只做 API Server 需要用到 Rails 嗎?

  • 分享至 

  • xImage
  •  

開場白

鼬~~哩賀,我是寫程式的山姆老弟,昨天跟大家一起看了 Rails 的Caching 機制,今天來看 RailsGuide 的 API-only mode,夠夠~

https://raw.githubusercontent.com/shrimp509/my-img-host/master/relacs-studio/Rails%E6%88%91%E8%A6%81%E9%80%B2%E4%BE%86%E5%9B%89/day27-1.png

什麼是 API-only Mode?

在創立 Rails 專案的時候,會使用 $ rails new project_name 的指令來創立專案,但以這樣的指令創立專案,會產生各種 Rails 預設套件的檔案,其中包含 Rails 網頁前端的部分 - View,以及其他 Serving files 的設定,這些對於只是想利用 Rails,作為一個後端伺服器應用的開發者來說,都是多餘的,所以 Rails 提供一個選擇是可以在創立專案時,就避免產生這些多餘的檔案,只產生作為 API Server 的必要檔案

為什麼需要 API-only Mode?

最早以前的 Rails 是設計給「網頁」使用的,Rails 開發者可以只學習 Rails,就打造出一個具有 前端 與 後端 功能的網頁,Rails Server 根據網頁 Client 需求,產生出相對應的 HTML, CSS, JS 等網頁資源給網頁 Client 的瀏覽器渲染

後來隨著手機盛行,AndroidiOS 也需要有後端功能,所以 Rails 的 Server 會有一部分客戶來源,是透過 Web API 溝通的行動端,再後來,隨著前端的發展,前、後端分離的趨勢更加明顯,導致前端通常會獨立開 React, Angular, Vue 專案,透過 Web API 與後端溝通

這時候 Rails 的前端就形同虛設,所以越來越多人使用 Rails 只是單獨使用 Rails 的後端部分,Rails 官方就正式提供 API-only 的模式給開發者選擇,在創立專案的時候,就省略 Rails 的前端部分

只是想做 API Server,需要用到 Rails 這麼大的框架嗎?

Ruby 的使用者除了 Rails 網頁框架可以使用之外,還有輕量化的 Sinatra 可以考慮,既然有輕量化的 Sinatra,為何要用 Rails 來專門作為 API Server 呢?

針對這個問題,官方有給出一個回答:

  1. 對於非常簡單的 API 來說,這個答案是「對,你用 Sinatra 會是個比較好的選擇」
  2. 而最多人選擇使用 Rails 的原因,在於 Rails 提供非常多的「預設設定」,讓開發者不需要做一大堆非常簡單又不得不做的設定
  3. 例如 Rails 預設在 Middleware 層提供:
    1. Reloading
    2. Development/Test mode
    3. Logging
    4. Security
    5. Parameters parsing
    6. Conditional GETs
    7. HEAD requests
  4. Rails 的 ActionPack 層也提供了:
    1. Resourceful Routing
    2. URL Generation
    3. Header and Redirection Responses
    4. Caching
    5. Basic, Digest and Token Authentication
    6. Instrumentation
    7. Generators
    8. Plugins
  5. 再加上 Rails 的啟動程序已經包好了 ,包含各層的運作、資料庫的連接等等

最後官方表示:你可能沒有想過,即使拿掉了 Rails 的 View 層,還有剩下大部分的部件還持續運作

API-only Mode 的使用方法

新建專案

$ rails new your_api_server_name —-api

就是後面的 —-api,表示要開啟 API-only Mode,主要會做三件事:

  1. 比平常的 Rails 少用了幾層 middleware,例如不需要 cookies(雖然有時候用 devise 還是會需要 cookies 幫忙,到時候還是得加回來)
  2. ApplicationController 會繼承 ActionController::API 而不是原本的 ActionController::Base,會少掉給需要瀏覽器的功能
  3. 當需要產生一個新的 resource 的時候,Generators 會跳過產生 views, helpers 還有 assets 檔案

已有專案要改成 API-only Mode

  1. config/application.rb 新增在最上面

    # config/application.rb
    class Application < Rails::Application
        config.api_only = true
    		...
    end
    
  2. app/controllers/application_controller.rb 的繼承改掉

    # app/controllers/application_controller.rb
    class ApplicationController < ActionController::API
    end
    
  3. 這樣就可以囉

總結

這篇 RailsGuide 還有提到其他關於 API-only 模式下的各種 middleware 設定調整,都是可以根據需求來增減各個 middleware,如果有特殊需求(例如需要傳檔案、要 Cache、要 Cookies、要 i18n 等等)再自己去看囉,我們明天見~


上一篇
第二十六天:Rails 的 Caching
下一篇
第二十八天:讓 Rails 接多個資料庫 - Multiple Databases
系列文
Rails,我要進來囉30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言