1

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

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

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

现在我创建了另一个 REST Web 服务(InvokeSampleRest),它反过来使用参数化的 GET 调用 SampleREST Web 服务,Invoke WebService 客户端向我返回包装在中介 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>

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

4

2 回答 2

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>

于 2013-05-27T16:50:29.737 回答
0

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

在 outSequence 中,在 <send> 中介之前按如下方式设置 messageType。

<property name="messageType" value="application/xml" scope="axis2"/>
于 2013-05-26T07:46:41.207 回答