全部產品
Search
文件中心

Function Compute:HTTP請求處理常式(HTTP Handler)

更新時間:Jul 06, 2024

您可以使用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/fcFunction ComputeGo語言的核心庫。
    • contextFunction ComputeGo語言的Context對象。
    • net/http:HTTP Handler中需要用到的HTTP包中RequestResponseWriter介面。
  • 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

函數定義中包含以下三部分內容:

  • context:為您的FC函數調用提供運行時資訊。更多資訊,請參見上下文
  • http.Request:請求結構體。詳細資料,請參見請求結構體
  • http.ResponseWriter:響應介面。詳細資料,請參見響應介面

請求結構體

http.Request是Go標準庫HTTP中的定義,目前支援的參數和方法如下表所示。

參數類型描述
MethodStringHTTP要求方法,例如PUT、POST、DELETE等。
URL*url.URL請求地址資訊。
Headerhttp.HeaderHTTP要求標頭部的索引值對。
Bodyio.ReadCloser請求結構體。
ContentLengthInt64請求結構體資料長度。

響應介面

實現了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的詳細使用方法,請參見上下文