すべてのプロダクト
Search
ドキュメントセンター

Function Compute:HTTPハンドラー

最終更新日:Sep 02, 2024

HTTPハンドラーを使用して、HTTPリクエストを効率的に処理できます。 関数を呼び出すと、function Computeは関数コードで指定したハンドラーを実行してリクエストを処理します。 このトピックでは、GoのHTTPハンドラーの構造と特性について説明します。

HTTPハンドラーを使用するためのサンプルコード

go用にaliyun/serverless/fc-runtime-Go-SDK /fcという名前の公式sdkライブラリをインポートし、ハンドラーmain関数を実装します。 サンプルコード:

package main

import (
    "context"
    "fmt"
    "net/http"
    "io/ioutil"

    "github.com/aliyun/fc-runtime-go-sdk/fc"
)

func HandleHttpRequest(ctx context.Context, w http.ResponseWriter, req *http.Request) error {
  body, err := ioutil.ReadAll(req.Body)
  if err != nil {
    w.WriteHeader(http.StatusBadRequest)
    w.Header().Add("Content-Type", "text/plain")
    w.Write([]byte(err.Error()))
    return nil
  }
    w.WriteHeader(http.StatusOK)
    w.Header().Add("Content-Type", "text/plain")
    w.Write([]byte(fmt.Sprintf("Hi,%s! \n", body)))
    return nil
}

func main() {
    fc.StartHttp(HandleHttpRequest)
}
            

次の内容では、サンプルコードのコードスニペットについて説明します。

  • パッケージメイン: メインパッケージ。 各Goアプリケーションにはメインパッケージが含まれています。

  • import: Function Computeの依存関係をインポートします。 次の依存関係をインポートする必要があります。

    • github.com/aliyun/fc-runtime-go-sdk/fc: Go用Function Compute SDKのコアライブラリ。

    • context: Function Compute SDK for Goのコンテキストオブジェクト。

    • net/http: HTTPハンドラーのHTTPパッケージでRequestメソッドとResponseWriterメソッドを提供します。

  • HandleHttpRequest(ctx context.Context, w http.ResponseWriter, req * http.Request) エラー: HTTPリクエストの処理に使用されるHTTPハンドラー。 ハンドラーには、実行するコードが含まれており、次のパラメーターが含まれます。

    • ctx context.Context: 関数が呼び出されたときのランタイムコンテキスト情報を提供します。 詳細は、「コンテキスト」をご参照ください。

    • w http.ResponseWriter: HTTPハンドラーの応答メソッド。 このメソッドを呼び出して、ステータスコード、レスポンスヘッダー、およびレスポンス本文を設定できます。 詳細については、「応答方法」をご参照ください。

    • req * http。 Request: HTTPハンドラーのリクエストメソッド。 このメソッドを呼び出して、リクエスト行、リクエストヘッダー、およびリクエスト本文を設定できます。 詳細については、「リクエスト構造体」をご参照ください。

    • w.WriteHeader(http.StatusOK): レスポンスのHTTPステータスコードを指定します。

    • w.Header() 。 追加 ("Content-Type", "text/plain"): レスポンスヘッダーを指定します。

    • w.Write([]byte(fmt.Sprintf) ("Hi,% s! \n ", body)): レスポンスの本文を指定します。

    • return nil: 単純なエラーメッセージを返します。 nilが返された場合、エラーは発生しません。 エラーメッセージが返されると、関数エラーが発生します。

  • func main(): function Computeで実行中の関数コードのエントリポイント。 Goアプリケーションにはmain関数が含まれている必要があります。 Function Computeでアプリケーションを実行するには、main() 関数のfc.StartHttp(HandleHttpRequest) 関数を呼び出します。

    重要

    HTTPハンドラーとイベントハンドラーの起動に使用されるメソッドは異なります。 イベントハンドラーを開始するには、main関数のfc. start関数を呼び出します。 HTTPハンドラーを開始するには、main関数のfc.StartHttp関数を呼び出します。

定義

GoのHTTPハンドラーは、Go標準ライブラリのHTTPリクエストのhandlerインターフェイスに基づいて定義されますが、追加のcontextパラメーターが含まれています。 HTTPハンドラーの構文:

function(ctx context.Context, w http.ResponseWriter, req *http.Request) error

HTTPハンドラーは、次の3つのオブジェクトで構成されます。

  • context: function Computeで関数が呼び出されたときのランタイムコンテキスト情報を提供します。 詳細は、「コンテキスト」をご参照ください。

  • http.Request: リクエスト構造体。 詳細については、「リクエスト構造体」をご参照ください。

  • http.ResponseWriter: 応答メソッド。 詳細については、「応答方法」をご参照ください。

リクエスト構造

http.Requestは、Go標準ライブラリで定義されているHTTPオブジェクトです。 http.Requestオブジェクトでサポートされているパラメーターを次の表に示します。

パラメーター

データ型

説明

方式

String

PUT、POST、DELETEなどのHTTPリクエストメソッド。

URL

* url.URL

リクエストのURL。

ヘッダー

http. ヘッダー

HTTPリクエストヘッダーのキーと値のペア。

本文

io.ReadCloser

リクエスト構造体。

ContentLength

Int64

リクエスト構造体のデータ長。

応答方法

次のサンプルコードは、http.ResponseWriterによって宣言された3つのメソッドを示しています。

type ResponseWriter interface {
    Header() Header
    Write([]byte) (int, error)
    WriteHeader(statusCode int)
}

注:

  • WriteHeader(statusCode int): ステータスコードを設定します。

  • Header() Header: レスポンスヘッダーを設定します。

  • Write([]byte) (int, error): レスポンスボディを設定します。

制限事項

  • リクエストの制限

    リクエストが次のいずれかの制限を超えると、システムはステータスコード400とエラーInvalidArgumentを返します。

    項目

    制限事項

    HTTPステータスコード

    エラーコード

    headers

    リクエストヘッダー内のすべてのキーと値の合計サイズは8 KBを超えることはできません。

    400

    InvalidArgument

    パス

    リクエストパスとクエリパラメーターの合計サイズは4 KBを超えることはできません。

    body

    同期呼び出し要求の本体の合計サイズは32 MBを超えることはできません。また、非同期呼び出し要求の本体の合計サイズは128 KBを超えることはできません。

  • 応答の制限

    応答が次のいずれかの制限を超えると、システムはステータスコード502とエラーBadResponseを返します。

    項目

    制限事項

    HTTPステータスコード

    エラーコード

    headers

    レスポンスヘッダー内のすべてのキーと値のペアの合計サイズは8 KBを超えることはできません。

    502

    BadResponse

    body

    同期呼び出し応答のボディの合計サイズは16 MBを超えることはできません。 非同期呼び出しレスポンスのボディの合計サイズは128 KBを超えることはできません。

背景

コンテキストの詳細については、「コンテキスト」をご参照ください。