1
votes

I have been digging around in Stackoverflow and WSO2 ESB documentation for days but I have yet to come across any clear answer.

My application is in JavaScript and using the Dojo framework. Ideally all the web services call should be make against REST and returns JSON. I know how to get the SOAP xml to come back as JSON because of this example 440: "http//wso2.org/project/esb/java/4.0.3/docs/samples/advanced_mediation_samples.html#Sample440" I have looked at the sample posted on this blog as well: "http//vvratha.blogspot.ca/2011/11/invoking-restful-service-via-wso2esb.html" I seems to be able to call the proxy service from tools like soapUI and get my result in JSON. So I can only assume that ESB is working properly However when I try to call it using dojo.xhrGet or dojo.io.script.get, the data returns as NULL always!!!

What is the method in REST am I supposed to call for a ESB Proxy Service? If I look at the wsdl of the service, the operation seems to call "mediate" but that did not get me any further. I have looked at example 800: "http//wso2.org/project/esb/java/4.0.3/docs/samples/rest_api_samples.html#Sample800" but I am not clear where to use this.

Note: Please add ":" after http for those http links. I seems to be running out of quotas for hyperlinks.

More information after some help from Ratha: 1. This is how I want to call the proxy service: (There will be more querystring parameters later) http//loh7:8280/services/TestRestProxy?address=1460%20nicholson%20road

  1. Query string is null from this Mediation Message Tracker dump:

    13:10:10,803 [-] [HttpServerWorker-16] INFO Proxy Service TestRestProxy received a new message from : 192.168.7.143
    13:10:10,803 [-] [HttpServerWorker-16] INFO Message To: /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 Using the anonymous in-sequence of the proxy service for mediation
    13:10:10,804 [-] [HttpServerWorker-16] INFO Start : Sequence
    13:10:10,804 [-] [HttpServerWorker-16] INFO Sequence :: mediate()
    13:10:10,804 [-] [HttpServerWorker-16] INFO Start : Log mediator
    13:10:10,805 [-] [HttpServerWorker-16] INFO querystring = null
    13:10:10,805 [-] [HttpServerWorker-16] INFO End : Log mediator
    13:10:10,806 [-] [HttpServerWorker-16] INFO Start : Log mediator
    13:10:10,806 [-] [HttpServerWorker-16] INFO End : Log mediator
    13:10:10,806 [-] [HttpServerWorker-16] INFO Start : Send mediator
    13:10:10,806 [-] [HttpServerWorker-16] INFO Sending message through endpoint : EsriNA10 resolving to address =

This is how the proxy looks like: Note: I wanted to extract the "address" value and put it in the $1 in the request soap message.

<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

2 Answers

1
votes

In the sample 800 it explains how you can directly invoke RESTAPIs.. For example, if you have your REST service endpoints point that as your service endpoint. Note that the following configuration;

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

Where we define the RESTAPI call stockquoteAPI and defining the context and uritemplate.. So, when you try to execute above API, use curl or other REST client and execute like;

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

Here you will see we provide the context and uri template..from that we pick symbol call IBM and sending to stcokquote service..But it is your logic, you can define your own logic in the sequence.

Edit

From browser try like this;

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

Here the "operation" is the operation(which is present at your backend REST service) you try to invoke.

"Mediate" is the default operation..If you want to execute your actual backend service operation provide that operation as i mentioned above.

When you define proxy follow my sample in the blog..

<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>

Try above proxy and see what it logs fro "querystrings"

0
votes

You can use REST API to invoke allt hese http verbs.Simply define what type of the verb you like to execute..and route the request to the service endpoint This is a simple introduction part..hope may help you.. http://vvratha.blogspot.com/2012/09/rest-support-in-wso2esb-introduction.html