WSO2 ESB访问应用程序/ x-www-form-urlencoded数据

时间:2014-12-12 19:13:57

标签: wso2 wso2esb

我正在使用WSO2 ESB。

我想将application / x-www-form-urlencoded数据传递给ESB:

curl -v -X POST 'http://myhost/myapi/stuff' -d 'myvar=hello' -H "Content-Type: application/x-www-form-urlencoded"

...然后能够在我的ESB API中接收每个表单变量。

要获得一个给定的变量,我这样做:

<resource methods="POST" uri-template="/stuff">
      <inSequence>
         <property name="myvar" expression="//xformValues//myvar/text()"></property>
...

然后我将其存储在一个参数中:

<args>
   <arg evaluator="xml" expression="$ctx:myvar"></arg>
</args>

然后我在尝试用1美元的有效载荷填充它。

我知道问题在于属性行:

<property name="myvar" expression="//xformValues//myvar/text()"></property>

...因为如果我在行中存储一个文字值,它就会起作用。

我确实在axis.xml中配置了messageReceiver:

<messageFormatter contentType="application/x-www-form-urlencoded"
    class="org.apache.axis2.transport.http.XFormURLEncodedFormatter"/>
<messageFormatter contentType="multipart/form-data"

而且,我在axis.xml文件中配置了messageBuilder:

<messageBuilder contentType="application/x-www-form-urlencoded"
    class="org.apache.synapse.commons.builders.XFormURLEncodedBuilder"/>

知道我做错了什么?

谢谢!

3 个答案:

答案 0 :(得分:0)

只需使用

`<property name="myvar" expression="//myvar/text()"/>`

有效。 实际构建的消息看起来像

`<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <mediate>
         <myvar>helloaaaa</myvar>
      </mediate>
   </soapenv:Body>
</soapenv:Envelope>`

所以你的xpath评估失败了。希望这有帮助。

谢谢,

答案 1 :(得分:0)

我偶然发现了答案。

正确的xpath应为:

<property name="myvar" expression="//mediate//myvar/text()"></property>

这似乎是一个已知问题,如下所述:

https://wso2.org/jira/browse/ESBJAVA-3303

  • 兰迪

答案 2 :(得分:0)

将请求中的内容类型明确更改为&#39; application / json&#39;。 这很有用。

问题似乎是没有正文且没有内容类型,使用默认的www-urlencode。根据生成xformValues的规范。 如果对方不期望url编码,则应始终设置内容类型。