Упражнение. Создание приложения с помощью настраиваемого обработчика

Завершено

В этом упражнении вы создадите и запустите бессерверное приложение с помощью Go.

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

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

  1. Выберите Вид>Палитра команд.
  2. Выберите Функции Azure: Создать проект.
  3. Выберите папку. Как правило, это будет текущая папка.
  4. В разделе Выбор языка выберите Пользовательский обработчик.
  5. В разделе Выбор шаблона для первой функции выберите HttpTrigger.
  6. Присвойте приложению имя, например hello.
  7. Выберите анонимный уровень авторизации. Вы сможете изменить это позже, если захотите.

Теперь у вас есть проект, который выглядит примерно так:

hello/
  function.json
.funcignore
.gitignore
host.json
local.settings.json
proxies.json

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

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

  1. Создайте файл с именем server.go в корневом каталоге проекта.

  2. Наполните server.go следующим содержимым:

    package main
    
    import (
     "fmt"
     "io/ioutil"
     "log"
     "net/http"
     "os"
    )
    

    Приведенный выше код импортирует все библиотеки, необходимые для создания HTTP-приложения и поиска переменных среды.

  3. Добавьте следующий код после инструкций импорта:

    func main() {
      customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT")
      if !exists {
        customHandlerPort = "8080"
      }
      mux := http.NewServeMux()
      // mux.HandleFunc("/api/hello", helloHandler)
      fmt.Println("Go server Listening on: ", customHandlerPort)
      log.Fatal(http.ListenAndServe(":"+customHandlerPort, mux))
    }
    

    Функция main() вызывается самостоятельно. В первой строке кода указано, как она будет выполнять считывание из переменной среды FUNCTIONS_CUSTOM_HANDLER_PORT:

    customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT")
    

    Затем функция проверяет наличие порта. При его отсутствии функции назначается порт 8080:

    if !exists {
      customHandlerPort = "8080"
    }
    

    Следующий код создает экземпляр HTTP-сервера:

    mux := http.NewServeMux()
    

    Последняя важная строка — это та строка, которая начинает прослушивание на определенном порту и сигнализирует, что она готова к приему запросов с помощью метода ListenAndServe():

    log.Fatal(http.ListenAndServe(":"+customHandlerPort, mux))
    
  4. Добавим остальной код. Сначала необходимо найти следующую строку и раскомментировать ее:

    // mux.HandleFunc("/api/hello", helloHandler)
    
  5. Между инструкциями импорта и функцией main() добавьте следующий код:

    func helloHandler(w http.ResponseWriter, r *http.Request) {
      w.Header().Set("Content-Type", "application/json")
      if r.Method == "GET" {
        w.Write([]byte("hello world"))
      } else {
        body, _ := ioutil.ReadAll(r.Body)
        w.Write(body)
      }
    }
    

    Функция helloHandler() задает для типа содержимого значение application/json. Оно либо отвечает "hello world", либо отвечает с указанным текстом, если он имеется.

Выполнить приложение

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

  1. Из терминала выполните команду go build server.go в корневом каталоге проекта:

    go build server.go
    

    На этом шаге создается исполняемый файл с именем server в MacOS и Linux или server.exe в ОС Windows.

  2. Откройте файл host.json и найдите элемент defaultExecutablePath внутри customHandler. Укажите ./server в macOS и Linux или .\server.exe в ОС Windows.

  3. В элементе customHandler добавьте элемент enableForwardingHttpRequest и присвойте ему значение true. Теперь элемент customHandler должен выглядеть следующим образом:

    "customHandler": {
     "description": {
       "defaultExecutablePath": "./server",
       "workingDirectory": "",
       "arguments": []
     },
     "enableForwardingHttpRequest" : true
    }
    
  4. Из терминала выполните команду func start в корневом каталоге проекта. Это приведет к запуску приложения Функций.

    func start
    

    В конце выходных данных вы увидите примерно такой результат:

    Functions:
    
         hello: [GET,POST] http://localhost:7071/api/hello
    
  5. Для этого откройте в браузере адрес http://localhost:7071/api/hello. Вы должны увидеть выходные данные "hello world".

Поздравляем! Вы разработали бессерверное приложение в Go.