您可以使用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 请求头中的所有键和值的总大小不能超过4 KB。 400 InvalidArgument path 请求路径以及所有查询参数的总大小不能超过4 KB。 body 同步调用请求的Body的总大小不能超过16 MB,异步调用请求的Body的总大小不能超过128 KB。 - 响应限制
如果超过以下限制,会返回
502
状态码和BadResponse
错误码。字段 限制说明 HTTP状态码 错误码 headers 响应头中的所有键和值对的大小不能超过4 KB。 502 BadResponse body 同步调用响应的Body的总大小不能超过16 MB,异步调用响应的Body的总大小不能超过128 KB。
Context
Context的详细使用方法,请参见上下文。