Nếu bạn tìm dự án nhỏ để thực hành & luyện kỹ năng Ruby thì bạn đang ở nơi đúng.
Hôm nay tôi muốn xây dựng ứng dụng “link shortener” (rút gọn liên kết) cùng bạn.
Link shortener là gì?
Tôi chắc bạn đã thấy…
Những “short links” như:
https://t.co/eKBRm2tTUF
Khi truy cập URL này bạn được chuyển hướng đến URL gốc.
Nhưng nó hoạt động như thế nào?
Ý tưởng là ánh xạ mã này, eKBRm2tTUF trong ví dụ, đến URL gốc trên database.
Khái niệm đơn giản, nhưng có vài điều cần xử lý.
Như…
Làm sao tạo mã này? Làm sao khớp với URL đầy đủ?
Vậy bắt đầu!
Các bước đầu
Tôi dùng Sinatra vì nó không cần setup, bắt đầu ngay.
Và thay vì database SQL điển hình tôi cũng làm khác.
Đọc tiếp để biết 🙂
Mã khởi tạo:
require 'sinatra'
get '/:url' do
"The URL is #{params[:url]}"
end
get '/' do
"Send a POST request to register a new URL."
end
post '/' do
"New URL added: #{params[:url]}\n"
end
Đây là app Sinatra đơn giản với 3 action (route).
Truy cập app nhận thông báo “Send a POST request”.
Làm sao làm điều đó?
Dùng plugin trình duyệt như Postman.
Nhưng tôi thích dùng curl.
Nó công cụ tiện cài trên mọi OS & cho tương tác với app Sinatra.
Gửi POST Request
Nếu bạn theo dõi bạn nên có app Sinatra chạy & curl cài trên máy.
Bây giờ gửi POST request:
curl localhost:4567 --data "url=rubyguides.com" -X POST
Nên in thông báo “New URL added” trên terminal.
Tuyệt!
Bước tiếp theo ánh xạ URL này đến URL ngắn hơn.
Hãy xem cách làm.
Ánh xạ URL
Để ánh xạ bạn có thể dùng chuỗi ngẫu nhiên, hàm hash hoặc encoding.
Một cách:
LETTERS = Array('a'..'z')
def generate_short_url
Array.new(6) { LETTERS.sample }.join
end
Tôi chọn chuỗi ngẫu nhiên 6 ký tự.
Xem video nếu muốn cách khác.
Điều này cho “mã ngắn” để ánh xạ URL gốc đến URL ngắn.
Tiếp theo?
Cần lưu mã đâu đó để redirect user đúng chỗ.
Database “NoSQL” của chúng ta
Dự án này tôi chỉ muốn database đơn giản.
Đơn giản hơn dùng file, đúng không?
Thư viện chuẩn Ruby có class PStore giúp quản lý dữ liệu.
Tuyệt cho app nhỏ như này.
Mã:
class ShortURL
def self.save(code, original)
store.transaction { |t| t[code] = original }
end
def self.read(code)
store.transaction { |t| t[code] }
end
def self.store
@store ||= PStore.new("short_urls.db")
end
end
Có vài điều diễn ra.
Đầu tiên, phương thức store truy cập đối tượng PStore.
Sau đó save & read.
Bạn thấy PStore hành xử như hash. Khác là mọi thao tác cần trong block transaction.
Bây giờ cập nhật app Sinatra dùng class ShortURL:
require 'sinatra'
get '/:url' do
redirect "https://" + ShortURL.read(params[:url])
end
get '/' do
"Send a POST request to register a new URL."
end
post '/' do
ShortURL.save(generate_short_url, params[:url])
"New URL added: localhost:4567/#{generate_short_url}\n"
end
Và xong!
Chúng ta có link shortener hoạt động.
Pro Tip: Dùng gem shotgun để auto-reload app Sinatra khi thay đổi mã.
Còn việc làm: thêm form để không dùng curl submit URL.
Hiển thị thông báo nếu URL không trong database.
Và kiểm tra trùng lặp, để không ghi đè URL khác.
Tôi để đó làm bài tập về nhà 🙂
Tóm tắt
Bạn đã học xây dựng Link Shortener dùng Ruby, Sinatra & PStore! Cũng học gửi POST request dùng curl http client.
Đừng quên chia sẻ bài viết với bạn bè để nhiều người học.