您可以使用HTTP Handler更方便地處理HTTP請求。當調用函數時,FC運行您提供的執行方法來處理請求。本文介紹Go HTTP Handler的結構和特點。
使用樣本
在Go語言的代碼中,您需要引入官方的SDK庫aliyun/serverless/fc-runtime-go-sdk/fc
,並實現handler
函數和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)
}
樣本解析如下:
package main
: 在Go語言中,Go應用程式都包含一個名為main
的包。import
:需要引用Function Compute依賴的包,主要包括以下包:github.com/aliyun/fc-runtime-go-sdk/fc
:Function ComputeGo語言的核心庫。context
:Function ComputeGo語言的Context對象。net/http
:HTTP Handler中需要用到的HTTP包中Request和ResponseWriter介面。
HandleHttpRequest(ctx context.Context, w http.ResponseWriter, req *http.Request) error
:處理HTTP請求的方法(即HTTP Handler),需包含將要執行的代碼,參數含義如下:ctx context.Context
:提供了函數在調用時的運行上下文資訊,詳細資料,請參見上下文。w http.ResponseWriter
:HTTP Handler的響應介面,可以設定狀態行、訊息頭和響應本文。具體支援格式,請參見響應介面。req *http.Request
:HTTP Handler的請求介面,包含請求行、要求標頭和請求本文。具體方法,請參見請求結構體。w.WriteHeader(http.StatusOK)
:填入響應的HTTP狀態代碼。w.Header().Add("Content-Type", "text/plain")
:填入響應的訊息頭。w.Write([]byte(fmt.Sprintf("Hi,%s!\n", body)))
:填入響應的訊息體。return nil
:簡單的錯誤資訊,nil
表示沒有錯誤發生。如果設定了錯誤資訊,則認為是函數錯誤。
func main()
:運行FC函數代碼的進入點,Go程式必須包含main
函數。在main()
中調用fc.StartHttp(HandleHttpRequest)
,您的程式即可運行在阿里雲的Function Compute平台。重要 HTTP請求處理常式和事件請求處理常式的啟動方法不同。如果是事件請求處理常式,您需要在main
函數中調用fc.Start
函數。如果是HTTP請求處理常式,您需要在main
函數中調用fc.StartHttp
函數。
Handler
Go的HTTP Handler的定義,是參考Go標準庫HTTP中的Handler interface設計,並在此基礎上新增一個context
參數。定義如下:
function(ctx context.Context, w http.ResponseWriter, req *http.Request) error
函數定義中包含以下三部分內容:
請求結構體
http.Request
是Go標準庫HTTP中的定義,目前支援的參數和方法如下表所示。
參數 | 類型 | 描述 |
Method | String | HTTP要求方法,例如PUT、POST、DELETE等。 |
URL | *url.URL | 請求地址資訊。 |
Header | http.Header | HTTP要求標頭部的索引值對。 |
Body | io.ReadCloser | 請求結構體。 |
ContentLength | Int64 | 請求結構體資料長度。 |
響應介面
實現了http.ResponseWriter
聲明的三個方法,樣本如下:
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
path
請求路徑以及所有查詢參數的總大小不能超過4 KB。
body
同步調用請求的Body的總大小不能超過32 MB,非同步呼叫請求的Body的總大小不能超過128 KB。
響應限制
如果超過以下限制,會返回
502
狀態代碼和BadResponse
錯誤碼。欄位
限制說明
HTTP狀態代碼
錯誤碼
headers
回應標頭中的所有鍵和值對的大小不能超過8 KB。
502
BadResponse
body
同步調用響應的Body的總大小不能超過16 MB,非同步呼叫響應的Body的總大小不能超過128 KB。
Context
Context的詳細使用方法,請參見上下文。