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つのオブジェクトで構成されます。
リクエスト構造
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を超えることはできません。
背景
コンテキストの詳細については、「コンテキスト」をご参照ください。