JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptでURL短縮サービスを作る:エンコード・デコード関数の実装方法

bit.lyやtinyurlなど、長いURLを受け取って何らかの暗号化処理を施し、非常に短いURLを返すサービスを目にする機会は多いでしょう。そして、その短縮URLを開こうとすると、今度は復号処理が実行されて元のURLへと変換され、目的のページが表示されます。

今回は、まったく同じ仕組みをJavaScriptで実装してみましょう。具体的には、次の2つの関数を用意します。

  • encrypt() ― 元の(長い)URLを受け取り、一意な短縮URLを返します。
  • decrypt() ― 短縮URLを受け取り、元のURLに関する事前情報を持たない状態でも、元のURLへと復元します。

実装の考え方

ここでは、Node.jsのBufferクラスによるBase64エンコード・デコードを利用します。Base64は可逆変換であるため、エンコード→デコードの往復で必ず元の文字列を復元できるのが特徴です。なお、実際の商用の短縮サービスでは「元URLをデータベースに保存し、短いキーだけを返す」方式が一般的ですが、本記事ではまずエンコード・デコードの基本的な仕組みを理解することを目的とします。

サンプルコード

const url = 'https://developer.mozilla.org/en-US/docs/Web/JavaScript';
const encrypt = (longUrl) => {
  const encodedUrl = Buffer.from(longUrl, 'binary').toString('base64');
  return "https://mydemo.com/" + encodedUrl;
};
const decrypt = function(shortUrl) {
  let encodedUrl = shortUrl.split('mydemo.com/')[1];
  return Buffer.from(encodedUrl, 'base64').toString();
};
const encrypted = encrypt(url);
const decrypted = decrypt(encrypted);
console.log(encrypted);
console.log(decrypted);

実行結果

コンソールには以下のように出力されます。

https://mydemo.com/aHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdA==
https://developer.mozilla.org/en-US/docs/Web/JavaScript

コードの解説

encrypt() 関数

Buffer.from(longUrl, 'binary')でURL文字列をバイナリデータとして読み込み、.toString('base64')によってBase64形式の文字列へ変換しています。その先頭に独自ドメイン「mydemo.com」を付けることで、短縮URLらしい形式に仕上げています。

decrypt() 関数

まずsplit('mydemo.com/')でドメイン部分を取り除き、Base64エンコード済みの部分だけを抽出します。続いてBuffer.from(encodedUrl, 'base64')でBase64をデコードし、.toString()により元のURL文字列へと復元しています。

このようにエンコードとデコードがきちんと対になっているため、短縮URLから元のURLを正確に復元できるというわけです。

  1. 【初心者向け】JavaScriptのFileとFileReaderを使ってファイルを読み込む方法

    JavaScriptにおけるFileとFileReaderとは? JavaScriptでは、<input type=file>要素を使うことで、ユーザーにローカルファイルを選択させることができます。選択されたファイルはFileオブジェクトとして取得でき、ファイル名・サイズ・MIMEタイプなどの基本情報へアクセス可能です。 さらに、FileReaderオブジェクトを利用すれば、選択されたファイルの中身を非同期で読み込み、テキストやデータURLとして扱うことができます。 サンプルコード 以下は、JavaScriptでFileとFileReaderを使用して、ファイルの詳細情報を表示し

  2. JavaScriptの「for...in」ステートメントとは?オブジェクトのプロパティをループ処理する方法を解説

    JavaScriptのfor...in文は、オブジェクトが持つすべてのプロパティ(列挙可能なプロパティ)を順番に取り出して処理するためのループ構文です。オブジェクト内の各キー(プロパティ名)にアクセスしながら、対応する値を取得したい場合に非常に便利です。for...inの基本的な構文for (let 変数名 in オブジェクト) { // 各プロパティに対して実行したい処理 }ループ変数には、各反復ごとにオブジェクトのプロパティ名(キー)が文字列として代入されます。値そのものを取得するには、「オブジェクト[変数名]」のようにブラケット記法を使ってアクセスします。サンプルコード以下は、for