Rest WSO2 Synapse:设置URL参数

Rest WSO2 Synapse:设置URL参数,rest,wso2,url-parameters,synapse,wso2-am,Rest,Wso2,Url Parameters,Synapse,Wso2 Am,我试图做一些看似简单但却无法实现的事情。基本上,我希望WSO2 API管理器向REST调用添加URL参数 设置和问题 我安装了WSO2 API管理器。我还有一个Tomcat,它运行一个名为someservlet的伪servlet,它只记录它接收到的任何内容并返回ok。我在manager中添加了servlet作为API,因此我可以直接调用servlet,也可以通过WSO2 API mgr调用servlet 我能跑 curl http://localhost:8080/someservlet/ser

我试图做一些看似简单但却无法实现的事情。基本上,我希望WSO2 API管理器向REST调用添加URL参数

设置和问题 我安装了WSO2 API管理器。我还有一个Tomcat,它运行一个名为someservlet的伪servlet,它只记录它接收到的任何内容并返回ok。我在manager中添加了servlet作为API,因此我可以直接调用servlet,也可以通过WSO2 API mgr调用servlet

我能跑

curl http://localhost:8080/someservlet/servlet/toto?blob=blib&secret=pass
curl -H "Authorization: Bearer [...]" --url "http://192.168.23.1:8280/someservlet/1.0/toto?blob=blib&secret=pass"
servlet工作正常,它告诉我它收到了路径/toto和参数blobsecret

我能跑

curl http://localhost:8080/someservlet/servlet/toto?blob=blib&secret=pass
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"
(请注意,我已删除了secret参数)

…并且仍然得到相同的结果

因此,基本上我希望API管理器添加URL参数secret=pass

我尝试的第一件事:财产调解人 将Synapse XML配置与属性REST\u URL\u POSTFIX一起使用

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

<property name="REST_URL_POSTFIX" value="/blob?toto=titi" scope="axis2" type="STRING"/>
就好像我运行了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>
    
    畸形的?异常堆栈跟踪中有更多详细信息:

    java.net.MalformedURLException: no protocol: /someservlet/1.0/toti?blab=blib&secret=foo
    
    因此,中介(记录或重写)接收到一条消息,其“To:”字段指向一个没有协议的URL

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

    这就是我被困的地方!!:-(

    选择权 我知道可能有一个大锤式的解决方案可以工作:

  • 使用属性存储完整路径和所有参数
  • 实现我自己的中介(例如Java)来修改这些参数
  • 使用属性REST\u URL\u POSTFIX将修改后的后缀放入调用中
  • 不过,我觉得这个问题应该有一个更简单的解决办法

    我有一种希望,有人会给我指出一个简单的资源(中介、样本、语法错误、任何东西),我还没有找到,这正是我想要的。乐观主义…:-)


    谢谢阅读。有什么想法吗?

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

    您使用的方法是正确的。(即:使用property
    REST\u URL\u POSTFIX
    ),在这种情况下,它将替换所有requets参数。 但是在使用之前,您可以保存请求参数并使用
    “REST\u URL\u POSTFIX”
    您可以获得所需的最终REST url。(是的,这是您提到的“待尝试”的最终选项) 在“收件人”地址中,只有端口号之后才有地址。
    如果您使用
    “POST_TO_URI”
    属性,yopu将看到日志中打印的完整地址URL,但是如果在BE服务和ESB之间配置了任何代理服务器,我们将使用该属性,我已经解决了我的问题

    我是这样做的:

  • 在配置文件中,使用REST\u URL\u postfix和 把它放在一个地方
  • 在Java中介中编辑属性
  • 使用REST\u URL\u后缀在XML中设置新的后缀 对于第一步,我使用以下行:

    <property name="querystrings" expression="get-property('axis2', 'REST_URL_POSTFIX')"/>
    
    当然,这里是XML配置的第三步:

    <property name="REST_URL_POSTFIX" expression="get-property('querystrings')" scope="axis2" type="STRING"/>
    
    
    
    所有这些基本上都在URL的末尾设置了一个参数。
    希望这对其他人有所帮助。

    对于可能有相同问题的人,这里有另一个解决方案,更简单、更有效

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

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

    这添加了属性“Authorization”和值“stuff”。

    IIUC,你是在告诉我做我在“尝试选项”标题下写的事情,我会尝试。至于“to:“field,我不是在抱怨我在日志中看到的内容,是重写中介抱怨它没有得到协议。你如何向重写中介提供有效的URL,包括协议?”你是在告诉我做我在“尝试选项”标题下写的事情是的..重写中介器配置看起来不错。我检查了一下似乎有效..您使用的APIM版本是什么?我们目前正在为支持REST而工作,我们可以使用方便的URI模板动态构造端点。wrt重写中介器:我认为这不是特别的中介器,而是任何中介器或者。意思是,到达那里的消息有一个不完整的“To:”字段。只是,我认为大多数调解人不在乎。我使用的是1.2.0版。
    <property name="REST_URL_POSTFIX" expression="get-property('querystrings')" scope="axis2" type="STRING"/>
    
    <property name="Authorization" value="stuff to add" scope="transport"/>