息抜きに Go と Firebase を使って短縮URL生成ツールを作ってみました。
ところどころ雑な部分が目立ちますが、大目にみてください。
https://github.com/suhaya3317/short-url
では、早速解説にいってみたいと思います。
Firebaseプロジェクトを作る
https://console.firebase.com
でプロジェクトを作ります。
Dynamic Linksの設定
メニューの「拡大」のところに「Dynamic Links」があるのでクリックして開きます。
そのまま「始める」を押すと、以下の画面になります。
サブドメインをカスタマイズできるので、自分のお好みに設定してください。
無事、作成が完了すると以下の画面になります。
これでDynamic Linksの設定は完了です。
Go
次に実際のコードを見ていきましょう。
- エラーハンドリングはしてません。。
conifg.envの作成
ファイル内には
- FirebaseのAPIキー
- 上記で設定したドメイン
を書き込んでおきます。
FirebaseのAPIキーは、Firebaseプロジェクトの設定ページの「ウェブ API キー」です。
FIREBASE_KEY=*****************************
DOMAIN=https://example.page.link
.envファイルを読み込む
github.com/joho/godotenv
というパッケージを使用しています。
https://godoc.org/github.com/joho/godotenv
$ go get github.com/joho/godotenv
err := godotenv.Load("config.env")
if err != nil {
panic(err)
}
リクエスト先のURLを設定する
const dynamicLinksApiUrl = "https://firebasedynamiclinks.googleapis.com/v1/shortLinks?key="
url := dynamicLinksApiUrl + os.Getenv("FIREBASE_KEY")
短縮したいURLを取得する
コマンドラインパラメータから取得しています。
longLink := os.Args[1]
必要な情報を詰めていく
リクエストする際のjsonは以下のようなものです。
{
"longDynamicLink": "https://example.page.link/?link=https://example.com/aaa/bbb/ccc/ddd/eee",
"suffix": {
"option": "SHORT"
}
}
longDynamicLink
は設定したドメイン
+/?link=
+短縮したいURL
となっていて、
option
はSHORT
またはUNGUESSABLE
を入れることができます。
*
SHORT
👉 パスコンポーネントが4文字(https://example.page.link/WXYZ
)
UNGUESSABLE
👉 パスコンポーネントが17文字(https://example.page.link/UVWXYZuvwxyz12345
)
type RequestJson struct {
LongDynamicLink string `json:"longDynamicLink"`
Suffix `json:"suffix"`
}
type Suffix struct {
Option string `json:"option"`
}
// SHORTを指定しているため、パスコンポーネントは4文字になる
requestJson := &RequestJson{os.Getenv("DOMAIN") + "/?link=" + longLink, Suffix{"SHORT"}}
requestJsonByte, err := json.Marshal(requestJson)
if err != nil {
panic(err)
}
// *Request(req)を作ります。
req, err := http.NewRequest("POST", url, bytes.NewReader(requestJsonByte))
if err != nil {
panic(err)
}
// リクエストヘッダーをセットします。
req.Header.Set("Content-Type", "application/json")
リクエストする
client := &http.Client{}
res, err := client.Do(req)
if err != nil {
panic(err)
}
レスポンスをパースする
レスポンスのjsonは以下のようなものです。
{
"shortLink": "https://examle.page.link/****",
"previewLink": "https://examle.page.link/****?d=1"
}
body, err := ioutil.ReadAll(res.Body)
if err != nil {
panic(err)
}
defer res.Body.Close()
type ResponseJson struct {
ShortLink string
PreviewLink string
}
var responseJson ResponseJson
err = json.Unmarshal(body, &responseJson)
if err != nil {
panic(err)
}
出力する
fmt.Print(responseJson.ShortLink)
ビルドする
$ go build main.go
実行する
$ ./main 短縮したいURL
参考文献
https://firebase.google.com/docs/dynamic-links/rest?hl=ja
https://qiita.com/ryo_hisano/items/ffbba33d4737664626e8