Web アプリ

完了

カスタム ハンドラーを使用するには、Web アプリケーションを作成する必要があります。 アプリケーションを作成してコンパイルしたら、その使用方法を認識できるように Azure Functions ホストを構成する必要があります。 詳細については、後で説明します。 まず、Web アプリケーションを Go で構築する方法について説明します。

REST API を Go で構築する

Go を使用して REST API を構築するために、いくつかの事を知っておく必要があります。

  • ライブラリをインポートするfmtlog、および net/http のライブラリを使用します。 これらのライブラリを使用すると、ルートの管理、受信要求の処理、およびログ記録を行うことができます。 次の import ステートメントを使用します。

    import (
       "fmt",
       "log",
       "net/http"
    )    
    
  • ルーティングをセットアップする。 REST API は "ルート" と呼ばれる論理区分で構成されています。 ルートは、アプリ内の特定の問題に対応するアドレスです。 ルートをセットアップするには、http インスタンスで HandleFunc() メソッドを呼び出し、要求に応答するルートを定義します。

    http.HandleFunc("/", handleRoute)   
    

    この場合は、ルート "/" に対する受信要求に対応する handleRoute 関数を作成する必要があり ます。

  • 要求を管理する。 受信した要求を管理し、ルーターやクエリのパラメーター、投稿された本文などを読み取る必要があります。 次に、応答を作成する必要があります。 要求を処理する関数は、次のようになります。

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

    このコードは、"My first REST API" というテキストを呼び出し元のクライアントに返します。 メソッド Fprintf() は、応答ストリームと返す文字列の 2 つの引数を受け取ります。

  • サーバーを作成する。 要求をリッスンできるようにするには、サーバーを起動する必要があります。 また、要求の送信先となるポートを指定する必要もあります。 次のコードは、サーバーの作成方法を示しています。

    http.ListenAndServe(":3000", nil)
    

    これでサーバーが起動し、ポート 3000 で要求をリッスンできるようになります。

Azure Functions アプリを作成する

Azure Functions アプリを開発する前に、次のことを行うことをお勧めします。

Visual Studio Code を使用して Functions アプリをスキャフォールディングする

必要なすべての依存関係がシステムにインストールされたら、次の手順ではアプリケーションをスキャフォールディングします。 ランタイムについて確認するメッセージが表示されたら、[Custom Handler]\(カスタム ハンドラー\) を選択します。

これで、正しいファイルが生成されるようになりました。 この方法でプロジェクトを生成する場合は、最初の関数のトリガーの種類を選択する必要があります。 カスタム ハンドラーは、通常のすべてのトリガーおよびバインディングで動作します。

プロジェクトの生成が完了したら、次のファイルを含むアプリが必要です。

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

function.json ファイルは、最初の関数に付けた名前に対応する名前を持つディレクトリにあります。 このファイルを使用して関数を構成します。

プロジェクトを構成する

アプリで HTTP プリミティブを操作するには、いくつかの構成が必要です。

  • カスタム ハンドラー ポートをリッスンする。 アプリでは特定のポートをリッスンする必要があります。 変数 FUNCTIONS_CUSTOMHANDLER_PORT には必要な値が含まれています。 次のコードを使用して、ポート値を参照できます。

    customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT")
    
  • 既定の実行可能パスを構成する。 実行可能ファイルを構築する場合は、その場所を Functions アプリ プロジェクトに伝える必要があります。

    プロジェクト ルートの function.json ファイルを探します。 customHandler セクションで、defaultExecutablePath を指定します。 次の例のようになります。

    "customHandler": {
       "defaultExecutablePath": "mygoapp.exe"
    }
    
  • 要求転送を有効にする。 HTTP トリガーを使用する関数を処理する場合は、別の種類のトリガー (キュー トリガーなど) を処理する場合とは少し異なる方法でアプリを構成する必要があります。

    enableForwardingHttpRequest という名前のプロパティを有効にします。 このプロパティを有効にすると、要求を処理する動作が次のように変更されます。

    • 元の要求のコピー。 HTTP 要求には、カスタム ハンドラーの要求ペイロードが含まれていません。 代わりに、Functions ホストは元の HTTP 要求のコピーを使用してハンドラーを呼び出します。

    • 元の要求と同じパス。 Functions ホストでは、元の要求と同じパスのハンドラーを呼び出します。

      ルートとルート ハンドラーを定義するときに、ルーティングの設定方法を具体的に指定する必要があります。 次のプロジェクト outline があるとします。

      hello/
        function.json   
      

      outline 内のファイルは、既定でルート /api/hello にマップされます。 ルートを設定するコードで、完全なルートを指定する必要があります。

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

      この設定を有効にしなかった場合は、他の種類のトリガーとバインディングに対して、ルーター コードを "/hello" として指定すれば十分です。

    • ハンドラーの応答のコピー。 Functions ホストは、元の要求への応答として、ハンドラーの HTTP 応答のコピーを返します。

前の例で、実行可能ファイルは mygoapp.exe です。 この例では、mygoapp.go という名前のファイルから実行可能ファイルを作成することを想定していますが、Go ファイルには好きな名前を付けることができます。 Linux または macOS の場合、実行可能ファイルには拡張子が付きません。

アプリをビルドする

この時点では、Web アプリを構築する方法は、Go を使用した Web アプリの構築と大きな違いはありません。 前のセクションで説明されている構成を行っていれば、これで完了です。

次に、以下の手順を実行する必要があります。

  1. ポートを読み取る。
  2. HTTP サーバー インスタンスをインスタンス化する。
  3. ルートとルート ハンドラーを定義する。
  4. ポートのリッスンを開始する。
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)