You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WSO2 EI中Call Mediator动态URL引发MalformedUriTemplateException问题

问题解决:WSO2 EI中Call Mediator URI模板使用get-property报错

错误原因

你遇到的com.damnhandy.uri.template.MalformedUriTemplateException是因为URI模板的变量语法不支持直接嵌套get-property()函数调用。URI模板里的{}只能包含简单的变量名,不能带函数或特殊字符(比如括号、单引号),解析器会把get-property('default当成变量名,识别到无效字符后触发报错。

修复方案

两种常用修复方式,任选其一即可:

方案1:直接引用预定义的URL变量(推荐)

既然你已经通过tokenRequestUrl生成了完整请求地址,直接在URI模板里引用这个变量名即可,不需要嵌套函数:

<iterate expression="json-eval($)">
<target>
<sequence>
<log level="custom">
<property expression="json-eval($.tokenEndpoint)" name="tokenEndpoint"/>
</log>
<!-- Extract API Credentials -->
<property expression="json-eval($.tokenEndpoint)" name="TokenEndpoint" scope="default" type="STRING"/>
<property expression="json-eval($.client_id)" name="client_id" scope="default" type="STRING"/>
<property expression="json-eval($.client_secret)" name="client_secret" scope="default" type="STRING"/>
<property expression="concat(get-property('TokenEndpoint'), '?client_id=', get-property('client_id'), '&amp;client_secret=', get-property('client_secret'))" name="tokenRequestUrl" scope="default" type="STRING"/>
<log level="full">
<property expression="get-property('tokenRequestUrl')" name="Final Token Request URL"/>
</log>
<!-- Call API - 直接引用变量名 -->
<call>
    <endpoint>
        <http method="GET" uri-template="{tokenRequestUrl}">
         <suspendOnFailure>
        <initialDuration>-1</initialDuration>
        <progressionFactor>-1</progressionFactor>
        <maximumDuration>0</maximumDuration>
        </suspendOnFailure>
        <markForSuspension>
        <retriesBeforeSuspension>0</retriesBeforeSuspension>
        </markForSuspension>
        </http>
    </endpoint>
</call>
</sequence>
</target>
</iterate>

方案2:使用TRANSPORT_URL属性指定地址

通过设置axis2作用域的TRANSPORT_URL属性,直接指定请求地址,无需URI模板:

<iterate expression="json-eval($)">
<target>
<sequence>
<log level="custom">
<property expression="json-eval($.tokenEndpoint)" name="tokenEndpoint"/>
</log>
<!-- Extract API Credentials -->
<property expression="json-eval($.tokenEndpoint)" name="TokenEndpoint" scope="default" type="STRING"/>
<property expression="json-eval($.client_id)" name="client_id" scope="default" type="STRING"/>
<property expression="json-eval($.client_secret)" name="client_secret" scope="default" type="STRING"/>
<property expression="concat(get-property('TokenEndpoint'), '?client_id=', get-property('client_id'), '&amp;client_secret=', get-property('client_secret'))" name="tokenRequestUrl" scope="default" type="STRING"/>
<log level="full">
<property expression="get-property('tokenRequestUrl')" name="Final Token Request URL"/>
</log>
<!-- 设置TRANSPORT_URL -->
<property name="TRANSPORT_URL" expression="get-property('tokenRequestUrl')" scope="axis2"/>
<!-- Call API -->
<call>
    <endpoint>
        <http method="GET">
         <suspendOnFailure>
        <initialDuration>-1</initialDuration>
        <progressionFactor>-1</progressionFactor>
        <maximumDuration>0</maximumDuration>
        </suspendOnFailure>
        <markForSuspension>
        <retriesBeforeSuspension>0</retriesBeforeSuspension>
        </markForSuspension>
        </http>
    </endpoint>
</call>
</sequence>
</target>
</iterate>

额外提示

多数OAuth2令牌请求要求使用POST方法并传递表单参数,而非GET方式的URL参数。如果你的场景符合这种情况,需要调整method为POST,并添加表单参数处理逻辑。

内容的提问来源于stack exchange,提问作者Roy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 14:05:13