URLにTXTの情報を詰めてみる

下の記事でも紹介していますが、以前URLを使ってストレージいらずのテキスト共有のサービスを作ったことがあります。
[Ionicによるプライベートプロダクト開発の裏側事情](https://qiita.com/xiaca/items/9a611a7d6a502ccb8b72)
![Screen Shot 2018-12-22 at 23.24.43.png](https://qiita-image-store.s3.amazonaws.com/0/165335/3447bdd4-504c-a162-92f7-f7b8461d0511.png)


その時の内容はURLにテキストの情報を全て入れ込むというなかなかの力技だったんですが、半年以上たってその時の処理を忘れないように備忘録として書き残しておきます。


## 処理の手順
GolangのBase64エンコーディングにはなんとURLEncodingというものがあります。

```golang
base64.NewEncoder(base64.URLEncoding, &buf64)
```

こいつを使えばURLセーフなBase64エンコーディングを行うことができます。さらにGolangには標準でgzipのライブラリがあります。なので、これらを組み合わせて以下のようなことが行えます。

1. テキストをプログラムで受け取る
2. テキストをgzipで圧縮する
3. URLセーフでBase64エンコーディングする
4. URLのパラメータにする

上記を実装するために以下、Golangでテキスト→gzip→Base64のソースコードになります。

```golang
package main

import (
	"bytes"
	"compress/gzip"
	"encoding/base64"
	"fmt"
	"io/ioutil"
	"strings"
)

func main() {
	text := `
　 　 　 　 　 ／////////////////////////　------＼/////////ヽ
　　　　　　 ////:///////////////＞　　"´　　　　　　　 ∨////////∧
　　　　　 .///////////////＞ ´　　　　　　　　　　　 　 　 ∨////////∧
　　　　　/////////／/＞ ´　　　　　　　　　　　　　　　　 　 ∨////////∧
　　　　　|///////,〃／　　　　　　　　　　　　　　　　　　 　 　 i//////////ﾊ
　　　　　|////////i/　　　　　　　　　　　　_　　--――― ､--}//////////∧
　　　　　|////////|　　　　　　　　　　　 ´　　　　ﾄ.　　　　　ヽ ＼'/////////∧
　　　　　|////////|　　　　　 ..　 イ　　　　　　　 i　＼　　 ノ　 ',　＼////////∧
　　　　　|////////| 　 .　　 ´i　　 i　　 　 　 　 ｰ|-- 斗､.　　　 ',　　＼///////∧
　　　　　|////////| ／　　　 |　　ハ　　　 ',　 ∧!　,ｨf＝ミ､　　　',ー― ///////∧
　　　　　|////////|' 　　.、＿|..斗七ヽﾄ､ 　 ヽ| u 　 {::♥::} ゞ ＼　',i///////////,∧
　　　　　|////////|　　　　　 |/i/,.ィf=ミ ヽト､!|　　 ｀¨¨¨´/　　/＼!.ﾏニ ア//////,∧
　　　　　|////////ﾊ　　　 　/ .ｨ f:::♥ﾉ 　 | / ／／／／/　／　i　　|=イ/////////∧
　　　　　|////////,∧　 　 /{　ゞ ｀¨´ ／, j/　／／／ ./イ /　 .|　　i　 i///////////
　　　　　|/////////|.ﾍ　 /　乂　／／／／／　　　 　 u　/　　 |　　|　 i!///////////
　　　　　|/////////＞j／　　　＼ 　　　　　 　 　＿　　　j/|　　.| ∧!　　!///////////
　　　　　|//////／ ∠ｨ ﾍ 　　　　＞_ 　　 　 ,ｨv´　 _)　　/ |　　|/:::::∧ .|V//////////
　　　　　|//////ゝ---一 ﾍ　　ゝ----' u 　 ゝ-　´　 　 /i .|　　|:::::::::::∧!::∨/////////
　　　　　|//////////|　i　∧　　　　',≧=-　　 ＿＿　.イ　!ﾊ　　|:::::::::::::＿:::乂////////
　　　　　|//////////| ∧　∧　　　ト{ 　　　}　　　　i　　　 {ｰﾍ　!´￣　／ アニ≧= ---
　　　　　|//////////|/::::ﾍ.　 ',　　 |从　__ノi　　　　',　　　ﾉ　 ﾍ|　　／ ／ニニニニニニ
　　　　　|//////////|:::::::::::＼{ﾍ　 .|-＜　　 ゝ　　　 r ､ -､　　　　 /　 /ニニニニニニニ
　　　　　|/////////ノ==-＜　　 ',　|　　　　　　　　 r' 　 く　　　　　　./ニニニニニニﾆﾆ
　　　　 .ﾉ//＞≦ニニニニニ＼　 }/　　　　　　　 　 ｀ ´ ＼＼　　　　/ニニニニニニニニ
　　　 .//／ニニニニニニニニﾆ＼　　　　　　　　　　　　　 ｀´　　　　{ﾆﾆニニニニニニニ
　　　 .イニニニニニニニニニニニヽ　　　　　　　　　　　　　　　　　 /ニニニニニニニﾆﾆ
	`
	if b64, err := EncodeEncodeBase64Base64(text); err != nil {
		fmt.Println("err:", err)
	} else {
		fmt.Println(b64)
		if aa, err := DecodeBase64Gzip(b64); err != nil {
			fmt.Println("err:", err)
		} else {
			fmt.Println(string(aa))
		}
	}

}

func EncodeEncodeBase64Base64(str string) (string, error) {
	var buf64 bytes.Buffer
	wb64 := base64.NewEncoder(base64.URLEncoding, &buf64)
	wgz := gzip.NewWriter(wb64)
	_, err := wgz.Write([]byte(str))
	if err != nil {
		return "", err
	}
	wgz.Close()
	wb64.Close()
	sRequest64 := string(buf64.Bytes())
	return sRequest64, nil
}

func DecodeBase64Gzip(b64 string) ([]byte, error) {
	if r, err := gzip.NewReader(base64.NewDecoder(base64.URLEncoding, strings.NewReader(b64))); err != nil {
		fmt.Println(err)
		return nil, err
	} else {

		if s, err := ioutil.ReadAll(r); err != nil {
			fmt.Println(err)
			return nil, err
		} else {
			return s, nil
		}
	}
}
```

## まとめ
上記ソースコードを使えば好きなテキストをURLに埋め込むことが可能です。また、別記事にて上記ソースコードを利用してWebアプリ側でテキストを表示する処理を記載します