API网关支持的参数映射与校验逻辑API网关(APIGateway)

目前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:InvalidParameterRequried:...。

当此参数为可选且存在缺省值配置时,使用缺省值发送给后端

最小长度与最大长度的判断依据为大于等于最小长度和小于等于最大长度,可以单独设置,或同时设置,只有大于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会被过滤。

THE END
1.前端和后端的区别前端和后端有什么区别常见问题前端:代码在用户的浏览器中执行,主要在客户端运行。 后端:代码在服务器端执行,通常在服务器上部署和运行。 总的来说,前端主要关注用户界面和用户交互,而后端则负责处理数据和业务逻辑,二者相互配合构建完整的Web应用程序。 前端入门到VUE实战笔记:立即学习 ...https://m.php.cn/faq/713299.html
2.前端常见面试题vue优点:一次加载后,后面都是本地浏览器缓存,有点像客户端软件,交互快。 通过异步请求方式交互数据,有效的前后端分离,后端只关心接口处理, 减轻服务端的压力,展示和渲染都在前端浏览器完成。 后端的接口可以复用,通过json格式,可以在pc移动端都通用 缺点:首屏加载慢,很多资源都要第一次一次性加载完,容易白屏 ...https://www.jianshu.com/p/8522cfd5aee7
3.im由于历史原因,现在主流的 http 协议是无状态协议(HTTP2 暂时应用不广泛),一般情况是由客户端主动发起请求,然后服务端去响应。那么为了实现服务端向客户端推送信息,就需要前端主动向后端去轮询,这种方式低效且容易出错,在之前我们的管理端首页确实是这么做的(5s 一次)。 https://gitee.com/colala/im-server/
4.前端,后台,后端,前台他们区别是什么?小辣椒樱桃前台和后台都是在客户端或者浏览器上浏览者浏览的界面和管理者管理的界面 3.前端 这个是编程时候的概念,基本包括所有可见部分的代码编写,如果三层架构的话,可以看做是UI层. 4.后端 这个是对应前端而言的,编写的代码基本上都是提供给前端调用,而不需要处理UI的内容.例如逻辑层,或者存储过程. ...https://www.cnblogs.com/aaaazzzz/p/13023372.html
1.服务端和客户端以及前后端相关概念区分服务端和客户端到底是什么服务端和客户端以及前端和后端是两组相关但不完全相同的概念。 一、服务端(Server-side)和客户端(Client-side) 服务端和客户端是指在分布式系统或网络应用中相对的两个部分。是指在计算机网络中不同角色的两个主要实体。 服务端:服务端是指提供服务的计算机或服务器。它接受来自客户端的请求,并根据请求提供相应的...https://blog.csdn.net/m0_62006803/article/details/136151175
2.客户端服务端前台前端后端后台区别在哪?今天来聊一聊网站开发的基础知识:客户端、服务端、前端、前台、后端、后台之前有什么区别和联系。 首先是客户端、客户端也常被叫做用户端、顾名思义、就是用户使用的终端、例如你电脑上的QQ、微信、钉钉等软件、当然手机上也是一样、这些都是客户端(Client)。与之相对应的就是服务端了、服务端是为客户端提供数据...https://blog.51cto.com/u_11541173/5763222
3....也是奔波于各种面试。我自己总结了很多方向的前端面试题,服务器为了提高网站访问速度,对之前访问的部分页面指定缓存机制,当客户端在此对这些页面进行请求,服务器会根据缓存内容判断页面与之前是否相同,若相同便直接返回304,此时客户端调用缓存内容,不必进行二次下载。 状态码304不应该认为是一种错误,而是对客户端有缓存情况下服务端的一种响应。 https://juejin.cn/post/7149438206419664927
4.关于前端和后端:说一说前端路由与后端路由的区别后端路由与服务端渲染 前面说了,「刀耕火种」的年代里,网页通常是通过后端路由直出给客户端浏览器的。也就是网页的html一般是在后端服务器里通过模板引擎渲染好再交给前端的。至于一些其他的效果,是通过预先写在页面里的jQuery、Bootstrap等常见的前端框架去负责的。 https://maimai.cn/article/detail?fid=1749517863&efid=RknOuyXMMmiLjUJ7SWEFTg
5.三明市第一医院生态新城院区智慧医院智能化项目院区楼宇智能化...10、支持安全组服务,可以对进出虚拟机端口的网络报文进行安全过滤规则设置。虚拟机端口与安全组关联后,安全组规则可对进出虚拟机端口的网络报文进行过滤,只有规则允许的报文可通过。 11、支持对访问负载均衡的客户端IP进行白名单安全控制,如果使用访问控制能力,则只有被允许的IP能通过ELB访问后端云服务器/物理机;如果不...http://zfcg.cz.sm.gov.cn/upload/document/20221024/df8e2d7d2af449fbbe8f17d25733ff6d.html
6.全面讨论后端前端客户端的区别全面讨论 后端、前端、客户端的区别 帖子背景 楼主看到今年不少友友暑期实习都或多或少,被客户端岗位打捞起来面试;也有很多友友本来是投的后端,结果拿了客户端的offer,不知道改不改转客户端。 楼主之前在字节的CapCut做过半年的客户端开发实习生,对客户端有一个基本的了解,再加上后端楼主也实习过,所以两个方向...https://m.nowcoder.com/discuss/616306212254015488
7.后端测试和前端测试的区别后端测试和前端测试的区别 后端测试是对服务器端应用程序进行测试,例如 API 接口、数据库操作等。后端测试需要掌握服务器端编程语言(如 Java、Python、PHP 等)、数据库等相关技术,主要关注服务器端的逻辑、性能和安全性。 前端测试则是测试应用程序的客户端部分,即用户界面、页面布局、交互设计、功能实现等,需要掌握...https://www.hxsd.com/content/31353/
8.服务端开发和前端有什么区别前端 职位描述 1. 负责产品服务端模块的设计和开发 2. 负责产品服务端框架设计和开发 3. 负责服务器相关工具开发和维护 4. 负责深入优化服务端性能,保证系统服务端的质量和性能 5. 同策划及客户端人员进行有效沟通,分析、解决各种服务器的问题 职位要求 ...https://www.jobui.com/gangwei/pk/fuwuduankaifa-qianduan/
9.一口气说出前后端10种鉴权方案~腾讯云开发者社区Session-Cookie认证是利用服务端的Session(会话)和浏览器(客户端)的 Cookie 来实现的前后端通信认证模式。 在理解这句话之前我们先简单了解下什么是 Cookie以及什么是 Session? 2.1 什么是 Cookie 众所周知,HTTP 是无状态的协议(对于事务处理没有记忆能力,每次客户端和服务端会话完成时,服务端不会保存任何会话信息)...https://cloud.tencent.com/developer/article/2144184
10.服务端渲染(SSR)Vue.js然而,Vue 也支持将组件在服务端直接渲染成 HTML 字符串,作为服务端响应返回给浏览器,最后在浏览器端将静态的 HTML“激活”(hydrate) 为能够交互的客户端应用。 一个由服务端渲染的 Vue.js 应用也可以被认为是“同构的”(Isomorphic) 或“通用的”(Universal),因为应用的大部分代码同时运行在服务端和客户端。https://cn.vuejs.org/guide/scaling-up/ssr