【问题标题】:Malformed Response - Invoking one ESB REST service from another格式错误的响应 - 从另一个 ESB REST 服务调用
【发布时间】:2013-05-24 12:50:19
【问题描述】:

我对 WSO2 ESB 比较陌生, 尝试通过另一个 REST API 调用带有 GET 参数的 REST Web 服务,该服务托管在 WSO2 ESB 上。

这是一个简单的 Web 服务(SampleREST),它以 XML 格式回复欢迎消息, 当我直接调用此服务时;我可以在浏览器上看到正确的响应,如下所示

<Message xmlns="http://ws.apache.org/ns/synapse">WelcomeRanjan</Message>

现在我创建了另一个 REST Web 服务(InvokeSampleRest),它反过来使用参数化的 GET 调用 SampleREST Web 服务, Invoke WebService Client 返回包含在中介 xml 标记和其他格式错误的标记中的 XML 响应,如下所示

<mediate><<Message xmlns>"http://ws.apache.org/ns/synapse">WelcomeRanjan&lt;/Message></<Message xmlns></mediate>

这是我的 SampleREST API 代码

<?xml version="1.0" encoding="UTF-8"?>
<api xmlns="http://ws.apache.org/ns/synapse" name="SampleREST" context="/SampleRest" hostname="10.203.245.47">
    <resource methods="GET" uri-template="/{str1}">
        <inSequence>
            <header name="To" action="remove"/>
            <property name="RESPONSE" value="true" scope="default" type="STRING"/>
            <property name="NO_ENTITY_BODY" scope="axis2" action="remove"/>
            <payloadFactory>
                <format>
                    <Message>$1</Message>
                </format>
                <args>
                    <arg expression="get-property('uri.var.str1')"/>
                </args>
            </payloadFactory>
            <log level="full" separator=",">
                <property name="sequence" value="*** Got Request ***"/>
            </log>
            <send/>
        </inSequence>
        <outSequence/>
        <faultSequence/>
    </resource>
</api>

InvokeSampleREST 代码如下(我从这里调用 SampleREST 服务)

<?xml version="1.0" encoding="UTF-8"?>
<api xmlns="http://ws.apache.org/ns/synapse" name="InvokeSampleREST" context="/InvokeSampleREST" hostname="10.203.245.47">
       <resource methods="GET" uri-template="/{str1}">
        <inSequence>
            <log level="full" separator=","/>
            <property name="REST_URL_POSTFIX" expression="fn:concat('/Welcome',get-property('uri.var.str1'))" scope="axis2" type="STRING"/>
            <log level="full">
                <property name="sequence" value="****Message Sent *** "/>
            </log>
            <send>
                <endpoint>
                    <address uri="http://10.203.245.47:8280/SampleRest/"/>
                </endpoint>
            </send>
        </inSequence>
        <outSequence>
            <log level="full" separator=",">
                <property name="out" value="** Ouput of Rest call ***"/>
            </log>
            <property name="ContentType" value="application/xml" scope="axis2" type="STRING"/>
            <send/>
        </outSequence>
        <faultSequence/>
    </resource>
</api>

感谢任何帮助。 谢谢, 兰詹

【问题讨论】:

    标签: rest wso2 wso2esb


    【解决方案1】:

    为什么要使用两个 API?您可以在单个 API 中设计您的流程。我的意思是你可以将它们合并在一起。 顺便说一句,您需要在后端 API 中设置 contentType 属性(即:在 SampleREST API) 因为,当您将响应发送回“InvokeSampleREST”API 时,系统不知道传入响应的内容类型并尝试将其作为文本消息处理。

    例如:

     <api name="SampleREST" context="/SampleRest" hostname="localhost">
          <resource methods="GET" uri-template="/{str1}">
             <inSequence>
                <header name="To" action="remove"/>
                <property name="NO_ENTITY_BODY" scope="axis2" action="remove"/>
                <property name="RESPONSE" value="true" scope="default" type="STRING"/>
                <payloadFactory>
                   <format>
                      <Message>$1</Message>
                   </format>
                   <args>
                      <arg expression="get-property('uri.var.str1')"/>
                   </args>
                </payloadFactory>
                <log level="full" separator=",">
                   <property name="sequence" value="*** Got Request ***"/>
                </log>
                <property name="Content-Type"
                          value="application/xml"
                          scope="transport"
                          type="STRING"/>
                <send/>
             </inSequence>
             <faultSequence/>
          </resource>
    

    【讨论】:

      【解决方案2】:

      尝试在 InvokeSampleREST API 中进行以下更改。

      在outSequence,在 mediator之前设置messageType如下。

      <property name="messageType" value="application/xml" scope="axis2"/>
      

      【讨论】:

      • 嗨 Isuru,我在代码中尝试了上述属性,但响应仍然相同。你能检查一下它是否适合你。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-06
      • 1970-01-01
      • 2015-11-09
      • 2013-08-02
      • 1970-01-01
      • 2021-01-12
      相关资源
      最近更新 更多