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

Завершено

В этом упражнении вы создадите и запустите бессерверное приложение с помощью 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.