在 Mulesoft 中,如何使用动态键值对为 HTTP Get 调用创建查询参数

问题描述

我们的要求是在 Mule 4 API 规范中传递动态查询参数。

示例:

http://host:port/fetch-process-api/api/v1/fapi/v1/fetchData?PROGRAM=SharkWeek&S1=E2&Author=David dobrik&scientist=Riley Elliott
http://host:port/fetch-process-api/api/v1/fapi/v1/fetchData?Shows=BestShowList&Year=2021

目前我们通过以下 URL 实现:

http://host:port/fetch-process-api/api/v1/fapi/v1/fetchData?propertyName=bookPrice&propertyValue=20.0&filter={"condition": "PROGRAM: SharkWeek"}&filter={"condition": "Author: David dobrik"}&filter={"condition": "Scientist: Riley Elliott"}

在转换中:

EmpFieldValue = attributes.queryParams.propertyValue,EmpFieldName = attributes.queryParams.propertyName,Filterarray = attributes.queryParams.*filter

感谢任何帮助

解决方法

我会做出一些假设来尝试回答。因为请求没有完全详细,我将使用一个通用示例来说明如何实现动态过滤。

假设我发送了一些过滤条件作为查询参数:

{
    filter : '{"condition": "PROGRAM: program1"}',filter : '{"condition": "Scientist: s2"}'
}

所以 HTTP 请求是:

GET /filter?filter=%7B%22condition%22%3A%20%22PROGRAM%3A%20program1%22%7D&filter=%7B%22condition%22%3A%20%22Scientist%3A%20s2%22%7D HTTP/1.1

我想从有效负载中过滤出与过滤器列表中的任何元素相匹配的元素。我看到的一个问题是条件本身不是标准格式,如 JSON,所以我使用字符串拆分函数来获取键和值。解析使用 HTTP POST 方法和带有过滤条件的完整 JSON 正文会更简单、更安全。

然后我使用 filter() 并且对于输入负载的每个元素,我将每个属性与过滤器列表的每个元素进行比较:

    <flow name="filterFlow">
        <http:listener doc:name="Listener" config-ref="HTTP_Listener_config" path="/filter"/>

        <ee:transform doc:name="Set test payload and create filters variable from query parameters">
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
[
    {
        PROGRAM: "program1",Scientist: "s1",Author: "Author1"
    },{
        PROGRAM: "program2",Scientist: "s2",Author: "Author2"
    },{
        PROGRAM: "program3",Scientist: "s3",Author: "Author3"
    }   
]]]></ee:set-payload>
            </ee:message>
            <ee:variables >
                <ee:set-variable variableName="filters" ><![CDATA[%dw 2.0
output application/java
---
 attributes.queryParams.*filter 
    map (read($,"application/json") 
        mapObject { 
                    key: ($ splitBy /\:\s/)[0],value: ($ splitBy /\:\s/)[1]
                    }
                )]]></ee:set-variable>
            </ee:variables>
        </ee:transform>

        <logger message="input=#[payload]"/>
        <logger message="vars.filters=#[vars.filters]"/>        
        
        <ee:transform doc:name="filter payload using filters variable">
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/java
import * from dw::core::Arrays
---
payload filter (value,index) -> (!(vars.filters some (value[$.key] == $.value)))  
]]></ee:set-payload>
            </ee:message>
        </ee:transform>

        <!-- do something with the filtered list -->

    </flow>

过滤后只剩下第三个元素。输出为:

[{PROGRAM=program3,Scientist=s3,Author=Author3}]