下の記事でも紹介していますが、以前URLを使ってストレージいらずのテキスト共有のサービスを作ったことがあります。
Ionicによるプライベートプロダクト開発の裏側事情
その時の内容はURLにテキストの情報を全て入れ込むというなかなかの力技だったんですが、半年以上たってその時の処理を忘れないように備忘録として書き残しておきます。
処理の手順
GolangのBase64エンコーディングにはなんとURLEncodingというものがあります。
base64.NewEncoder(base64.URLEncoding, &buf64)
こいつを使えばURLセーフなBase64エンコーディングを行うことができます。さらにGolangには標準でgzipのライブラリがあります。なので、これらを組み合わせて以下のようなことが行えます。
- テキストをプログラムで受け取る
- テキストをgzipで圧縮する
- URLセーフでBase64エンコーディングする
- URLのパラメータにする
上記を実装するために以下、Golangでテキスト→gzip→Base64のソースコードになります。
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アプリ側でテキストを表示する処理を記載します