WSO2 PayloadFactory发送json包装的json

时间:2014-12-08 02:56:46

标签: api wso2 jsonobject wso2-am

我正在使用WSO2 API Manager 1.7.0并且正在尝试将一个来自GET的调用转换为传递给json有效负载的POST的简单有效负载。

然而,当我查看日志文件时,看来WSO2发送的json包裹着{“jsonObject”:[myjson]}

我是WSO2的新手,我不确定我需要使用哪种配置设置来阻止它。我认为这是一个配置设置,因为我没有找到任何其他人提及的例子或文档。

我的api看起来像这样:

"POST http://localhost:81/Service/ProcessRequest HTTP/1.1[\r][\n]" 
"Authorization: Basic asdfadfadfadfadfadfadfa=[\r][\n]" 
"Accept-Encoding: gzip,deflate[\r][\n]" 
"Content-Type: application/json[\r][\n]" 
"activityID: 2342342342342342342342342[\r][\n]" 
"Transfer-Encoding: chunked[\r][\n]" 
"Host: localhost:81[\r][\n]" 
"Connection: Keep-Alive[\r][\n]" 
"User-Agent: Synapse-PT-HttpComponents-NIO[\r][\n]" 
"[\r][\n]" 
I/O session http-outgoing-2-3 11.11.11.11:12345<->192.168.1.1:8080[ACTIVE][rw:w]: 0 bytes written 
http-outgoing-2: Produce output 
I/O session http-outgoing-2-3 11.11.11.11:12345<->192.168.1.1:8080[ACTIVE][rw:w]: 230 bytes written 
"db[\r][\n]" 
"{"jsonObject":{"UserType":"User"}}[\r][\n]" 
"0[\r][\n]" 
"[\r][\n]" 

似乎适用于服务调用的日志文件部分如下所示:

<api name="admin--JJJJJ" context="/jjjjj" version="v1.0" version-type="url">
    <resource methods="GET" url-mapping="/documents">
        <inSequence>
            <payloadFactory media-type="json">
                <format>{"UserType":"User"}</format>
                <args/>
            </payloadFactory>
            <property name="Authorization" expression="fn:concat('Basic ', base64Encode('user:password'))" scope="transport"/>
            <property name="HTTP_METHOD" value="POST" scope="axis2" type="STRING"/>
            <property name="messageType" value="application/json" scope="axis2"/>
            <property name="REST_URL_POSTFIX" scope="axis2" action="remove"/>
            <log>
                <property name="JSON-Payload" expression="json-eval($.)"/>
            </log>

            <send>
                 <endpoint name="admin--JJJJJ_APIproductionEndpoint_0">
                     <http trace="enable" method="post" uri-template="http://localhost:81/Service/ProcessRequest"></http>
                 </endpoint>
             </send>
        </inSequence>
        <outSequence>
            <send/>
        </outSequence>
    </resource>
    <handlers>
...
    </handlers>
</api>

我不确定db和0在传输中的位置,但是我从服务中返回的错误似乎是由包装jsonObject引起的。

是否有任何提示或想法如何阻止此包装或在发送它以删除它之前修改有效负载。或者我想用更好的甚至不同的方式将GET请求转换为带有json有效负载的POST。

感谢您对我做错的任何暗示。

2 个答案:

答案 0 :(得分:0)

将axi2.xml(/repository/conf/axis2/axis2.xml)file中的messageformater更改为

<messageFormatter contentType="application/json" class="org.apache.synapse.commons.json.JsonStreamFormatter"/>

并注释json的默认消息格式化程序

<!--messageFormatter contentType="application/json" class="org.apache.axis2.json.JSONMessageFormatter"/-->

了解更多关于json支持的信息[1]

https://docs.wso2.com/display/ESB480/JSON+Support

答案 1 :(得分:0)

您可以在发送中介之前向api添加一个富集中介,以便从身体中移除jsonObject包装。如下所示。

<enrich>
    <source clone="true" xpath="$body//jsonObject//UserType"/>
    <target type="body"/>
</enrich>

您可以在丰富介体后添加日志介体并检查更改的主体。

希望这会对你有所帮助。