Aplikacja sieci web

Ukończone

Aby użyć niestandardowego programu obsługi, musisz utworzyć aplikację internetową. Po napisaniu aplikacji i skompilowaniu jej należy skonfigurować hosta usługi Azure Functions, aby wiedział, jak z niej korzystać. Dowiemy się więcej na ten temat później. Po pierwsze, jak utworzyć aplikację internetową w języku Go?

Tworzenie interfejsu API REST w języku Go

Aby utworzyć interfejs API REST przy użyciu języka Go, musisz znać kilka rzeczy:

  • Importowanie bibliotek. Użyjesz bibliotek fmt, logi net/http. Te biblioteki ułatwiają zarządzanie trasami, obsługę żądań przychodzących i obsługę rejestrowania. Użyj następującej instrukcji importowania:

    import (
       "fmt",
       "log",
       "net/http"
    )    
    
  • Konfigurowanie routingu. Interfejsy API REST składają się z podziałów logicznych nazywanych trasami. Trasy to adresy, które odpowiadają na konkretne problemy w aplikacji. Aby skonfigurować trasę, wywołaj HandleFunc() metodę w wystąpieniu http i zdefiniuj trasę, aby odpowiadać na żądania:

    http.HandleFunc("/", handleRoute)   
    

    W takim przypadku należy utworzyć handleRoute funkcję w celu dopasowania żądań przychodzących do trasy "/".

  • Zarządzanie żądaniami. Musisz zarządzać żądaniami przychodzącymi i odczytywać takie elementy jak router lub parametry zapytania lub wysłana treść. Następnie należy utworzyć odpowiedź. Funkcja, która obsługuje żądanie, może wyglądać następująco:

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

    Kod wysyła tekst "Mój pierwszy interfejs API REST" z powrotem do wywołującego klienta. Metoda Fprintf() przyjmuje dwa argumenty: strumień odpowiedzi i ciąg do wysłania z powrotem.

  • Utwórz serwer. Aby móc nasłuchiwać żądań, należy uruchomić serwer. Należy również określić część, do której można wysyłać żądania. Poniższy kod pokazuje, jak utworzyć serwer:

    http.ListenAndServe(":3000", nil)
    

    Serwer działa teraz i może nasłuchiwać żądań na porcie 3000.

Tworzenie aplikacji usługi Azure Functions

Przed utworzeniem aplikacji usługi Azure Functions zalecamy:

Tworzenie szkieletu aplikacji usługi Functions przy użyciu programu Visual Studio Code

Po zainstalowaniu wszystkich wymaganych zależności w systemie następnym krokiem jest utworzenie szkieletu aplikacji. Po wyświetleniu monitu o środowisko uruchomieniowe wybierz pozycję Niestandardowa procedura obsługi.

Teraz upewniono się, że zostaną wygenerowane poprawne pliki. Podczas generowania projektu w ten sposób należy wybrać typ wyzwalacza dla pierwszej funkcji. Niestandardowe programy obsługi współpracują ze wszystkimi zwykłymi wyzwalaczami i powiązaniami.

Po zakończeniu generowania projektu powinna istnieć aplikacja z następującymi plikami:

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

Plik function.json znajduje się w katalogu, którego nazwa odpowiada nazwie twojej pierwszej funkcji. Użyjesz tego pliku do skonfigurowania funkcji.

Konfigurowanie projektu

Aby aplikacja działała z elementami pierwotnymi HTTP, należy skonfigurować kilka rzeczy:

  • Nasłuchiwanie niestandardowego portu programu obsługi. Aplikacja musi nasłuchiwać określonego portu. Zmienna FUNCTIONS_CUSTOMHANDLER_PORT zawiera potrzebną wartość. Wartość portu można wyszukać przy użyciu następującego kodu:

    customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT")
    
  • Skonfiguruj domyślną ścieżkę wykonywalną. Ponieważ tworzysz plik wykonywalny, musisz poinformować projekt aplikacji usługi Functions o lokalizacji.

    Znajdź plik function.json w katalogu głównym projektu. customHandler W sekcji określ wartość defaultExecutablePath. Oto przykład tego, jak może wyglądać:

    "customHandler": {
       "defaultExecutablePath": "mygoapp.exe"
    }
    
  • Włącz przekazywanie żądań. Gdy masz do czynienia z funkcją korzystającą z wyzwalacza HTTP, chcesz skonfigurować aplikację nieco inaczej niż w przypadku innego typu wyzwalacza (na przykład wyzwalacza kolejki).

    Włącz właściwość o nazwie enableForwardingHttpRequest. Po włączeniu tej właściwości zmienia zachowanie sposobu obsługi żądania w następujący sposób:

    • Kopia oryginalnego żądania. Żądanie HTTP nie zawiera ładunku żądania niestandardowego programu obsługi. Zamiast tego host usługi Functions wywołuje procedurę obsługi z kopią oryginalnego żądania HTTP.

    • Ta sama ścieżka co oryginalne żądanie. Host usługi Functions wywołuje procedurę obsługi z tą samą ścieżką co oryginalne żądanie.

      Podczas definiowania trasy i procedury obsługi tras należy określić sposób konfigurowania routingu. Załóżmy, że masz następujący konspekt projektu:

      hello/
        function.json   
      

      Pliki w konspekcie będą domyślnie mapowane na trasę /api/hello . W kodzie konfigurowania trasy należy określić pełną trasę:

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

      Jeśli to ustawienie nie zostało włączone, w przypadku innych typów wyzwalaczy i powiązań należy określić kod routera, tak jak "/hello" byłby wystarczający.

    • Kopia odpowiedzi programu obsługi. Host usługi Functions zwraca kopię odpowiedzi HTTP programu obsługi jako odpowiedź na oryginalne żądanie.

W poprzednim przykładzie plik wykonywalny to mygoapp.exe. W przykładzie przyjęto założenie, że tworzysz plik wykonywalny z pliku o nazwie mygoapp.go, ale możesz nazwać plik Go dowolnym elementem. W systemie Linux lub macOS plik wykonywalny nie ma rozszerzenia.

Tworzenie aplikacji

Kompilowanie aplikacji internetowej w tym momencie nie różni się znacznie od kompilowania żadnej aplikacji internetowej przy użyciu języka Go. O ile konfiguracja została opisana w poprzedniej sekcji, wszystko jest ustawione.

Teraz musisz wykonać następujące czynności:

  1. Odczyt portu.
  2. Utwórz wystąpienie wystąpienia serwera HTTP.
  3. Definiowanie tras i procedur obsługi tras.
  4. Rozpocznij nasłuchiwanie na porcie.
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)