我正在尝试做一些看似简单但无法正常工作的事情。基本上我希望 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和参数blob和secret。
我可以跑
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:我所有的路径和参数都消失了,并被配置的路径和参数所取代。嘿,这就是它应该工作的方式,不是吗!
问题:
- 这不会向 URL 添加任何内容,它会设置 URL 后缀,这意味着现有参数会消失(在上面的示例中,blab=blib)
- 它必须以“/”开头才能成为有效值,所以我不能只添加&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&secret=foo
畸形?异常堆栈跟踪中有更多详细信息:
java.net.MalformedURLException: no protocol: /someservlet/1.0/toti?blab=blib&secret=foo
所以发生的事情是中介(记录或重写)收到一条消息,其“To:”字段指向一个没有协议的 URL!
当然,我一直在谷歌搜索,在某些情况下,我发现其他人有logMediator: To: /blabla,而其他(大多数)情况下他们有logMediator: To: http://blabla。我真的不明白是什么导致了这种差异。:-(
所以这就是我卡住的地方!:-(
可以尝试的选项
我知道可能有一个应该有效的大锤解决方案:
- 使用属性存储完整路径和所有参数
- 实现我自己的中介器(例如在 Java 中)来修改这些参数
- 使用属性 REST_URL_POSTFIX将修改后的后缀放在调用上
但是我觉得这个问题应该有一个更简单的解决方案。
我有一种希望,有人会给我指出一个我没有找到的简单资源(中介、样本、语法错误等),而这正是我想要的。乐观... :-)
谢谢阅读。有任何想法吗?