Search code examples
restwso2esbwso2-esb

WSO2ESB REST API resource priority


I`ve got such an API config in WSO2ESB:

<api xmlns="http://ws.apache.org/ns/synapse" name="b2e_rmq_getmessage" context="/b2e_rmq_getmessage">
    <resource methods="GET" uri-template="/tenants/{tenantid}/exchanges/{exchangeid}/keys/{keyid}/message*">
    <resource methods="GET" uri-template="/tenants/{tenantid}/exchanges/{exchangeid}/keys*">
    <resource methods="GET" uri-template="/tenants/{tenantid}/exchanges*">
    <resource methods="GET" uri-template="/tenants*">
</api>

The problem is that its not obvious how messages are routed in this code. They are even routed by random and this random order is cached. For example, if i save this API and call it with second (keys*) option, it could call the 4th (tenants*) option.

But then I open API config and save it again - i call it with second (keys*) option, it could call the 3th (exchanges*) option.

My experiments how showed that the order of code-writing does not matter.

How could I make priority-handling for this case? My aim is to route to more complex uri if several uri`s fit the condition.

Note that I cant get rid of wildcards in the end of addresses to have ability to use rest-parameters. Also I cant change the URI-templates, because this is resource-oriented model.


Solution

  • I have discovered that there is no way to solve this in "metodically right" manner. My method was to rewrite the uri-mappings moree strictly. For example, in fact we would call "get tenants" method only in two ways: "/tenant" (no wildcard), "/tenant?*".

    So, here you go:

    <api xmlns="http://ws.apache.org/ns/synapse" name="b2e_elasticsearch_getrmqresource" context="/b2e_elasticsearch_getrmqresource">
        <resource methods="GET" uri-template="/tenants/{tenantid}/exchanges/{exchangeid}/keys/{keyid}/messages?*" inSequence="b2e_elasticsearch_getrmqresource_getmessage_in_seq" outSequence="b2e_elasticsearch_getrmqresource_generic_out_seq" faultSequence="b2e_elasticsearch_getrmqresource_generic_fault_seq"/>
        <resource methods="GET" uri-template="/tenants/{tenantid}/exchanges/{exchangeid}/keys/{keyid}/messages" inSequence="b2e_elasticsearch_getrmqresource_getmessage_in_seq" outSequence="b2e_elasticsearch_getrmqresource_generic_out_seq" faultSequence="b2e_elasticsearch_getrmqresource_generic_fault_seq"/>
        <resource methods="GET" uri-template="/tenants/{tenantid}/exchanges/{exchangeid}/keys?*" inSequence="b2e_elasticsearch_getrmqresource_getroutingkey_in_seq" outSequence="b2e_elasticsearch_getrmqresource_generic_out_seq" faultSequence="b2e_elasticsearch_getrmqresource_generic_fault_seq"/>
        <resource methods="GET" uri-template="/tenants/{tenantid}/exchanges/{exchangeid}/keys" inSequence="b2e_elasticsearch_getrmqresource_getroutingkey_in_seq" outSequence="b2e_elasticsearch_getrmqresource_generic_out_seq" faultSequence="b2e_elasticsearch_getrmqresource_generic_fault_seq"/>
        <resource methods="GET" uri-template="/tenants/{tenantid}/exchanges" inSequence="b2e_elasticsearch_getrmqresource_getexchange_in_seq" outSequence="b2e_elasticsearch_getrmqresource_generic_out_seq" faultSequence="b2e_elasticsearch_getrmqresource_generic_fault_seq"/>
        <resource methods="GET" uri-template="/tenants/{tenantid}/exchanges?*" inSequence="b2e_elasticsearch_getrmqresource_getexchange_in_seq" outSequence="b2e_elasticsearch_getrmqresource_generic_out_seq" faultSequence="b2e_elasticsearch_getrmqresource_generic_fault_seq"/>
        <resource methods="GET" uri-template="/tenants?*" inSequence="b2e_elasticsearch_getrmqresource_gettenant_in_seq" outSequence="b2e_elasticsearch_getrmqresource_generic_out_seq" faultSequence="b2e_elasticsearch_getrmqresource_generic_fault_seq"/>
        <resource methods="GET" uri-template="/tenants" inSequence="b2e_elasticsearch_getrmqresource_gettenant_in_seq" outSequence="b2e_elasticsearch_getrmqresource_generic_out_seq" faultSequence="b2e_elasticsearch_getrmqresource_generic_fault_seq"/>
    </api>