Aplicativo Web

Concluído

Para usar um manipulador personalizado, você precisa criar um aplicativo Web. Depois de escrever seu aplicativo e compilá-lo, é necessário configurar o host do Azure Functions para que ele saiba como usá-lo. Vamos explorar mais sobre isso posteriormente. Primeiro, como criar um aplicativo Web em Go?

Criar uma API REST em Go

Para criar uma API REST usando Go, você precisa saber algumas coisas:

  • Importar bibliotecas. Você usará as bibliotecas fmt, log e net/http. Essas bibliotecas ajudarão você a gerenciar rotas, manipular solicitações de entrada e lidar com o registro em log. Use a instrução de importação a seguir:

    import (
       "fmt",
       "log",
       "net/http"
    )    
    
  • Configurar roteamento. As APIs REST consistem em divisões lógicas chamadas de rotas. As rotas são endereços que respondem a uma preocupação específica no aplicativo. Para configurar uma rota, chame o método HandleFunc() na instância http e defina a rota para responder às solicitações:

    http.HandleFunc("/", handleRoute)   
    

    Nesse caso, você precisa criar uma função handleRoute para corresponder às solicitações de entrada em relação à rota "/".

  • Gerenciar solicitações. Você precisa gerenciar solicitações de entrada e ler coisas como o roteador, ou parâmetros de consulta, ou um corpo postado. Em seguida, você precisa construir uma resposta. Uma função que manipula uma solicitação pode ser parecida com esta:

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

    O código envia o texto "Minha primeira API REST" de volta para um cliente de chamada. O método Fprintf() usa dois argumentos: o fluxo de resposta e a cadeia de caracteres para enviar de volta.

  • Criar o servidor. Para poder escutar solicitações, você precisa iniciar o servidor. Você também precisa especificar uma parte para onde as solicitações podem ser enviadas. O seguinte código mostra como criar um servidor:

    http.ListenAndServe(":3000", nil)
    

    O servidor agora está ativo e pode escutar solicitações na porta 3000.

Criar um Aplicativo do Azure Functions

Antes de desenvolver um aplicativo do Azure Functions, recomendamos que você:

Fazer scaffold de um aplicativo do Functions usando o Visual Studio Code

Depois de ter todas as dependências necessárias instaladas em seu sistema, a próxima etapa é fazer scaffold de um aplicativo. Quando for perguntado sobre o runtime, escolha Manipulador Personalizado.

Agora você garante que os arquivos corretos sejam gerados. Ao gerar um projeto dessa forma, você precisa selecionar um tipo de gatilho para sua primeira função. Os manipuladores personalizados funcionam com todos os gatilhos e associações usuais.

Depois de concluir a geração do projeto, você deverá ter um aplicativo com os seguintes arquivos:

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

O arquivo function.json está em um diretório nomeado com o mesmo nome que você atribuiu à sua primeira função. Você usará esse arquivo para configurar sua função.

Configurar o projeto

Para que seu aplicativo funcione com primitivos HTTP, você precisa configurar algumas coisas:

  • Escutar uma porta de manipulador personalizado. Seu aplicativo precisa escutar uma porta específica. A variável FUNCTIONS_CUSTOMHANDLER_PORT contém o valor que você precisa. Você pode procurar o valor da porta usando o seguinte código:

    customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT")
    
  • Configure o caminho executável padrão. Como você está criando um arquivo executável, precisa dizer ao seu projeto de aplicativo do Functions onde ele está localizado.

    Localize o arquivo function.json na raiz do projeto. Na seção customHandler, especifique defaultExecutablePath. Aqui está um exemplo de como isso pode parecer:

    "customHandler": {
       "defaultExecutablePath": "mygoapp.exe"
    }
    
  • Habilitar o encaminhamento de solicitação. Quando você está lidando com uma função que usa um gatilho HTTP, você deseja configurar o aplicativo um pouco diferente do que se estivesse lidando com outro tipo de gatilho (como um gatilho de fila).

    Habilitar uma propriedade chamada enableForwardingHttpRequest. Quando essa propriedade está habilitada, ela altera o comportamento de como a solicitação é manipulada das seguintes maneiras:

    • Cópia da solicitação original. A solicitação HTTP não contém o conteúdo da solicitação dos manipuladores personalizados. Em vez disso, o host do Functions invoca o manipulador com uma cópia da solicitação HTTP original.

    • Mesmo caminho da solicitação original. O host do Functions invoca o manipulador com o mesmo caminho da solicitação original.

      Ao definir uma rota e um manipulador de rotas, você precisa ser específico em como configurar o roteamento. Digamos que você tenha a seguinte estrutura de projeto:

      hello/
        function.json   
      

      Os arquivos na estrutura serão mapeados para uma rota /api/hello por padrão. Em seu código para configurar a rota, você precisa especificar a rota completa:

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

      Se você não tivesse habilitado essa configuração, teria sido suficiente especificar o código do roteador como "/hello" para outros gatilhos e associações.

    • Cópia da resposta do manipulador. O host do Functions retorna uma cópia da resposta HTTP do manipulador como a resposta à solicitação original.

No exemplo anterior, o arquivo executável é o mygoapp.exe. O exemplo presume que você esteja criando o arquivo executável de um arquivo chamado mygoapp.go, mas você pode nomear o arquivo Go como quiser. No Linux ou macOS, o arquivo executável não tem uma extensão.

Criar o aplicativo

A criação do aplicativo Web neste ponto não é muito diferente de criar qualquer aplicativo Web usando Go. Se você tiver feito a configuração descrita na seção anterior, então está tudo pronto.

Agora, você precisa executar as seguintes etapas:

  1. Leia a porta.
  2. Crie uma instância de servidor HTTP.
  3. Defina rotas e manipuladores de rotas.
  4. Inicie a escuta da nova porta.
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)