понедельник, 22 июля 2019 г.

Пакет Gorilla mux для обработки веб-запросов

Gorilla это набор инструментов для веб-программирования (web toolkit).

Пакет Gorilla mux реализует маршрутизатор запросов (request router) и диспетчер.

Установка

$ go get github.com/gorilla/mux

Импорт

import "github.com/gorilla/mux"

Использование

Название mux означает "мультиплексор HTTP-запросов". Как и стандартный http.ServeMux, mux.Router сопоставляет входящие запросы со списком зарегистрированных маршрутов и вызывает обработчик для маршрута, который соответствует URL-адресу или другим условиям. Основными функциями являются:

1. Запросы могут быть сопоставлены на основе URL хоста, пути, префикса пути, схем, значения заголовка и запроса, метода HTTP или использование пользовательских сопоставлений.

2. У URL хостов, путей и значений запроса могут быть переменные с необязательным регулярным выражением.

3. Зарегистрированные URL-адреса могут быть построены или "перевернуты", что помогает поддерживать ссылки на ресурсы.

4. Маршруты можно использовать в качестве подчиненных маршрутов: вложенные маршруты проверяются только в том случае, если родительский маршрут совпадает. Это полезно для определения групп маршрутов, которые имеют общие условия, такие как хост, префикс пути или другие повторяющиеся атрибуты. В качестве бонуса это оптимизирует сопоставление запросов.

5. Реализует интерфейс http.Handler, поэтому совместим со стандартным http.ServeMux.

Зарегистрируем пару URL-путей и обработчиков:

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/", HomeHandler)
    r.HandleFunc("/products", ProductsHandler)
    r.HandleFunc("/articles", ArticlesHandler)
    http.Handle("/", r)
}

Здесь мы регистрируем три маршрута, отображающие URL-пути к обработчикам. Это эквивалентно тому, как работает http.HandleFunc(): если URL входящего запроса совпадает с одним из путей, соответствующий обработчик называется передачей (http.ResponseWriter, *http.Request) в качестве параметров.

Пути могут иметь переменные. Они определяются в формате {имя} или {имя:шаблон}. Если шаблон регулярного выражения не определен, соответствующая переменная будет иметь значение до следующей косой черты. Например:

r := mux.NewRouter()
r.HandleFunc("/products/{key}", ProductHandler)
r.HandleFunc("/articles/{category}/", ArticlesCategoryHandler)
r.HandleFunc("/articles/{category}/{id:[0-9]+}", ArticleHandler)

Группы могут использоваться внутри шаблонов, если они не фиксируются (?:re). Например:

r.HandleFunc("/articles/{category}/{sort:(?:asc|desc|new)}", ArticlesCategoryHandler)

Имена используются для создания карты переменных маршрута, которые можно получить с помощью mux.Vars():

vars := mux.Vars(request)
category := vars["category"]

Обратите внимание, что если присутствуют какие-либо группы захвата, mux будет вызывать panic() во время анализа. Чтобы предотвратить это, преобразуйте любые группы захвата в не-захваты, например, замените "/{sort:(asc|desc)}" на "/{sort:(?:asc|desc)}". Это отличие от предыдущих версий, которые вели себя непредсказуемо, когда присутствовали группы захвата.


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


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

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