Exercício – Usar um manipulador personalizado para criar um aplicativo

Concluído

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

Fazer scaffold do aplicativo

Comece fazendo scaffold do aplicativo, usando a extensão do Azure Functions no Visual Studio Code.

  1. Selecione Exibir>Paleta de Comandos.
  2. Selecione Azure Functions: Criar Projeto.
  3. Selecione uma pasta, geralmente a pasta atual.
  4. Em Selecionar uma linguagem, selecione Manipulador Personalizado.
  5. Em Selecionar um modelo para sua primeira função, selecione HttpTrigger.
  6. Dê um nome ao aplicativo, como hello.
  7. Selecione um nível de autorização do anônimo. Você poderá alterar o nome posteriormente se quiser.

Agora, você tem um projeto que se parece com algo assim:

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

Criar o aplicativo

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

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

  2. Dê ao server.go o seguinte conteúdo:

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

    O código anterior importa todas as bibliotecas que você precisa 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 função main() é invocada por si só. A primeira linha do código informa como ele lerá da variável de ambiente FUNCTIONS_CUSTOM_HANDLER_PORT:

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

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

    if !exists {
      customHandlerPort = "8080"
    }
    

    O próximo código cria uma instância de servidor HTTP:

    mux := http.NewServeMux()
    

    A última linha de importância é aquela que começa a escutar 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 remova a marca de comentário:

    // mux.HandleFunc("/api/hello", helloHandler)
    
  5. Entre as instruções de importação e a função main(), 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 função helloHandler() define o tipo de conteúdo como application/json. Ele responde com "olá, mundo" ou com o corpo postado, se for o caso.

Executar o aplicativo

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

  1. Em um terminal, execute go build server.go na raiz do projeto:

    go build server.go
    

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

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

  3. No elemento customHandler, adicione o elemento enableForwardingHttpRequest e dê a ele o valor true. O elemento customHandler agora deverá ser semelhante a isso:

    "customHandler": {
     "description": {
       "defaultExecutablePath": "./server",
       "workingDirectory": "",
       "arguments": []
     },
     "enableForwardingHttpRequest" : true
    }
    
  4. Em um terminal, execute func start na raiz do projeto. Isso inicia seu aplicativo do Functions.

    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, acesse http://localhost:7071/api/hello. Você deverá ver a saída: "olá, mundo".

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