HTTP请求处理程序(HTTP Handler)

您可以使用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包中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),您的程序即可运行在阿里云的函数计算平台。
    重要 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的详细使用方法,请参见上下文