API网关管理
[TOC]
# 总体介绍
req阶段是生命周期的第1步,可配置的内容较多,将来还会扩充很多插件功能。

req阶段主要完成以下功能:
**1.请求参数定义**
**2.黑白名单策略**
**3.redis缓存配置**
# 1. 请求参数定义
##1.1 定义访问方式

在字段不多,且字段字符长度较短的情况下,可以GET和POST一起用,但如果需要传入长字段值(比如文本比对,要传两个长文本),则一定要单选POST方式,因为GET传输时,URL的的长度是有限制的。
##1.2 定义请求参数
> 如果请在求参数中没有定义某个key,则此key不会被易源转发到服务后端。比如说在请求参数中定义了name,age两个参数,但是客户端提交了name,age,type三个参数,那么type参数不会被转发到后端。
###1.2.1 参数名称

定义客户传输时的字段名称。比如上图中定义了一个my_para字段,在客户端传输时,应该这样:
```html
<form>
<input type="text" name="my_para">
</form>
```
###1.2.2 类型

目前支持String、Number、List、Object、Boolean、File六种输入类型。
String、Number是最常用的类型。
#### String 类型
这是默认类型。实际上客户提交上来的所有字段原始值都是String值,到了易源后,易源会根据指定的数据类型将这个String做类型转换。
#### Number 类型
易源把传入的字符串转为Number数字类型。比如传递http://xxx.com/?myage=1 ,虽然易源收到的是字符串"1",但在易源内部会把其转换为数字1对待,这样会有很多便利之处,比如数字大小约束、在lua代码中的数字判断等。
#### Object 类型
Object类型表示传入的字段值必须符合json的标准。关于json的定义可以查看此链接 http://www.json.org/
json 就是形如这样的数据:
```json
{"name":"张三"}
```
#### List 类型
List类型表示传入的字段值必须符合json array的标准。关于json的定义可以查看此链接 http://www.json.org/
json array就是形如这样的数据:
```json
[
{"name":"张三"},
{"age":25},
]
```
#### Boolea 类型
布尔类型比较好理解,就是传入串必须是true或false 。
#### File 类型
表明此字段是上传文件字段。假如定义了一个image的File字段,则表单提交时是类似这样的:
```html
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="image">
<button type="submit">上传</button>
</form>
<!--注意里面的 type="file"-->
```
###1.2.3 【必填】选项
如果此项打上勾,表明此字段必须传值,传空字符串也行,总之必须输入此字段。
###1.2.4 【默认值】选项
如果此字段为可选&&没有传此字段值时,那么此值为默认值。用伪代码表达就是:
```java
def value=params.key
if (key为可选&&value==null){
value=默认值
}
```
###1.2.5 示例值
示例值是在接口显示时,默认填写在表单中的值,如下图:

###1.2.6 常量值

###1.2.7 传入位置

可以定义三种传入位置:
1. header
2. url
3. post的body
传入的值可以在下一阶段【req阶段】中进行映射和变换位置。
###1.2.8 字段高级约束

高级约束可以为字段实现前置约束,在数据把转发到后端服务前,把不符合规范的请求拦截下来。
点击如下图中的按钮:

#### 字符串约束

#### 数字约束

#### 枚举约束

##1.2.9 删除字段
删除某个字段定义,此操作需谨慎。
# 2. 黑白名单策略
用于控制调用方IP的进入(白名单)或阻挡(黑名单)。

如果确认使用,不要忘记【启用】选项。
# 3. redis缓存
假设我们的输入参数是这样的:

有三个输入参数my_para、age和type,但返回值的时间性并不强,因此后端服务没必要每次都根据三个参数去查一次数据库,那就可以把它们三者做成一个key,把返回值做成value放到缓存中。
我们把key值用mustache语法写为:
```java
{{my_para}}_{{age}}_{{type}}
```
如下图:

> 缓存中无值时, 请求才会穿透到后面的proxy, balance流程。如果返回值是一个非null的json对象, 则其会被放入Redis缓存, 在这里设置的就是它的超时时间。
在没有配置redis,或是redis没有命中时,请求生命周期是这样的:

也就是六个阶段都穿透了,但如果redis中有值,则请求会是这样的:

请求只经过了req和req_response就结束了,不到后端,因此您的服务器收不到请求,也就大大减经了压力。