您可以使用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的详细使用方法,请参见上下文。