Завершімо з повною повноцінною на Go, вебсервером. Google надає сервіс за адресою chart.apis.google.com
, який автоматично форматує дані в діаграми та графіки. Однак його важко використовувати в інтерактивному режимі, тому що вам потрібно ввести дані в URL-адресу як запит. Наведена тут програма надає приємніший інтерфейс для однієї з форм даних: отримавши короткий фрагмент тексту, вона звертається до сервера діаграм, щоб створити QR-код — матрицю клітинок, які кодують текст. Це зображення можна захопити камерою мобільного телефону й інтерпретувати як, наприклад, 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
має бути зрозумілим. Прапорець встановлює HTTP-порт за замовчуванням для нашого сервера. Змінна шаблону templ
— це те місце, де відбувається найцікавіше. Вона створює HTML-шаблон, який буде виконуватися сервером для відображення сторінки; про це трохи пізніше.
Функція main
аналізує прапори й, використовуючи механізм, про який ми говорили вище, прив'язує функцію-обробник QR
до шляху для сервера. Потім викликається http.ListenAndServe
для запуску сервера; вона блокується під час роботи сервера.
QR
просто отримує запит, який містить дані форми, і виконує шаблон на даних у значенні форми з ім'ям s
.
Пакет шаблонів html/template
є дуже потужним; ця програма залучає лише поверхневі його можливості. По суті, вона переписує фрагмент HTML-тексту на льоту, підставляючи елементи, отримані з даних, переданих до templ.Execute
, в такому випадку значення форми. У тексті шаблону (templateStr
) фрагменти, розділені подвійними фігурними дужками, позначають дії шаблону. Фрагмент від {{if .}}
до {{end}}
виконується тільки в тому випадку, якщо значення поточного елемента даних, який називається .
(крапка), не є порожнім. Тобто, коли рядок порожній, цей фрагмент шаблону опускається.
Два фрагменти {{.}}
вказують на те, що на вебсторінці відображаються дані, представлені в шаблоні — рядок запиту. Пакет шаблонів HTML автоматично забезпечує відповідне екранування, щоб текст був безпечним для відображення.
Решта рядка шаблону — це просто HTML-код, який відображається при завантаженні сторінки. Якщо це занадто коротке пояснення, зверніться до документації до пакета template
для більш детального обговорення.
Ось і все: корисний вебсервер у кількох рядках коду плюс деякий HTML-текст, керований даними. Go — достатньо потужна мова, щоб зробити багато чого за допомогою всього декількох рядків.