APIS ON RAILS - Chapter 1: Introduction

Lưu ý

Bài viết được dịch từ trang sau: http://apionrails.icalialabs.com/book/chapter_one

Bắt đầu

Chào mừng các bạn đến với bài viết về APIs on Rails để tìm hiểu cách nào để tạo ra app API với Rails. Mục đích của bài viết là đưa ra câu trả lời cho việc làm cách nào để viết một app RESTful API dựa trên kinh nghiệm của tôi (của tác giả). Sau khi hoàn thành được loạt bài viết này thì bạn sẽ có thể tự xây dựng cho mình app API và tích hợp nó với bấy kỳ ngôn ngữ client nào như là web browser hoặc app mobile. Code sử dụng trong bài viết sẽ là phiên bản Rails 4, có thể xem thêm thông tin tại http://rubyonrails.org/ . Phiên bản mới nhất của API's on Rails có thể xem thêm tại http://apionrails.icalialabs.com; và đừng quên update phiên bản dưới local của mình cho phù hợp nhé.

Chuỗi bài viết này được tạo ra không phải để chỉ bạn cách xây dựng app API với Rails mà là chỉ cho bạn cách xây dựng app API với Rails mà có thể mở rộng và maintain được, điều này sẽ làm cho kiến thức về Rails của bạn được nâng lên tầm mới. Tóm tắt sơ lược về nội dung chúng ta sắp bắt đầu:

  • Xây dựng JSON responses.
  • Sử dụng Git để quản lý phiên bản.
  • Test các routes được tạo ra (Test your endpoints)
  • Tăng tốc và cache API.

Khuyên bạn nên theo từng bước trong bài viết này, không nên bỏ qua bài viết nào vì trong mỗi bài tôi (tác giả) đều có đưa vào các tips thú vị nhằm tăng kỹ năng của bạn. Bạn có thể tưởng tượng rằng bản thân là nhân vật chính của một game và sau mỗi bài viết bạn sẽ đạt đến level cao hơn.

Trong bài viết đầu tiên này, tôi sẽ cùng bạn tìm hiểu về cài đặt môi trường trong trường hợp bạn vẫn chưa có gì trong tay. Sau đó chúng ta sẽ tạo ra app với tên là market_place_api, tôi xin nhấn mạnh rằng tất cả những gì tôi đã học trong nhiều năm sẽ được đặt vào trong bài viết này để hướng dẫn các bạn. Khi đã tạo app xong thì chúng ta sẽ kết nối nó với Git.

Trong bài viết này chúng ta sẽ xây dựng app theo lộ trình quen thuộc mà tôi sử dụng hằng ngày. Chúng ta sẽ phát triển app bằng cách viết test trước code sau (TDD), bắt đầu bằng việc giải thích tại sao bạn lại muốn xây dựng app API và từ đó quyết định nên sử dụng JSON hay XML làm format cho response. Từ bài viết số 3 đến 8, chúng ta sẽ tạo ra những thứ cần thiết như tạo ra các routes, bảo đảm truy cập API và xử lý xác thực thông qua trao đổi headers. Cuối cùng ở bài số 11 chúng ta sẽ thêm một số kỹ thuật nhằm tăng tốc khả năng response của server.

Sản phẩm cuối cùng là app như là một nơi mua bán để người dùng có thể sắp xếp, thay đổi thứ tự và upload sản phẩm cùng nhiều thứ khác lên. Đã có hàng tá các options ngoài kia để tạo nên online store rồi, chẳng hạn như Shopify, Spree hoặc Magento.

Đến cuối chuỗi bài viết này (phụ thuộc vào nỗ lực của bạn), bạn sẽ cảm thấy mình sẽ có khả năng hiểu được hầu hết các resources Rails trên mạng.

1.1. Cách trình bày của bài viết

Tôi sẽ sử dụng rất nhiều ví dụ bằng các câu lệnh command-line. Tôi sẽ không sử dụng cmd trên windows đâu nhé, vì vậy những ví dụ của tôi sẽ dùng câu lệnh của Unix-style như sau:

echo "A command-line command"

Tôi sẽ sử dụng một số từ ngữ chuyên ngành một chút, ví dụ như là:

  • "Avoid" nghĩa là bạn không cần phải làm điều đó.
  • "Prefer" chỉ ra trong 2 lựa chọn thì cái đầu tiên sẽ phù hợp hơn.
  • "Use" nghĩa là nên sử dụng resource này.

Nếu vì bất kỳ lý do nào mà bạn gặp phải lỗi khi chạy lệnh thì tôi nghĩ bạn nên "google" nó cho nhanh.

Bắt đầu

Một trong những thứ làm lập trình viên thấy mệt nhất là tự mình setting tất cả, nhưng khi đã thực hiện xong thì những phần còn lại sẽ rất nhẹ nhàng và đơn giản hơn. Vì vậy, để cho mọi thử dễ dàng hơn cũng như giữ cho bản thân bạn có động lực hơn thì chúng ta sẽ sử dụng một tổ hợp các những thứ cần thiết mà tôi tự đặt tên là Kaishi, nó bao gồm tất cả những tool cần thiết để bạn dễ dàng setup môi trường, tất cả đều đang hoạt động tốt trên MacOS:

  1. oh-my-zsh: Shell mặc định của bạn
  2. Homebrew: Sử dụng để quản lý các packages.
  3. Git: Để quản lý các versions.
  4. Postgresql: trình quản lý database.
  5. Vim: Code trên này.
  6. ImageMagick: để xử lý với image.
  7. Rbenv: quản lý môi trường ruby.
  8. Bundler: gem quen thuộc
  9. Foreman: để chạy app
  10. Rails gem: gem quen thuộc
  11. Heroku: toolbelt để tương tác với Heroku API.
  12. RailsAppCustomGenerator: khởi tạo app Rails với Icalia's flavor
  13. Pow: chạy app dưới local

1.2.1. Môi trường phát triển

Terminal và môi trường code

Có rất nhiều lựa chọn để setup môi trường code cho từng máy khác nhau, tôi nghĩ rằng bản thân Rails đã phát triển một IDE rất tốt rồi, vì vậy nếu thích bạn vẫn có thể lựa chọn RadRails hoặc RubyMine. Nếu không thích hai lựa chọn này thì có thể sử dụng các text editor như:

  • Text editor: Sublime text, Vim, TextMate, ...
  • Terminal: zsh, terminal mặc định của máy.

Browsers Sự lựa chọn ưu tiên nhất chính là Chrome, một số các dev khác có thể thích Firefox hoặc Safari. Tùy sở thích, tuy nhiên thì nên sử dụng Chrome

1.3. Khởi tạo project

Khởi tạo project với cú pháp:

mkdir ~/workspace
cd workspace
rails new market_place_api -T

1.3.1. Cài đặt Pow hoặc Prax

Có thể bạn sẽ tự hỏi rằng tại sao phải những package này, câu trả lời rất đơn giản, chúng ta sắp phải làm việc với subdomains, do đó những service như Pow hoặc Prax sẽ giúp chúng ta khá nhiều đấy. Cài đặt Pow Pow chỉ hoạt động trên MacOS thôi, nhưng nếu bạn sử dụng Linux cũng đừng lo quá, trên Linux vẫn có những hàm có chức năng tương tự như Pow. Để cài đặt nó thì sử dụng câu lệnh

curl get.pow.cx | sh

Sau đó chạy:

$ cd ~/.pow
$ ln -s ~/workspace/market_place_api

Cài đặt Prax Chạy các câu lệnh sau:

$ sudo git clone git://github.com/ysbaddaden/prax.git /opt/prax

$ cd /opt/prax/
$ ./bin/prax install  

Sau đó, chỉ cần link tới app của mình:

$ cd ~/workspace/market_place_api
$ prax link

Nếu muốn chạy prax server một cách tự động thì thêm dòng sau vào tệp .profile:

prax start

1.3.2. Gemfile và Bundler

Khi Rails app đã được tạo ra thì bước tiếp theo là thêm một gem đơn giản nhưng cực kỳ hữu dụng tên là active_model_serializers. Sau khi thêm gem trên vào thì gemfile của chúng ta sẽ như sau:

source 'https://rubygems.org'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.0.2'

# Use sqlite3 as the database for Active Record
gem 'sqlite3'

# Use SCSS for stylesheets
gem 'sass-rails', '~> 4.0.0'

# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'

# Use CoffeeScript for .js.coffee assets and views
gem 'coffee-rails', '~> 4.0.0'

# See https://github.com/sstephenson/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby

# Use jquery as the JavaScript library
gem 'jquery-rails'

#Api gems
gem 'active_model_serializers'

group :doc do
  # bundle exec rake doc:rails generates the API under doc/api.
  gem 'sdoc', require: false
end

Chú ý rằng tôi đã xóa đi gem jbuilderturbolinks do chúng ta cũng không xài tới nó đâu. Cũng tốt nếu ta thêm phiên bản của ruby vào trong gemfile, nó sẽ ngăn chặn được tình trạng break code khi code được share cho nhiều dev khác nhau. Tùy thuộc vào private hoặc public project. Thêm nữa là bỏ gem "sqlite3" vào trong group development để không cho phép cài đặt gem này khi bạn deploy nó lên Heroku

group :development do
  gem "sqlite3"
end

Đã xong bài viết số 1 rồi. Cảm ơn các bạn đã theo dõi. Nguồn: http://apionrails.icalialabs.com/book/chapter_one