您可以使用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
:需要引用函數計算依賴的包,主要包括以下包:github.com/aliyun/fc-runtime-go-sdk/fc
:函數計算Go語言的核心庫。context
:函數計算Go語言的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)
,您的程序即可運行在阿里云的函數計算平臺。重要 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的詳細使用方法,請參見上下文。
文檔內容是否對您有幫助?