RubyとSinatraで作る!自作リンク短縮アプリの作り方
Rubyのスキルを磨くのにぴったりな小さなプロジェクトをお探しなら、ここがまさにうってつけの場所です。
今回は、リンク短縮アプリを一緒に作っていきましょう。
リンク短縮アプリとは?
きっと一度は見たことがあるはずです。
次のような「短縮リンク」のことです。
https://t.co/eKBRm2tTUF
このURLにアクセスすると、元のURLへ自動的にリダイレクトされます。
では、これはどうやって実現しているのでしょうか?
仕組みはシンプルで、URLの一部になっているコード(例では eKBRm2tTUF)を、データベース上で元のURLと紐付けているだけです。
概念は簡単ですが、いくつか考慮すべき点があります。
例えば…
- このコードはどうやって生成するのか?
- コードと完全なURLをどうやって一致させるのか?
それでは早速始めましょう!
最初の一歩
今回はSinatraを使用します。セットアップが一切不要なので、すぐに開発を始められるからです。
また、一般的なSQLデータベースの代わりに、少し変わったアプローチを取ります。
何を使うのかは、この後すぐわかります 🙂
まずは初期コードを見てみましょう:
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
これは3つのアクション(ルート)を持つシンプルなSinatraアプリです。
アプリにアクセスすると、「POSTリクエストを送ってください」というメッセージが表示されます。
どうやって送ればいいのでしょうか?
Postmanのようなブラウザプラグインを使っても構いません。
しかし、こういう用途にはcurlがおすすめです。
curlはどのOSにもインストールできる便利なツールで、これを使えばSinatraアプリとのやり取りが簡単に行えます。
POSTリクエストを送信する
一緒に進めている方は、Sinatraアプリが起動していて、マシンにcurlがインストールされているはずです。
それでは、次のようにPOSTリクエストを送ってみましょう。
curl localhost:4567 --data "url=rubyguides.com" -X POST
ターミナルに「New URL added」というメッセージが表示されるはずです。
これで登録は成功です!
次のステップは、このURLをもっと短いURLにマッピングすることです。
その方法を見ていきましょう。
URLをマッピングする
マッピングの方法としては、ランダムな文字列を使う方法、ハッシュ関数を使う方法、あるいは何らかのエンコーディングを使う方法などが考えられます。
ここでは、ランダムな文字列を使う方法を紹介します。
LETTERS = Array('a'..'z')
def generate_short_url
Array.new(6) { LETTERS.sample }.join
end
この例では、6文字のランダムな文字列を採用しています。
別の実装方法については動画でも解説しているので、興味があればぜひチェックしてみてください。
これで、元のURLを短縮URLに対応させるための「ショートコード」が手に入りました。
次は何をすればいいのでしょうか?
ユーザーを正しい場所にリダイレクトできるよう、このコードをどこかに保存する必要があります。
自作の「NoSQL」データベース
このプロジェクトでは、できるだけシンプルなデータベースを使いたいと思いました。
ファイルほどシンプルなものはありませんよね。
Rubyの標準ライブラリにはPStoreクラスが含まれていて、これを使えばデータ管理が簡単に行えます。
今回のような小さなアプリケーションには最適です。
コードはこちらです:
require 'pstore'
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
ここには、いくつかのポイントがあります。
まず、PStoreオブジェクトにアクセスするためのstoreメソッドを定義しています。
そして、データを保存するsaveメソッドと、読み込むreadメソッドです。
お気づきかもしれませんが、PStoreはハッシュのように振る舞います。違いは、すべての操作をトランザクションブロック内で行う必要があるという点です。
それでは、Sinatraアプリを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
code = generate_short_url
ShortURL.save(code, params[:url])
"New URL added: localhost:4567/#{code}\n"
end
これで完成です!
実際に動作するリンク短縮アプリができあがりました。
プロのコツ: shotgun gemを使うと、コードを変更した際にSinatraアプリを自動的に再読み込みできます。
まだやるべきことは残っています。例えば、
curlを使わずに済むよう、新しいURLを登録するフォームを追加する- URLがデータベースに存在しない場合にエラーメッセージを表示する
- 重複チェックを行い、既存のURLを上書きしないようにする
これらは宿題としてあなたに任せます 🙂
まとめ
この記事では、Ruby・Sinatra・PStoreを使ったリンク短縮アプリの作り方を学びました。さらに、HTTPクライアントであるcurlを使ってPOSTリクエストを送る方法も習得しました。
ぜひこの記事を友達にもシェアして、より多くの人が学べるようにしてください。
-
Rubyでパーサーを自作する方法!StringScannerを使った実装手順を徹底解説
パース(構文解析)とは、文字列の集まりから意味を読み取り、プログラムが扱える形のデータへと変換する技術です。正規表現でも文字列の解析は可能ですが、すべての場面に適しているわけではありません。 たとえば、正規表現でHTMLを解析するのはあまり良い方法ではないというのは、プログラミング界隈ではよく知られた話です。 Rubyにはnokogiriという強力なライブラリがあり、HTMLの解析はこれに任せられます。しかし、自分でパーサーを一から作ってみると、文字列処理や構文解析の仕組みについて多くのことを学べます。それでは早速始めていきましょう! Rubyでのパースの基本:StringScannerクラス
-
独自のローカルプレミアムURL短縮サービスを作成する方法
インターネット上で非常に長いURL(Uniform Resource Locator)に遭遇するでしょう。多くのサイトは、あなたの訪問に関する情報をURLに入れています:言語、場所、識別、スペシャルの参照コード、および他の多くのアイテム。これにより、URLが非常に長くなります。 CodeCanyonのプレミアムURL短縮サービス プレミアムURL短縮サービス コードキャニオン 長いURLを短くする方法です。このチュートリアルでは、システムに独自のURL短縮サービスを設定する方法とその使用方法を説明します。 URL短縮サービスとは何ですか? インターネットを閲覧するときは常にURLを使