Skip to content

Latest commit

 

History

History
68 lines (52 loc) · 5.46 KB

15. Вебсервер.md

File metadata and controls

68 lines (52 loc) · 5.46 KB

Вебсервер

Завершімо з повною повноцінною на 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 — достатньо потужна мова, щоб зробити багато чого за допомогою всього декількох рядків.