1. 概述
API网关支持参数映射与校验逻辑,本篇文档描述了API网关对转发客户端发起的HTTP请求到HTTP后端服务,以及转发后端服务的HTTP应答到客户端的处理规则,后端为阿里云函数计算的用户请参考函数计算。
目前API网关支持以下几种传输处理方式:
入参透传模式:API网关除
Path
位置的请求参数外,不对其他位置的请求参数进行映射与校验,用户参数会透明传递给后端,详细请阅读章节3
。入参映射(过滤未知参数)模式:API网关会根据用户配置的所有参数执行校验与映射,如果客户端传递了未在配置中的参数,参数将会被API网关过滤掉,不会转发给后端,详细请参考
章节4
。入参映射(透传未知参数)模式:在此模式下,如果用户传递了未配置的参数,参数会被透传给后端,详细请参考
章节5
。
2. 参数位置与读取规则
API网关支持从HTTP请求
的各种位置上读取参数,以及API网关提供的系统参数
与用户可配置的常量参数
。
2.1. path
参数
API网关支持从HTTP请求
的分段路径中提取参数的能力,使用path
参数,需要首先将API的请求路径配置为/path/[parameter]
的格式,API网关会使用参数路径方式去匹配HTTP
请求中的路径,请参考如下的例子:
请求路径配置 | 输入 | 参数提取结果 |
/request/to/[path] | /request/to/user1 | path=user1 |
/[path1]/[path2]. | /group1/user1 | path1=group1, path2=user1 |
/[root]/* | /root/user1 | root=root |
/[root] | /root/user1 | 无法匹配 |
- API网关对于不符合RFC3986的非法输入,直接返回错误码:I400PH: Invalid Request Path
- API网关支持的最大RequestUri长度为128KBytes, 超过这个限制时会返回错误码:I413RL: Request Url too Large
2.2. query
参数
query
参数为请求在QueryString
中携带的参数,API网关会对请求QueryString
通过=
与&
分割符进行键值对的拆分,并使用UTF-8
编码做Url Decode,对于?a=
和?a
均被认为是值等于空字符串''
的合法值,如:
QueryString输入 | 参数提取结果 |
?a=1&b=2 | a: "1", b: "2" |
?a=1&a=2 | a: ["1", "2"] ; 参数为非 |
?a | a: "" |
?a= | a: "" |
?=a&b=1 | b: "1" ; |
*API网关对于不符合RFC3986的非法输入,直接返回
错误码:I400PH: Invalid Request Path
*API网关支持的最大RequestUri长度为128KBytes, 超过这个限制时会返回
错误码:I413RL: Request Url too Large
2.3. formData
参数
formData
参数为当请求的Content-Type
为application/x-www-form-urlencoded
时,消息体中携带的值。如果Content-Type
没有指定charset=
则网关会使用UTF-8
编码,否则使用charset
中指定的字符集来进行Url Decode,对于Form的拆分与处理逻辑与QueryString
中描述的处理方式一致。
当Content-Type
为multipart/formdata
时,网关支持进行文件类型参数。
2.4. header
参数
header
参数会从HTTP请求的头中读取,比如X-User: aaa
会被解析为X-User
=aaa
,特殊规则如下
Header值中包含的前后空格会被截取掉
如果存在多个重名Header且参数类型被配置为
ARRAY
则参数会被解析为数组,否则只取第一个值API网关使用
ISO-8859-1
编码读取和转发Header,非法字符会导致乱码或其他非预期的结果
2.5. host
参数
host
参数仅在用户绑定了泛域名和有效的泛域名模板时才有效,例如:绑定泛域名*.api.foo.com
且配置了泛域名模板${user}.api.foo.com
,则当收到请求1234.api.foo.com
时,会读取到host
参数user
=1234
,用户可以配置多个泛域名模板,API网关会使用第一个匹配到的记录来解析host
参数,如果没有记录,则不会读取到host
参数,具体例子如下
泛域名模板配置 | 请求Host | 参数提取结果 |
| 123.api.io | User: "123" |
| 123.g01.api.io | User: "123" Group: "g01" |
| 123.api.io | User: "123" |
| 123.admin.api.io | Admin: "123" |
| 123.u00.api.io | User: "123"GroupId: "u00" |
| 123.admin.api.io | User: "123"Group: "admin" |
在最后一个例子中,因为第一条记录就已经命中匹配了,所以忽略后面的所有记录。
3. 入参透传模式
透传模式支持以下方法: GET
、PUT
、POST
、DELETE
、PATCH
、HEAD
、OPTIONS
3.1. 转发客户端请求
到后端服务
在透传模式下,API网关在处理签名和授权后,会将请求透明传输给后端,对于不同位置的透传规则如下
Path: 当用户将API的请求路径配置为
/path/to/[user]
的格式时,可以同时配置/path/backend/[user]
到后端服务路径上,API网关会识别前端路径参数并将其映射到后端服务路径上QueryString: 透明传输给后端,保持原始接收到的QueryString的顺序与格式
Header: 除一些系统头和以
X-Ca-
开头的Header
以外,网关会透传其余的Header给后端,API网关会使用ISO-8859-1
编码读取和转发Header
,所以如果你在Header中传递了非法的编码,可能会收到非预期的结果,对于系统以及API网关保留Header
的处理逻辑,请参考“章节6.Http Header处理规则”Body: 包体会透明转发给后端,如果用户在API配置中设置了自定义
Content-Type
,则使用设置的Content-Type
,否则转发客户端提供的Content-Type
头
3.2. 转发后端应答
给客户端
在透传模式下,如果后端成功返回应答,API网关会将来自后端服务
的HTTP应答
转发给客户端
,如果在处理过程中失败了,由API网关生成错误码,错误处理请参考错误代码表,透传规则如下
StatusCode: 透传来自后端应答的错误码
Header: API网关会过滤或添加一些
系统Header
和名字以X-Ca-
起始的保留Header
,透传来自后端应答的其他Header,详细参考章节6. Http Header处理规则
Body: API网关会将来自后端服务应答的包体转发给客户端,后端应答的
Content-Type
为空,则补充一个默认值:application/oct-stream
可以通过使用错误码映射插件,来改写客户端的应答码。
4. 入参映射(过滤未知参数)模式
API网关会根据用户配置的所有参数执行校验与映射,如果客户端传递了未在配置中的参数,参数将会被API网关过滤掉,不会转发给后端,如果您希望网关转发未配置参数给后端,请参考章节5
。在参数映射模式下,API网关可以支持query
,header
,host
,path
,formData
位置下的参数,并进行参数值的类型判断、校验,并进行向后端的映射。
4.1. 参数类型
API网关目前支持以下参数类型
类型 | 类型说明 | 格式支持 | 可选校验方式 |
String | 字符串 | 不限 | 最小长度、最大长度、枚举值、正则 |
Integer | 32位整数 |
| 最小值,最大值,枚举值 |
Long | 64位整数 |
| 最小值,最大值,枚举值 |
Double | 浮点数 |
| 最小值,最大值 |
Boolean | 布尔值 |
| |
File | 文件类型 | 仅用于 | 最小长度、最大长度 |
Array | 数组类型 | 参考数组字段类型 | 数组字段类型上的校验 |
Float类型与Double类型在处理标准与过程一致,不再单独列出。
4.2. 参数校验配置
参数校验可通过
控制台
、OpenAPI
或导入Swagger
的方式设置,设置方式与含义如下
名称 | 说明 | OpenAPI的字段 | Swagger中的字段 |
参数名 | 必选,API内唯一 | ApiParameterName | name |
参数位置 | 必选 | Location | location |
参数类型 | 可选,默认类型为 | ParameterType | type |
数组参数类型 | 可选,参数类型为 | ArrayItemsType | items.type |
是否必填 | 可选,默认为 | Required | required |
默认值 | 可选,空字符串 | DefaultValue | default |
最大值 | 可选,输入值必须 | MaxValue | maximum |
最小值 | 可选,输入值必须 | MinValue | minimum |
最大长度 | 可选,仅对 | MaxLength | maxLength |
最小长度 | 可选,仅对 | MinLength | minLength |
正则表达式 | 可选,仅对 | RegularExpression | pattern |
枚举值 | 可选 | EnumValue | enum |
OpenAPI的参数配置参考:创建API->RequestParameter
Swagger参数配置参考:通过导入Swagger创建API
参数校验的一些匹配规则:
OpenAPi与Swagger对参数类型的取值定义不同,本节的描述参考
Swagger
标准如果不设置参数类型,默认的类型为
String
如果参数类型的输入格式与当前类型的支持格式不符,会报错误码:
I400IP Invalid Parameter :
...如果参数设置为了必选,如果客户端的请求中不传递,网关会阻拦这个请求,并报错误码:
I400MP Invalid Parameter Requried:
...可选参数可以配置缺省值,当客户端不传递这个参数时,使用配置的缺省值传递给后端,但API网关不认为
空字符串: ''
是合法的缺省值,网关不会将配置为空字符串的缺省值传给后端。当参数处于
query
,formData
位置时,对于形如a
或a=
格式的输入,如?b=1&a
,API网关认为输入参数为空字符串''
此时如果参数设置必选,不报错
如果参数设置为可选且配置了缺省值,网关将不使用缺省值,将空串传递给后端
当参数类型为
Integer
,Long
,Float
,Double
值时,如果输入为空字符串''
,则认为此参数没有传递,当此参数为必选时,网关会阻拦这个请求,并报错误码
400: <I400MP> Invalid Parameter Requried: ...
。当此参数为可选且存在缺省值配置时,使用缺省值发送给后端
最小长度与最大长度的判断依据为
大于等于
最小长度和小于等于
最大长度,可以单独设置,或同时设置,只有大于0
的配置才会生效正则表达式的最大允许长度为40个字符,
字符串类型和数字类型均可以使用
枚举
设置,使用逗号分隔:比如江,河,湖,海
,如果输入值不在列表中,会报错误码:I400IP: Invalid Parameter :
...如果参数类型设置为
ARRAY
数组类型,只有query
,formData
,header
三个位置的参数支持数组格式,数组参数的校验规则对可以对每个数组元素生效,类型由数组参数类型字段指定,默认为字符串
4.3. 后端参数映射规则
用户可以设置参数的
后端位置
与后端名称
,API网关会在发送请求给后端服务时,进行参数位置与名称的转换API网关的参数类型仅用于校验,不会变更传递到后端的形式,如Double类型的参数如果输入为
a=1
不会被更改为a=1.0
,参数类型为
ARRAY
时,后端位置只能为query
,formData
,header
,发送给后端时使用会多个参数或多个Header的方式,如a=1&a=2
, 不使用a=1,2
的方式传递给后端的QueryString会使用
UTF-8编码的URL Encode
进行重新组装如果参数中包含了Form参数时,会使用
application/x-www-form-urlencoded; charset=utf-8
或multipart/formdata; charset=utf-8
作为包体格式发送给后端如果参数中包含
File
类型,会使用multipart/formdata; charset=utf-8
进行组装,否则使用application/x-www-form-urlencoded; charset=utf-8
进行组装如果用户在API定义的后端服务部分,设置了自定义
Content-Type
,则会以用户的Content-Type发给后端,如果用户自定义的Content-Type
形式属于application/x-www-form-urlencoded; charset=???
或multipart/formdata; charset=???
形式,则使用自定义中描述的Encoding进行组装,对于其他的Content-Type,不进行编码的特殊处理
当转发的参数处于
header
位置时,网关会使用ISO8859-1
编码进行转换和发送
4.4. 转发后端应答
给客户端
在映射模式下,如果后端成功返回应答,API网关会将来自后端服务
的HTTP应答
转发给客户端
,如果在处理过程中失败了,由API网关生成错误码,错误处理请参考API网关异常处理,透传规则如下
StatusCode: 透传来自后端应答的错误码
Header: API网关会过滤或添加一些
系统Header
和名字以X-Ca-
起始的保留Header
,透传来自后端应答的其他Header,详细参考章节6. Http Header处理规则Body: API网关会将来自后端服务应答的包体转发给客户端,后端应答的
Content-Type
为空,则补充一个默认值:application/oct-stream
可以通过使用错误码映射插件,来改写客户端的应答码。
5. 入参映射(透传未知参数)模式
入参映射(透传未知参数)模式与入参映射(过滤未知参数)模式的校验与处理机制一致,区别在于透传未知参数模式下,请求中的未知参数会在原位置上透传给后端,而过滤未知参数模式下,未知参数会被过滤掉。
6. Http Header处理规则
一般来讲,所有以X-Ca-
开头的Header均为API网关保留Header, API网关会对X-Ca-
的Header做特殊处理,请不要在您的业务中使用X-Ca-
开头的头,否则会导致头被过滤,或产生未预期的行为。
HeaderName | 请求处理方式 | 应答处理方式 |
Connection | 重建 | 重建 |
Keep-Alive | 重建 | 重建 |
Proxy-Authenticate | 重建 | 重建 |
Proxy-Authorization | 重建 | 重建 |
Trailer | 重建 | 重建 |
TE | 重建 | 重建 |
Transfer-Encoding | 重建 | 重建 |
Upgrade | 重建 | 重建 |
Host | 重建 | |
Authorization | 校验、映射或透传(当后端服务是HTTP函数时,会被HTTP函数的Authorization覆盖) | |
Date | 透传或添加默认 | |
Content-Type | 映射或透传 | 透传或添加默认 |
Content-Length | 映射或透传 | |
Content-MD5 | 校验并透传 | |
Via | 添加网关记录 | |
X-Forwarded-For | 在右侧添加客户端IP | |
X-Forwarded-Proto | 添加客户端请求协议:'http',https','ws','wss' | |
User-Agent | 透传或添加网关UserAgent | |
Server | 透传或添加默认 |
所有标记为重建的Header不会透传,网关会重新添加为网关设置的值。
未在表中出现的Header如果客户端请求为透传模式,则将请求头透传给后端,如果为映射模式,则除默认的HttpHeader外,其余的Header会被过滤。
未在表中出现的应答的Header默认均透传给客户端。