ウェブサーバー

ウェブサーバー

完全なGoプログラム、ウェブサーバーで締めくくりましょう。これは実際には一種のウェブ再サーバーです。Googleはchart.apis.google.comでサービスを提供しており、データを自動的にチャートやグラフにフォーマットします。ただし、データをクエリとしてURLに入れる必要があるため、対話的に使用するのは困難です。ここでのプログラムは、一つの形式のデータに対してより良いインターフェースを提供します:短いテキストを与えると、チャートサーバーを呼び出してQRコード(テキストをエンコードするボックスのマトリックス)を生成します。その画像は携帯電話のカメラで撮影でき、たとえばURLとして解釈でき、電話の小さなキーボードにURLを入力する手間を省きます。

完全なプログラムは次のとおりです。説明が続きます。

package main

import (
    "flag"
    "html/template"
    "log"
    "net/http"
)

var addr = flag.String("addr", ":1718", "http service address") // Q=17, R=18

var templ = template.Must(template.New("qr").Parse(templateStr))

func main() {
    flag.Parse()
    http.Handle("/", http.HandlerFunc(QR))
    err := http.ListenAndServe(*addr, nil)
    if err != nil {
        log.Fatal("ListenAndServe:", err)
    }
}

func QR(w http.ResponseWriter, req *http.Request) {
    templ.Execute(w, req.FormValue("s"))
}

const templateStr = `
<html>
<head>
<title>QR Link Generator</title>
</head>
<body>
{{if .}}
<img src="http://chart.apis.google.com/chart?chs=300x300&cht=qr&choe=UTF-8&chl={{.}}" />
<br>
{{.}}
<br>
<br>
{{end}}
<form action="/" name=f method="GET">
    <input maxLength=1024 size=70 name=s value="" title="Text to QR Encode">
    <input type=submit value="Show QR" name=qr>
</form>
</body>
</html>
`

mainまでの部分は理解しやすいはずです。1つのフラグがサーバーのデフォルトHTTPポートを設定します。テンプレート変数templが楽しい部分です。これは、サーバーによって実行されて表示ページを表示するHTMLテンプレートを構築します。これについては後で詳しく説明します。

main関数はフラグを解析し、前述したメカニズムを使用して、関数QRをサーバーのルートパスにバインドします。次にhttp.ListenAndServeが呼び出され、サーバーが開始されます。ブロックしながらリクエストを処理します。

QRは、フォームデータを含むリクエストを受信し、sという名前のフォームフィールドのデータでテンプレートを実行するだけです。

テンプレートパッケージhtml/templateは強力です。このプログラムは、その機能のほんの一部に触れているに過ぎません。本質的に、templ.Executeが実行されると、テンプレートが書き換えられ、実行時に渡されたデータアイテム(この場合はQR)から要素を置き換えます。テンプレート内で、二重波括弧で区切られたピース({{.}}など)はテンプレートアクションを示します。.から{{.}}までのピースは、現在のデータアイテム(文字列)の値を印刷するよう指示します。条件実行の例である{{if .}}から{{end}}までのピースは、現在のデータアイテム(.で示される)が空でない場合にのみ実行されます。つまり、文字列が空のとき、このテンプレートのピースは抑制されます。

2つのスニペット{{.}}は、クエリ文字列をチャートサーバーのURLに出力し、もう一つは同じ文字列をHTMLの下に表示するために使用されることに注意してください。HTMLテンプレートパッケージは自動的に適切なエスケープを提供するため、テキストは安全に表示されます。

プログラムをビルドして実行した場合、アドレスhttp://localhost:1718/にアクセスできます。ページが表示され、テキストを入力できるボックスがあり、GoogleのチャートサーバーによってホストされるQRコードが生成されます。もちろん、その文字列をモバイルアプリで認識できるはずです。