将WSO2 ESB公开为REST以在JavaScript中使用

时间:2012-08-27 17:46:35

标签: wso2 esb

我已经在Stackoverflow和WSO2 ESB文档中挖掘了好几天,但我还没有得到任何明确的答案。

我的应用程序是使用JavaScript并使用Dojo框架。理想情况下,所有Web服务调用都应该针对REST进行调用并返回JSON。我知道如何让SOAP xml以JSON的形式返回,因为这个例子440:“ http // wso2.org / project / esb / java / 4.0.3 / docs / samples / advanced_mediation_samples.html#Sample440 < / strong>“我已经查看了此博客上发布的示例:” http // vvratha.blogspot.ca / 2011/11 / invoking-restful-service-via-wso2esb.html “我似乎能够从soapUI等工具调用代理服务,并在JSON中获取结果。所以我只能假设ESB正常工作但是当我尝试使用dojo.xhrGet或dojo.io.script.get调用它时,数据总是以NULL返回!!!

REST中的方法是什么,我应该调用ESB代理服务?如果我查看该服务的wsdl,该操作似乎称为“mediate”,但这并没有让我更进一步。我看了例子800:“ http // wso2.org / project / esb / java / 4.0.3 / docs / samples / rest_api_samples.html#Sample800 ”但我不清楚在哪里使用此

注意:请在http之后为这些http链接添加“:”。我似乎用完了超链接的配额。

在Ratha的帮助下获得更多信息: 1.这就是我想要调用代理服务的方式:(以后会有更多的查询字符串参数) HTTP // loh7:8280 /服务/ TestRestProxy地址= 1460%20nicholson%20road

  1. 此调解邮件跟踪器转储中的查询字符串为空:

    13:10:10,803 [ - ] [HttpServerWorker-16] INFO代理服务TestRestProxy收到一条新邮件:192.168.7.143
    13:10:10,803 [ - ] [HttpServerWorker-16] INFO消息:/ services / TestRestProxy?address = 1460%20nicholson%20road
    13:10:10,803 [ - ] [HttpServerWorker-16] INFO SOAPAction:null
    13:10:10,803 [ - ] [HttpServerWorker-16] INFO WSA-Action:null
    13:10:10,803 [ - ] [HttpServerWorker-16] INFO使用代理服务的匿名顺序进行调解
    13:10:10,804 [ - ] [HttpServerWorker-16]信息开始:​​序列
    13:10:10,804 [ - ] [HttpServerWorker-16] INFO Sequence :: mediate()
    13:10:10,804 [ - ] [HttpServerWorker-16]信息开始:​​记录介体
    13:10:10,805 [ - ] [HttpServerWorker-16] INFO querystring = null
    13:10:10,805 [ - ] [HttpServerWorker-16] INFO结束:日志调解员
    13:10:10,806 [ - ] [HttpServerWorker-16]信息开始:​​记录介体
    13:10:10,806 [ - ] [HttpServerWorker-16] INFO结束:日志调解员
    13:10:10,806 [ - ] [HttpServerWorker-16]信息开始:​​发送调解员
    13:10:10,806 [ - ] [HttpServerWorker-16] INFO通过端点发送消息:EsriNA10解析为地址=

  2. 这是代理的样子: 注意:我想提取“地址”值并将其放在请求肥皂消息中的$ 1中。

    <proxy xmlns="http://ws.apache.org/ns/synapse" name="TestRestProxy" transports="https,http" statistics="disable" trace="enable" startOnLoad="true">
       <target>
          <inSequence>
             <log level="custom">
                <property name="querystring" expression="get-property('REST_URL_POSTFIX')" />
             </log>
             <payloadFactory>
                <format>
                   <GeocodeAddress xmlns="http://www.esri.com/schemas/ArcGIS/10.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                      <Address xmlns="">
                         <PropertyArray>
                            <PropertySetProperty>
                               <Key>Street</Key>
                               <Value>$1</Value>
                            </PropertySetProperty>
                            <PropertySetProperty>
                               <Key>City</Key>
                               <Value>Newmarket</Value>
                            </PropertySetProperty>
                            <PropertySetProperty>
                               <Key>State</Key>
                               <Value>ON</Value>
                            </PropertySetProperty>
                            <PropertySetProperty>
                               <Key>Zip</Key>
                               <Value>L3Y 9C3</Value>
                            </PropertySetProperty>
                            <PropertySetProperty>
                               <Key>Country</Key>
                               <Value>CANADA</Value>
                            </PropertySetProperty>
                         </PropertyArray>
                      </Address>
                      <PropMods xmlns="">
                         <PropertyArray>
                            <PropertySetProperty>
                               <Key>OutputSpatialReference</Key>
                               <Value xmlns:q2="http://www.esri.com/schemas/ArcGIS/10.0" xsi:type="q2:ProjectedCoordinateSystem">
                                  <WKID>102100</WKID>
                               </Value>
                            </PropertySetProperty>
                         </PropertyArray>
                      </PropMods>
                   </GeocodeAddress>
                </format>
                <args>
                   <arg expression="$ctx:querystring" />
                </args>
             </payloadFactory>
             <log level="full" category="TRACE" separator="," />
             <send>
                <endpoint key="EsriNA10" />
             </send>
          </inSequence>
          <outSequence>
             <log level="full" separator="," />
             <xslt key="out_transform" />
             <property name="messageType" value="application/json" scope="axis2" type="STRING" />
             <send />
          </outSequence>
       </target>
    </proxy>
    

2 个答案:

答案 0 :(得分:1)

在示例800中,它解释了如何直接调用RESTAPI。 例如,如果您的REST服务端点将其指向服务端点。请注意以下配置;

<api name="StockQuoteAPI" context="/stockquote">
   <resource uri-template="/view/{symbol}" methods="GET">

我们定义RESTAPI调用stockquoteAPI并定义上下文和uritemplate。 因此,当您尝试执行上述API时,请使用curl或其他REST客户端并执行like;

curl -v http://127.0.0.1:8280/stockquote/view/IBM

在这里,您将看到我们提供上下文和uri模板..从中我们选择符号调用IBM并发送到stcokquote服务..但这是您的逻辑,您可以在序列中定义自己的逻辑。

修改

从浏览器尝试这样;

http://localhost:8280/services/yourProxy/<Operation>?param1=21312&param2=wqeqw

此处“操作”是您尝试调用的操作(存在于后端REST服务中)。

“Mediate”是默认操作。如果您想执行实际的后端服务操作,请提供上述操作。

当您定义代理时,请在博客中关注我的示例..

<proxy name="yourProxy" transports="https http" startOnLoad="true" trace="disable">
        <target>   
            <endpoint>
              <address uri="Your REST SERVICE ENDPOINT URL"/>
            </endpoint>  
           <inSequenc>
               <log level ="custom">
                 <property name="querystrings" expression=get-property('REST_URL_POSTFIX')/>
               </log>
          </inSequnece>           
            <outSequence>
                <send/>
            </outSequence>
        </target>
    </proxy>

尝试上面的代理并查看它记录的内容“querystrings”

答案 1 :(得分:0)

您可以使用REST API调用其他http谓词。只需定义您要执行的动词类型,并将请求路由到服务端点 这是一个简单的介绍部分..希望可以帮助你.. http://vvratha.blogspot.com/2012/09/rest-support-in-wso2esb-introduction.html