Mule 4搭配APIKit自定义查询及结果集返回字段筛选实现问询
Mule 4 API 新增返回字段筛选能力实现步骤
1. 修改RAML接口定义
新增显式的query和filter查询参数,替换原有的全量queryString隐式配置,示例配置如下:
/customers: get: queryParameters: query: type: string required: false example: "Country=US" filter: type: string required: false example: "FIRSTNAME,LASTNAME" responses: 200: body: application/json:
该配置可让APIKit自动完成参数合法性校验,也符合接口显式定义的规范。
2. 调整查询参数提取配置
替换原有直接提取全量queryString的set-variable配置,拆分提取query和filter两个独立变量,避免filter参数混入后端查询条件:
<!-- 提取后端查询条件参数 --> <set-variable value='#[attributes.queryParams.query default "" replace /([\\"'])/ with ("")]' doc:name="queryString" doc:id="79fcfb07-7947-4011-8ed4-ef8c6e28cdd4" variableName="queryString" /> <!-- 提取返回字段筛选参数 --> <set-variable value='#[attributes.queryParams.filter default "" replace /([\\"'])/ with ("")]' doc:name="selectFields" doc:id="a2d3f7b9-1e8c-4d5a-9c3e-7b2d8f9a1c3e" variableName="selectFields" />
如果需要兼容原有无显式query参数的历史调用(比如?CustomerId=100格式),可以将queryString的取值逻辑替换为:
#[if (attributes.queryParams.query? ) attributes.queryParams.query replace /([\\"'])/ with ("") else (attributes.queryParams filterObject ($$ as String != "filter") pluck ($$ as String ++ "=" ++ $) joinBy "&")]
3. 修改DataWeave转换逻辑
将原来写死的fields: "*"调整为动态判断逻辑,优先使用调用方传入的filter参数,没有传入时保持默认返回全量字段:
%dw 2.0 output application/xml inlineCloseOn="empty", skipNullOn = "everywhere" --- { content: { function @(controlid: uuid()): { readByQuery: { fields: if (vars.selectFields != "") vars.selectFields else "*", query: vars.queryString default "" } } } }
4. 效果验证
- 新格式调用:请求
{{systemlayerapi}}:{{port}}/api/customers?query=Country=US&filter=FIRSTNAME,LASTNAME,后端只会返回指定的两个字段,查询条件仅为Country=US - 历史调用兼容:不带filter参数的原有请求逻辑完全不变,不会影响已接入的调用方
内容的提问来源于stack exchange,提问作者aplane1290
相关产品推荐
相关产品推荐

