cpp

Веб-сервер на Go. Функция HandleFunc()

Вместо функции Handle() или совместно с ней можно воспользоваться функцией HandleFunc() из пакета net/http. Формат функции:

http.HandleFunc(pattern string,
                handler func(http.ResponseWriter, *http.Request))

В первом параметре указывается строка с шаблоном запроса. Если указан символ /, то будут перехватываться все запросы, для которых нет других зарегистрированных обработчиков. Если шаблон заканчивается символом /, то он будет перехватывать все вложенные запросы. Например, если указан шаблон /contact/, то при запросах http://localhost:3000/contact/ и http://localhost:3000/contact/test.php будет вызван один и тот же обработчик. Причем, если запрос указан без завершающего слеша (/contact), то будет выполнено перенаправление на /contact/:

HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=utf-8
Location: /contact/
Date: Fri, 06 May 2022 18:38:19 GMT
Content-Length: 44

Во втором параметре указывается функция, которая будет вызвана, если запрос соответствует шаблону. Параметры этой функции полностью соответствуют одноименным параметрам метода ServeHTTP().

При использовании функций Handle() и HandleFunc() нужно передать значение nil во втором параметре функции ListenAndServe():

fmt.Println(http.ListenAndServe(":3000", nil))

Переделаем код из листинга 20.3 и используем функцию HandleFunc() (листинг 20.4).

Листинг 20.4. Функция HandleFunc()

package main

import (
   "fmt"
   "net/http"
)

func main() {
   http.HandleFunc("/",
      func(rw http.ResponseWriter, r *http.Request) {
         rw.Header().Add("Server", "MyServer 1.0")
         // Запрос http://localhost:3000/
         if r.URL.Path == "/" && r.Method == "GET" {
            rw.Header().Add("Content-Type", "text/html; charset=UTF-8")
            fmt.Fprintln(rw, "Страница /")
            return
         }
         // Ошибка 404 (страница не найдена)
         rw.Header()["Date"] = nil
         http.Error(rw, "Ошибка 404. Страница не найдена", 404)
      })
   http.HandleFunc("/contact/",
      func(rw http.ResponseWriter, r *http.Request) {
         // Запрос http://localhost:3000/contact/
         rw.Header().Add("Server", "MyServer 1.0")
         rw.Header().Add("Content-Type", "text/html; charset=UTF-8")
         fmt.Fprintln(rw, "Страница", r.URL.Path)
      })
   fmt.Println(http.ListenAndServe(":3000", nil))
}

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp