Простейший веб-сайт на Go

4 min read

В предыдущей статье мы рассказали про установку и настройку среды для разработки на Go и написали простейшую программу Hello, World. В этой статье речь пойдет о создании простого веб-сервера. По умолчанию, в Go существует пакет для работы с сетевыми протоколами, в том числе с HTTP. Перед тем как читать дальше, рекомендуем ознакомиться с типами данных, объявлением переменных и с созданием функций. 

Используем пакет net/http для создания сервера

Пакет http предоставляет возможности по обработке клиент-серверных запросов. 

Откроем ранее созданный файл main.go из предыдущей статьи, который выглядит так:

package main import "fmt" func main() { fmt.Println("Hello, World!") }

Чтобы использовать пакет, необходимо его импортировать. Добавим в import название пакета

import ( "fmt" "net/http" )

Теперь, когда мы подключили пакет, можно использовать описанные в нем методы и структуры. В функцию main добавим пару строк кода

http.HandleFunc("/", sayhello) // Устанавливаем роутер err := http.ListenAndServe(":8080", nil) // устанавливаем порт веб-сервера if err != nil { log.Fatal("ListenAndServe: ", err) }

Функция ListenAndServe принимает два параметра — порт соединения и функцию-обработчик, которая будет выполнена при запуске сервера. В нашем случае, она не задана.

Далее необходимо задать обработку роутов – адресов сайта. В нашем примере мы обрабатываем “http://localhost:8080/”, то есть, роут “/”. Когда пользователь вводит адрес “http://localhost:8080/”, вызывается функция sayhello в котором происходит обработка запроса. 

Добавим функцию sayhello:

func sayhello(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Привет!") }

Любая функция-обработчик принимает два параметра: 

  1. http.ResponseWriter — это структура которая описывает ответ
  2. *http.Request — указатель на запрос. Из этого параметра можно получать тело запроса, параметры POST, GET или заголовки. 

Наша функция передает в ответ “Привет!”

Давайте запустим нашу программу

go run main.go

Компилятор попросит вас подтвердить прослушку порта, поэтому соглашаемся. В браузере вводим “http://localhost:8080/” и видим на странице переданное сообщение.

Подключение HTTPS

Если вы хотите использовать зашифрованный протокол https, то вам необходимо использовать функцию ListenAndServeTLS. Рассмотрим пример ее использования.

http.ListenAndServeTLS(":8080", "cert.pem", "key.pem", nil)

В этой функции помимо порта и функции-обработчика нужно указать путь к сертификату и к приватному ключу. 

Пользователи Mac могут сгенерировать сертификат с помощью утилиты OpenSSL. OpenSSL поставляется в Mac OS X и Linux. Если вы используете Windows, то вам нужно установить бинарники отдельно.

Генерируем сертификат с приватным ключом

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout key.pem -out cert.pem

Вам нужно будет ответить на несколько вопросов в момент генерации. В поле "Common Name (e.g. server FQDN or YOUR name)" указываем путь к локальному адресу “127.0.0.1:8080”. После генерации в этой папке появятся два файла: cert.pem и key.pem. Учтите, эти файлы называются самоподписным сертификатом, поэтому браузер будет определять соединение как небезопасное.

Итак, приводим весь код в файле main.go

package main import ( "fmt" "net/http" "log" ) func sayhello(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Привет!") } func main() { http.HandleFunc("/", sayhello) // Устанавливаем роутер err := http.ListenAndServe(":8080", nil) // устанавливаем порт веб-сервера // Если хотите использовать https, то вместо ListenAndServe используйте ListenAndServeTLS // err := http.ListenAndServeTLS(":8080", "cert.pem", "key.pem", nil) if err != nil { log.Fatal("ListenAndServe: ", err) } }

На этом все, мы запустили простейший сервер с примером ответа “Привет!”. 

Экспериментируйте с удовольствием, а мы в следующей статье расскажем про создание модели, подключение к базе данных и про простейшую архитектуру проекта.