我正在使用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"/>
知道我做错了什么?
谢谢!
答案 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编码,则应始终设置内容类型。