【问题标题】:How to set path variables in camel-http4如何在camel-http4中设置路径变量
【发布时间】:2020-06-11 11:21:10
【问题描述】:

我有一个 camel-spring-boot 项目,我在其中使用 Spring 的 @ConfigurationProperties 从 yml 文件加载目标 url。由于我的目的地是 HTTP url,因此我使用的是 camel-http4 组件。

现在我的 URL 是 https://example.com/students/{id}/subject/{name},这意味着我必须将 id 和 name 参数作为路径变量(而不是查询参数)传递。我的问题是如何传递这些参数? [注意:我不能将 URL 放在 DSL 或 XML 中,它必须在 application.yml 中]

但是,作为一种解决方案

//in some processor before toD()
headers.put("id", id);
headers.put("name", name);

//in yml
destination: https4://example.com/students/${header.id}/subject/${header.name}

但是在从 yml 加载此属性时,Spring 尝试将 ${header.id} 评估为 Spel 表达式(并抛出找不到它的错误),正如我提到的那样,它是 Camel 的简单表达式。如果我使用 DSL,则相同的表达式适用于 toD(),但不适用于 yml。

请告诉我,我的方法是否正确?如果是这样,那我该如何摆脱这个问题。提前致谢。

【问题讨论】:

    标签: spring-boot apache-camel camel-http


    【解决方案1】:

    如果我没记错的话,由于缓存大小,我们应该注意使用动态路由。

    更清洁的解决方案可能是:

    YAML 文件:

    cfg:
      target:
        url: 'https4://example.com'
    

    Java DSL:

    Expression dynamicPathExpression = constant("students/")
        .append(header("id"))
        .append(constant("/subject/"))
        .append(header("name"));
    
    from("direct://whatever")
      .setHeader(Exchange.HTTP_PATH, dynamicPathExpression)
      .to("{{cfg.target.url}}");
    

    这对你有帮助吗?

    【讨论】:

    • 感谢您的帮助。我承认这是另一种方式,但我认为我们仍在以这种方式在 java 代码中硬编码“students”和“/subject/”。
    • 不错!但是...他们不是在您编写的 YAML 文件示例中硬编码吗?您可以用它们的键替换它们,甚至可以在您设置值的处理器中解决它们。我们实际上有很多方法可以解决这个问题。呵呵
    【解决方案2】:

    我得到了第二个问题的答案,即如何区分简单表达式和 Spel

    destination: https4://example.com/students/$simple{header.id}/subject/$simple{header.name}
    

    $simple{exp} 是 ${exp} 的另一种方式

    但我的第一个问题仍然存在,是否推荐使用路径变量调用 http 端点的方法?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-05
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      相关资源
      最近更新 更多