суббота, 2 февраля 2019 г.

Эффективный Go: веб-сервер

В завершение серии постов Эффективный 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-код, отображаемый при загрузке страницы.

И вот, у вас есть: полезный веб-сервер в несколько строк кода плюс несколько управляемый данными HTML текст. Go достаточно мощный, чтобы многое произошло за несколько строк.


Читайте также:


Комментариев нет:

Отправить комментарий