您可以使用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的详细使用方法,请参见上下文。
该文章对您有帮助吗?