Exercício - Use um manipulador personalizado para criar um aplicativo

Concluído

Neste exercício, você criará e executará um aplicativo sem servidor usando o Go.

Andaime o aplicativo

Comece criando um scaffolding do aplicativo, usando a extensão Azure Functions no Visual Studio Code.

  1. Selecione Exibir>paleta de comandos.
  2. Selecione Azure Functions: Create New Project.
  3. Selecione uma pasta, geralmente a pasta atual.
  4. Em Selecione um idioma, selecione Manipulador personalizado.
  5. Em Selecione um modelo para sua primeira função, selecione HttpTrigger.
  6. Dê um nome ao aplicativo, como Olá.
  7. Selecione um nível de autorização de anônimo. Você pode alterar isso mais tarde, se desejar.

Agora você tem um projeto que se parece com isto:

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

Criar a aplicação

A próxima série de etapas é sobre a criação de um aplicativo que possa responder a um gatilho HTTP.

  1. Crie um arquivo chamado server.go na raiz do projeto.

  2. a server.go o seguinte conteúdo:

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

    O código anterior importa todas as bibliotecas necessárias para criar um aplicativo HTTP e procurar variáveis de ambiente.

  3. Adicione o seguinte código após as instruções de importação:

    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))
    }
    

    A main() função é invocada por si mesma. A primeira linha do código indica como ele será lido a FUNCTIONS_CUSTOM_HANDLER_PORT partir da variável de ambiente:

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

    Em seguida, a função verifica se a porta existe. Se não, a função é atribuída porta 8080:

    if !exists {
      customHandlerPort = "8080"
    }
    

    O próximo código instancia uma instância do servidor HTTP:

    mux := http.NewServeMux()
    

    A última linha de importância é aquela que começa a ouvir uma porta específica e sinaliza que está pronta para receber solicitações, com o método ListenAndServe():

    log.Fatal(http.ListenAndServe(":"+customHandlerPort, mux))
    
  4. Vamos adicionar o código restante. Primeiro, localize a seguinte linha e descomente-a:

    // mux.HandleFunc("/api/hello", helloHandler)
    
  5. Entre as instruções import e a main() função, adicione o seguinte código:

    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)
      }
    }
    

    A helloHandler() função define o tipo de conteúdo como application/json. Ele responde com "hello world" ou o corpo postado, se houver.

Executar a aplicação

Você terminou de criar o código neste momento, mas precisa fazer algumas configurações para que esse cenário funcione. Você precisa apontar onde está seu arquivo executável, para que o host da função possa encontrá-lo. Você também precisa configurar o roteamento e declarar que este aplicativo lida com gatilhos HTTP e nenhum outro tipo de associações.

  1. A partir de um terminal, execute go build server.go na raiz do projeto:

    go build server.go
    

    Esta etapa cria um arquivo executável chamado servidor no macOS e Linux, ou server.exe em um sistema operacional Windows.

  2. Abra o arquivo host.json e localize o defaultExecutablePath elemento dentro dele customHandler . Especifique ./server no macOS e Linux ou .\server.exe em um sistema operacional Windows.

  3. Sob o customHandler elemento , adicione o enableForwardingHttpRequest elemento e dê-lhe o valor true. Seu customHandler elemento agora deve ter esta aparência:

    "customHandler": {
     "description": {
       "defaultExecutablePath": "./server",
       "workingDirectory": "",
       "arguments": []
     },
     "enableForwardingHttpRequest" : true
    }
    
  4. A partir de um terminal, execute func start na raiz do projeto. Isso inicia o aplicativo Funções.

    func start
    

    No final da saída, você verá uma saída semelhante a:

    Functions:
    
         hello: [GET,POST] http://localhost:7071/api/hello
    
  5. Em um navegador, vá para http://localhost:7071/api/hello. Você deve ver a saída "hello world".

Parabéns! Você desenvolveu um aplicativo sem servidor no Go.