3

我正在尝试做一些看似简单但无法正常工作的事情。基本上我希望 WSO2 API 管理器将 URL 参数添加到 REST 调用。

设置和问题

我安装了 WSO2 API 管理器。我还有一个运行着一个名为someservlet的虚假 servlet 的 Tomcat ,它只记录它接收到的任何内容并返回 ok。我已将 servlet 作为 API 添加到管理器中,因此我可以直接调用 servlet 或通过 WSO2 API mgr。

我可以跑

curl http://localhost:8080/someservlet/servlet/toto?blob=blib&secret=pass

并且 servlet 工作正常,它告诉我它已收到路径/toto和参数blobsecret

我可以跑

curl -H "Authorization: Bearer [...]" --url "http://192.168.23.1:8280/someservlet/1.0/toto?blob=blib&secret=pass"

它的作用完全相同。到现在为止还挺好。

我想要的是运行:

curl -H "Authorization: Bearer MqVQuHqLNphtPV3XF1CtXVmbyP8a" --url "http://192.168.23.1:8280/someservlet/1.0/toto?blob=blib"

(请注意,我已经删除了秘密参数)

...并且仍然得到相同的结果。

所以基本上我希望 API 管理器添加 URL 参数secret=pass

我尝试的第一件事:财产调解员

使用带有属性 REST_URL_POSTFIX的 Synapse XML 配置。

我编辑了 API 配置文件,并添加了

<property name="REST_URL_POSTFIX" value="/blob?toto=titi" scope="axis2" type="STRING"/>

现在如果我跑

curl -H "Authorization: Bearer [...]" --url "http://192.168.23.1:8280/someservlet/1.0/toti?blab=blib&secret=puss"

就好像我运行了someservlet/1.0/blob?toto=titi:我所有的路径和参数都消失了,并被配置的路径和参数所取代。嘿,这就是它应该工作的方式,不是吗!

问题:

  1. 这不会向 URL 添加任何内容,它会设置 URL 后缀,这意味着现有参数会消失(在上面的示例中,blab=blib
  2. 它必须以“/”开头才能成为有效值,所以我不能只添加&secret=pass(当然,因为问题 1,这无论如何都没用)

所以基本上这不能让我附加最后的&secret=pass

我尝试的第二件事:重写 URL 中介

我找到了这个中介,虽然它可能无法解决问题,但它是一个很好的线索:我可以用secret=foo调用,然后让中介用secret=pass替换它。

我把它放在配置文件中:

<rewrite>
  <rewriterule>
    <action type="replace" value="pass" fragment="query" regex="foo"/>
  </rewriterule>
</rewrite>

这行不通。起初我以为我没有正确的动作参数。但错误信息是:

Malformed URL when processing /someservlet/1.0/toti?blab=blib&amp;secret=foo

畸形?异常堆栈跟踪中有更多详细信息:

java.net.MalformedURLException: no protocol: /someservlet/1.0/toti?blab=blib&secret=foo

所以发生的事情是中介(记录或重写)收到一条消息,其“To:”字段指向一个没有协议的 URL!

当然,我一直在谷歌搜索,在某些情况下,我发现其他人有logMediator: To: /blabla,而其他(大多数)情况下他们有logMediator: To: http://blabla。我真的不明白是什么导致了这种差异。:-(

所以这就是我卡住的地方!:-(

可以尝试的选项

我知道可能有一个应该有效的大锤解决方案:

  1. 使用属性存储完整路径和所有参数
  2. 实现我自己的中介器(例如在 Java 中)来修改这些参数
  3. 使用属性 REST_URL_POSTFIX将修改后的后缀放在调用上

但是我觉得这个问题应该有一个更简单的解决方案。

我有一种希望,有人会给我指出一个我没有找到的简单资源(中介、样本、语法错误等),而这正是我想要的。乐观... :-)

谢谢阅读。有任何想法吗?

4

3 回答 3

1

据我了解,您正在尝试将 附加secret=pass到您的端点网址。当您调用 API 时,我相信您正在发送该参数。同时您也在发送"blab=blib"参数。但是在 ESB 中,您需要将其更改为"toto=titi"

您使用的方法是正确的。(即:使用属性REST_URL_POSTFIX)在这种情况下,它将替换所有 requets 参数。但在使用之前,您可以保存请求参数并使用"REST_URL_POSTFIX" 您可以获得所需的最终 REST url。(是的,这是您提到的“待尝试”的最后一个选项)在“TO”地址中,您将只有端口号后面的地址。如果使用"" POST_TO_URI"属性 yopu 会在日志中看到完整的地址 URL,但是如果在 BE 服务和 ESB 之间配置了任何代理服务器,我们会使用它

于 2013-01-28T06:25:46.473 回答
1

我已经解决了我的问题。

这就是我所做的:

  1. 在配置文件中,使用REST_URL_POSTFIX获取 URL 后缀并将其放入属性中
  2. 在 Java 中介中编辑属性
  3. 使用REST_URL_POSTFIX在 XML 中设置新的后缀

对于第一步,我使用这一行:

<property name="querystrings" expression="get-property('axis2', 'REST_URL_POSTFIX')"/>

这需要一些时间来解决,因为那里有很多行对我不起作用,它需要 2 个参数(axis2 和 REST ...)才能让它变得直截了当。

对于第二步,这是配置 XML:

<class name="mypackage.AddUrlParamMediator">
    <property name="paramName" value="mykey"/>
    <property name="paramValue" value="mysecret"/>
</class>

这是中介类(没有导入):

public class AddUrlParamMediator extends AbstractMediator {
    private String paramName = "default";
    private String paramValue = "default";

    public void setParamName(String paramName) {
        this.paramName = paramName;
    }

    public void setParamValue(String paramValue) {
        this.paramValue = paramValue;
    }

    public boolean mediate(MessageContext synapseMsgContext) {
        SynapseLog log = this.getLog(synapseMsgContext);
        String urlNewParam = this.paramName + "=" + this.paramValue;
        Object queryStringsPpty = synapseMsgContext.getProperty("querystrings");
        if (queryStringsPpty == null) {
            log.error("### queryStringPpty=null, exiting!");
            return true;
        }
        String queryStrings = queryStringsPpty.toString();
        queryStrings = (queryStrings.contains("?"))
            ? queryStrings + "&" + urlNewParam
            : queryStrings + "?" + urlNewParam;
        synapseMsgContext.setProperty("querystrings", queryStrings);
        return true;
    }
}

当然这是 XML 配置中的第三步:

<property name="REST_URL_POSTFIX" expression="get-property('querystrings')" scope="axis2" type="STRING"/>

所以这一切基本上都在 URL 的末尾设置了一个参数。希望这对其他人有帮助。

于 2013-02-08T15:00:48.403 回答
0

对于可能遇到相同问题的任何人,这里有另一种解决方案,更简单且有效。

进入 carbon 管理门户,进入 API 列表,找到相关的 API 并点击它。这导致 API 的 XML 配置。在“地址”字段(和 XML 中的同一级别)之后添加字段:

<property name="Authorization" value="stuff to add" scope="transport"/>

这会添加属性“授权”,其值为“stuff”。

于 2014-09-11T10:51:35.160 回答