Веб-приложение

Завершено

Чтобы использовать пользовательский обработчик, необходимо создать веб-приложение. После написания и компиляции приложения необходимо настроить узел Функций Azure, чтобы он знал, как его использовать. Мы рассмотрим это позже. Сначала узнаем, как создать приложение в Go.

Создание REST API в Go

Чтобы создать REST API с помощью Go, необходимо знать определенные вещи:

  • Импорт библиотек. Вы будете использовать библиотеки fmt, log и net/http. Эти библиотеки помогают управлять маршрутами, обрабатывать входящие запросы и работать с журналами. Используйте следующий операторы импорта:

    import (
       "fmt",
       "log",
       "net/http"
    )    
    
  • Настройка маршрутизации. Интерфейсы REST API состоят из логических подразделений, называемых маршрутами. Маршруты — это адреса, которые отвечают на определенную задачу в приложении. Чтобы настроить маршрут, вызовите метод HandleFunc() в экземпляре http и определите маршрут для ответа на запросы:

    http.HandleFunc("/", handleRoute)   
    

    В этом случае необходимо создать функцию handleRoute для сопоставления входящих запросов с маршрутом "/".

  • Управление запросами. Необходимо управлять входящими запросами и считывать такие данные, как параметры маршрутизатора или запроса или опубликованный текст. Затем необходимо сконструировать ответ. Функция, обрабатывающая запрос, может выглядеть следующим образом:

    func handleRequest(w: http:ResponseWriter, r: http.Request) {
        fmt.Fprintf(w, "My first REST API") 
    }
    

    Код отправляет текст "My First REST API" обратно вызывающему клиенту. Метод Fprintf() принимает два аргумента: поток ответа и строку для обратной передачи.

  • Создание сервера. Чтобы иметь возможность ожидать запросы, необходимо запустить сервер. Также необходимо указать часть, в которую могут отправляться запросы. Следующий кода демонстрирует, как создать сервер:

    http.ListenAndServe(":3000", nil)
    

    Теперь сервер работает и может ожидать запросы через порт 3000.

Создание приложения-функции Azure

Перед началом разработки приложения Функций Azure рекомендуется выполнить следующие действия:

  • Установка Visual Studio Code. Вы можете создавать приложения Функций Azure с помощью любого текстового редактора или интегрированной среды разработки. В этом модуле демонстрируются некоторые расширения, упрощающие разработку.

  • Установка расширения Visual Studio Code для Функций Azure. Это расширение поможет сформировать, запустить и отладить шаблон приложения Функций.

  • Установка Azure Functions Core Tools. В эту установку входит исполняемая команда func, которая позволяет запускать приложение Функций.

Формирование шаблона приложения Функций с помощью Visual Studio Code

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

Таким образом, вы обеспечили создание правильных файлов. При создании проекта таким образом необходимо выбрать тип триггера для первой функции. Пользовательские обработчики работают со всеми обычными триггерами и привязками.

После завершения создания проекта у вас должно быть приложение со следующими файлами:

  • host.json
  • local.setting.json
  • proxies.json
  • function.json

Файл function.json находится в каталоге, имя которого соответствует тому, которое вы дали своей первой функции. Этот файл будет использоваться для настройки функции.

Настройка проекта

Чтобы ваше приложение работало с примитивами HTTP, необходимо настроить несколько вещей:

  • Ожидание передачи данных через порт пользовательского обработчика. Ваше приложение должно ожидать передачи данных через указанный порт. Переменная FUNCTIONS_CUSTOMHANDLER_PORT содержит необходимое значение. Чтобы узнать значение порта, можно использовать следующий код:

    customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT")
    
  • Настройка пути к исполняемому файлу по умолчанию. Так как вы создаете исполняемый файл, необходимо сообщить проекту приложения Функций, где он находится.

    Найдите файл function.json в корневом каталоге проекта. В разделе customHandler укажите defaultExecutablePath. Вот пример того, как он может выглядеть:

    "customHandler": {
       "defaultExecutablePath": "mygoapp.exe"
    }
    
  • Включение перенаправления запросов. Если вы работаете с функцией, использующей триггер HTTP, вам необходимо настроить приложение немного иначе, чем при работе с триггером другого типа (например, триггером очереди).

    Включите свойство с именем enableForwardingHttpRequest. Включение этого свойства изменяет способ обработки запроса следующим образом.

    • Копия исходного запроса. HTTP-запрос не содержит полезных данных запроса пользовательских обработчиков. Вместо этого узел Функций вызывает обработчик с копией исходного HTTP-запроса.

    • Тот же путь, что и у исходного запроса. Узел Функций вызывает обработчик с тем же путем, что и у исходного запроса.

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

      hello/
        function.json   
      

      По умолчанию файлы в структуре будут сопоставляться с маршрутом /api/hello. В коде для настройки маршрута необходимо указать полный маршрут:

      mux.HandleFunc("/api/hello", helloHandler)
      

      Если вы не включили этот параметр, то для других типов триггеров и привязок было бы достаточно указать код маршрутизатора "/hello".

    • Копия ответа обработчика. Узел Функций возвращает копию HTTP-ответа обработчика в качестве ответа на исходный запрос.

В предыдущем примере исполняемым файлом был mygoapp.exe. В этом примере предполагается, что вы создаете исполняемый файл из файла с именем mygoapp.go, но можете дать файлу Go любое имя по своему усмотрению. В Linux или macOS исполняемый файл не имеет расширения.

Создание приложения

Создание веб-приложения на этом этапе не сильно отличается от создания веб-приложения с помощью Go. Если вы выполнили настройку, описанную в предыдущем разделе, вы готовы продолжать.

Теперь необходимо выполнить следующие действия:

  1. Считайте порт.
  2. Создайте экземпляр HTTP-сервера.
  3. Определите маршруты и обработчики маршрутов.
  4. Запустите ожидание передачи данных на новом порте.
customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT")
if !exists {
   customHandlerPort = "8080"
} // 1)
mux := http.NewServeMux() // 2)
mux.HandleFunc("/order", orderHandler) // 3)
fmt.Println("Go server Listening on: ", customHandlerPort)
log.Fatal(http.ListenAndServe(":"+customHandlerPort, mux)) // 4)