目前API网关支持以下几种传输处理方式:
入参透传模式:API网关除Path位置的请求参数外,不对其他位置的请求参数进行映射与校验,用户参数会透明传递给后端,详细请阅读章节3。
入参映射(过滤未知参数)模式:API网关会根据用户配置的所有参数执行校验与映射,如果客户端传递了未在配置中的参数,参数将会被API网关过滤掉,不会转发给后端,详细请参考章节4。
入参映射(透传未知参数)模式:在此模式下,如果用户传递了未配置的参数,参数会被透传给后端,详细请参考章节5。
API网关支持从HTTP请求的各种位置上读取参数,以及API网关提供的系统参数与用户可配置的常量参数。
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]
无法匹配
-API网关对于不符合RFC3986的非法输入,直接返回错误码:I400PH:InvalidRequestPath-API网关支持的最大RequestUri长度为128KBytes,超过这个限制时会返回错误码:I413RL:RequestUrltooLarge
query参数为请求在QueryString中携带的参数,API网关会对请求QueryString通过=与&分割符进行键值对的拆分,并使用UTF-8编码做UrlDecode,对于a=和a均被认为是值等于空字符串''的合法值,如:
QueryString输入
a=1&b=2
a:"1",b:"2"
a=1&a=2
a:["1","2"];参数为非array类型时仅使用第一个值
a
a:""
a=
=a&b=1
b:"1";=a这个输入会被API网关忽略
*API网关对于不符合RFC3986的非法输入,直接返回错误码:I400PH:InvalidRequestPath
*API网关支持的最大RequestUri长度为128KBytes,超过这个限制时会返回错误码:I413RL:RequestUrltooLarge
formData参数为当请求的Content-Type为application/x-www-form-urlencoded时,消息体中携带的值。如果Content-Type没有指定charset=则网关会使用UTF-8编码,否则使用charset中指定的字符集来进行UrlDecode,对于Form的拆分与处理逻辑与QueryString中描述的处理方式一致。
当Content-Type为multipart/formdata时,网关支持进行文件类型参数。
header参数会从HTTP请求的头中读取,比如X-User:aaa会被解析为X-User=aaa,特殊规则如下
Header值中包含的前后空格会被截取掉
如果存在多个重名Header且参数类型被配置为ARRAY则参数会被解析为数组,否则只取第一个值
API网关使用ISO-8859-1编码读取和转发Header,非法字符会导致乱码或其他非预期的结果
host参数仅在用户绑定了泛域名和有效的泛域名模板时才有效,例如:绑定泛域名*.api.foo.com且配置了泛域名模板${user}.api.foo.com,则当收到请求1234.api.foo.com时,会读取到host参数user=1234,用户可以配置多个泛域名模板,API网关会使用第一个匹配到的记录来解析host参数,如果没有记录,则不会读取到host参数,具体例子如下
泛域名模板配置
请求Host
${User}.api.io
123.api.io
User:"123"
${User}.${Group}.api.io
123.g01.api.io
User:"123"Group:"g01"
${Admin}.admin.api.io${User}.${Group}.api.io.
${Admin}.admin.api.io${User}.${Group}.api.io
123.admin.api.io
Admin:"123"
123.u00.api.io
User:"123"GroupId:"u00"
${User}.${Group}.api.io${Admin}.admin.api.io
User:"123"Group:"admin"
在最后一个例子中,因为第一条记录就已经命中匹配了,所以忽略后面的所有记录。
透传模式支持以下方法:GET、PUT、POST、DELETE、PATCH、HEAD、OPTIONS
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.HttpHeader处理规则”
Body:包体会透明转发给后端,如果用户在API配置中设置了自定义Content-Type,则使用设置的Content-Type,否则转发客户端提供的Content-Type头
StatusCode:透传来自后端应答的错误码
Header:API网关会过滤或添加一些系统Header和名字以X-Ca-起始的保留Header,透传来自后端应答的其他Header,详细参考章节6.HttpHeader处理规则
Body:API网关会将来自后端服务应答的包体转发给客户端,后端应答的Content-Type为空,则补充一个默认值:application/oct-stream
API网关会根据用户配置的所有参数执行校验与映射,如果客户端传递了未在配置中的参数,参数将会被API网关过滤掉,不会转发给后端,如果您希望网关转发未配置参数给后端,请参考章节5。在参数映射模式下,API网关可以支持query,header,host,path,formData位置下的参数,并进行参数值的类型判断、校验,并进行向后端的映射。
API网关目前支持以下参数类型
类型
类型说明
格式支持
可选校验方式
String
字符串
不限
最小长度、最大长度、枚举值、正则
Integer
32位整数
1,-1,100
最小值,最大值,枚举值
Long
64位整数
-1233,1001
Double
浮点数
100,0.1,9E-9,1.01E16
最小值,最大值
Boolean
布尔值
true,false;(忽略大小写)
File
文件类型
仅用于multipart/form-data
最小长度、最大长度
Array
数组类型
参考数组字段类型
数组字段类型上的校验
Float类型与Double类型在处理标准与过程一致,不再单独列出。
参数校验可通过控制台、OpenAPI或导入Swagger的方式设置,设置方式与含义如下
名称
说明
OpenAPI的字段
Swagger中的字段
参数名
必选,API内唯一
ApiParameterName
name
参数位置
必选
Location
location
参数类型
可选,默认类型为String
ParameterType
type
数组参数类型
可选,参数类型为Array时,指定数组字段类型
ArrayItemsType
items.type
是否必填
可选,默认为否
Required
required
默认值
可选,空字符串''不是有效的默认值.
DefaultValue
default
最大值
可选,输入值必须小于等于最大值
MaxValue
maximum
最小值
可选,输入值必须大于等于最小值
MinValue
minimum
最大长度
可选,仅对String类型有效
MaxLength
maxLength
最小长度
MinLength
minLength
正则表达式
RegularExpression
pattern
枚举值
可选
EnumValue
enum
参数校验的一些匹配规则:
OpenAPi与Swagger对参数类型的取值定义不同,本节的描述参考Swagger标准
如果不设置参数类型,默认的类型为String
如果参数类型的输入格式与当前类型的支持格式不符,会报错误码:I400IPInvalidParameter:...
如果参数设置为了必选,如果客户端的请求中不传递,网关会阻拦这个请求,并报错误码:I400MPInvalidParameterRequried:...
可选参数可以配置缺省值,当客户端不传递这个参数时,使用配置的缺省值传递给后端,但API网关不认为空字符串:''是合法的缺省值,网关不会将配置为空字符串的缺省值传给后端。
当参数处于query,formData位置时,对于形如a或a=格式的输入,如b=1&a,API网关认为输入参数为空字符串''
此时如果参数设置必选,不报错
如果参数设置为可选且配置了缺省值,网关将不使用缺省值,将空串传递给后端
当参数类型为Integer,Long,Float,Double值时,如果输入为空字符串'',则认为此参数没有传递,
当此参数为必选时,网关会阻拦这个请求,并报错误码400:
当此参数为可选且存在缺省值配置时,使用缺省值发送给后端
最小长度与最大长度的判断依据为大于等于最小长度和小于等于最大长度,可以单独设置,或同时设置,只有大于0的配置才会生效
正则表达式的最大允许长度为40个字符,
字符串类型和数字类型均可以使用枚举设置,使用逗号分隔:比如江,河,湖,海,如果输入值不在列表中,会报错误码:I400IP:InvalidParameter:...
如果参数类型设置为ARRAY数组类型,只有query,formData,header三个位置的参数支持数组格式,数组参数的校验规则对可以对每个数组元素生效,类型由数组参数类型字段指定,默认为字符串
用户可以设置参数的后端位置与后端名称,API网关会在发送请求给后端服务时,进行参数位置与名称的转换
API网关的参数类型仅用于校验,不会变更传递到后端的形式,如Double类型的参数如果输入为a=1不会被更改为a=1.0,
参数类型为ARRAY时,后端位置只能为query,formData,header,发送给后端时使用会多个参数或多个Header的方式,如a=1&a=2,不使用a=1,2的方式
传递给后端的QueryString会使用UTF-8编码的URLEncode进行重新组装
如果参数中包含了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编码进行转换和发送
入参映射(透传未知参数)模式与入参映射(过滤未知参数)模式的校验与处理机制一致,区别在于透传未知参数模式下,请求中的未知参数会在原位置上透传给后端,而过滤未知参数模式下,未知参数会被过滤掉。
一般来讲,所有以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
User-Agent
透传或添加网关UserAgent
Server
所有标记为重建的Header不会透传,网关会重新添加为网关设置的值。
未在表中出现的Header如果客户端请求为透传模式,则将请求头透传给后端,如果为映射模式,则除默认的HttpHeader外,其余的Header会被过滤。