В предыдущей статье мы рассказали про установку и настройку среды для разработки на 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, "Привет!")
}
Любая функция-обработчик принимает два параметра:
- http.ResponseWriter — это структура которая описывает ответ
- *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)
}
}
На этом все, мы запустили простейший сервер с примером ответа “Привет!”.
Экспериментируйте с удовольствием, а мы в следующей статье расскажем про создание модели, подключение к базе данных и про простейшую архитектуру проекта.