【问题标题】:Use each element of var to make a http request in Mule使用 var 的每个元素在 Mule 中发出 http 请求
【发布时间】:2019-07-11 14:00:04
【问题描述】:

我有一组matches 保存到一个变量中。每个match 都有一个gameId。我想使用这个gameId 进行 API 调用。
我使用matches 为每个范围设置了一个counter var。

<set-variable value="#[payload]" doc:name="Set Matches" doc:id="bb1093b0-3dd9-4515-8f42-dd496f00477b" variableName="matches"/>
<set-variable value="#[[]]" doc:name="Deaths" doc:id="a7341e19-07f8-418d-b39a-5bc415e75fba" variableName="deaths"/>
<foreach doc:name="For each match" doc:id="506fa944-d46f-4684-9c75-73088265ca80" collection="vars.matches" rootMessageVariableName="matches">
    <http:request method="GET" doc:name="GetTimeline" doc:id="63708489-4d10-4e79-b5aa-c8fc723e80c6" config-ref="HTTP_Request_configuration" path="/match/v4/timelines/by-match/{matchId}">
        <http:uri-params ><![CDATA[#[output application/java
---
{
    "matchId" : vars.matches[vars.counter + 1].gameId
}]]]></http:uri-params>
    </http:request>
    <ee:transform doc:name="MapDeaths" doc:id="a6e22968-2229-4574-8cae-44225013b9cf">
        <ee:message>
            <ee:set-payload><![CDATA[%dw 2.0
output application/json
---
{
    frames: payload.frames map ( frame , indexOfFrame ) -> {
        events: frame.events map ( event , indexOfEvent ) -> vars.deaths + event
    }
}]]></ee:set-payload>
        </ee:message>
    </ee:transform>
</foreach>

然而,"matchId" : vars.matches[vars.counter + 1].gameId 中的 matchId 始终评估为 null。我在那里错过了什么?
编辑:
我正在使用 Mule 4.2,匹配的 json 结构如下所示:

[
  {
    "matches": [
      {
        "key": "val",
        "key": val,
        ...
      },
      {
        "key": "val",
        "key": val,
        ...
      },
      ...

【问题讨论】:

  • 你用的是哪个版本的Mule,建议3.8?
  • 我在流程中看到的是 Mule 4.x(DataWeave 2.0,vars)。 @彼得。请澄清分配给 vars.matches 的有效负载中的类型或对象是什么。
  • @Ven 我使用的是 4.2 版
  • 您是否尝试将{matchId} 设置为查询参数而不是路径?

标签: variables foreach scope payload mule4


【解决方案1】:

{matchId}设置为查询字符串参数并定义请求目标变量,在dataweave中使用

【讨论】:

    【解决方案2】:

    问题似乎是您的有效负载和您使用的表达式不匹配(双关语不是故意的)。有效负载是一个包含对象的数组,具有匹配属性。该表达式显然假定有效负载包含 match 属性,该属性包含 gameId 属性。这就是它返回 null 的原因。

    鉴于您没有显示 gameId 在您的示例中,因此意图也不清楚。

    让我们尝试一个更详细的示例。

    对于输入:

    [
      {
        "matches": [
          {
            "keyA": "val1",
            "keyB": "val2"
          },
          {
            "keyC": "val3",
            "keyD": "val4"
          }
        ]
      }
    ]
    

    表达式payload.matches.keyA 返回null

    您可以通过payload[0].matches[0].keyA 获取“val1”。

    这假设数据来自数组的第一个元素,并且您只想使用其中一个匹配项中的一个键。当然,如果您需要在不同的数组级别上进行迭代,您将需要使用 map 或 group,但这是一个不同的用例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-28
      • 2013-04-29
      • 2023-03-20
      • 2021-12-04
      • 1970-01-01
      相关资源
      最近更新 更多