Hi All, When exposing APIs, API Manager uses existing synapse core, which is already used in WSO2 ESB. Because of that, the behavior of APIs which does not having version attributes can be tested by defining similar APIs in synapse configuration in an ESB instance.
*The problem in synapse currently* Accordingly, I defined a set of APIs with the same name and the context with one of them without having any version related attributes(*version* or *version-type*). Then following was observed by testing their behavior, invoking them using curl. 1) If I invoke without using a version (say http://host:port*/*twitter/search), then it is correctly handled by the API having no version. 2) Keeping the same synapse configuration, if I invoke APIs which has a version (say http://host:port*/*twitter/1.0.0/search), then "some" of the versions seems also pass into the API with no version. 3) If I invoke some API version which does not exist in the synapse configuration, then it also passes into the API with no version. Since the above 2) is unexpected, I explored some parts of the synapse core and found the following. *Background:* 1) When a message arrives to call an API, RESTRequestHandler(in org.apache.synapse.rest) gets the current list of APIs and process one by one to find whose version matches with the version in the message.* It will handle the message to the first found API which matches the version. * 2) In an API, getting and comparing versions is done through an interface called VersionStrategy(in org.apache.synapse.rest.version). There are two classes which implements it, which are DefaultStrategy and URLBasedVersionStrategy. 3) When an API is created, initially it is mapped to DefaultStrategy. But when we specify *version-type *attribute as "url" ( <api name="TestAPI" ... .. *version-type="url"*> ) VersionStrategy will be mapped into URLBasedVersionStrategy. 4) There is a method called *isMatchingVersion(Object versionInfoObj)* in VersionStrategy to check whether an API's version matches with the *versionInfoObj'*s version (into which the version of the current message is passed) *Cause for the problem:* 5) There is a logic implemented in *isMatchingVersion() *in the implementation of URLBasedVersionStrategy. *But in DefaultStrategy, there is no logic and **isMatchingVersion(**versionInfoObj**)** always return true for whatever we pass into **versionInfoObj. * 6) If we create an API without specifying the *version-type *attribute, VersionStrategy stay remains in DefaultStrategy( as pointed in 3. ) and if the related API stays in a higher position in the list of APIs, it will get selected as soon as RESTRequestHandler reaches it in the list of APIs. As I found, that is the reason for it to get selected inappropriately. *Options to consider:* Following are some options which can be considered to solve this. 1) When creating an API, avoiding both *version* and *version-type *attributes, and then fix the code to avoid happening 5) and 6). 2) Keeping everything as it is, and specifying some kind of string to the version attribute, such as *version="latest". *But it is not a conventional way and also not well-suited for the current goal. Please share your ideas as well. Thank you. Regards, Malintha Amarasinghe, Engineering Intern. On Thu, Mar 13, 2014 at 12:23 PM, Nuwan Dias <[email protected]> wrote: > On Thu, Mar 13, 2014 at 11:57 AM, Samisa Abeysinghe <[email protected]>wrote: > >> So défault URL defaults to the latest API version available? >> > > The default url (/twitter) always invokes the default version API (this > may or may not be the latest). If the API creator maintains the latest > version as the default version, then the above said is true. > >> >> And we allow users to configure what API version is default, in case >> latest is not the greatest? >> > > Yes. > >> >> Thanks, >> Samisa... >> >> >> Samisa Abeysinghe >> >> Vice President Developer Evangelism >> >> WSO2 Inc. >> http://wso2.com >> >> >> >> On Thu, Mar 13, 2014 at 11:31 AM, Nuwan Dias <[email protected]> wrote: >> >>> Hi, >>> >>> All APIs currently being created on the API Manager require a version >>> attribute to be present. This version is required to be present in the API >>> invocation url following the API context. For example if there is an API >>> such that its context=/twitter, version=1.0.0 and resource=/search, the API >>> invocation url will be similar to >>> >>> http://host:port*/twitter/1.0.0*/search >>> >>> Given an API with several versions, this discussion is to allow 1 API >>> out of the group to exist without a version. This API will be referred to >>> as the 'default' version API. >>> >>> So if there are APIs as /twitter/1.0.0, /twitter/2.0.0, etc. It will be >>> allowed to have 1 API as /twitter. Whenever a user attempts to access an >>> API without the version value in the url, the default API version will be >>> invoked. >>> >>> The Publisher UI should be tweaked in such a way that it will remove the >>> mandatory nature of the version field and make the user either provide a >>> version or mark the API as the default version API. Necessary checks need >>> to be done to ensure that there cannot be two default versions of the same >>> API and the same checks need to run when copying APIs as well. >>> >>> Thanks, >>> NuwanD. >>> >>> -- >>> Nuwan Dias >>> >>> Senior Software Engineer - WSO2, Inc. http://wso2.com >>> email : [email protected] >>> Phone : +94 777 775 729 >>> >>> _______________________________________________ >>> Architecture mailing list >>> [email protected] >>> https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture >>> >>> >> >> _______________________________________________ >> Architecture mailing list >> [email protected] >> https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture >> >> > > > -- > Nuwan Dias > > Senior Software Engineer - WSO2, Inc. http://wso2.com > email : [email protected] > Phone : +94 777 775 729 > > _______________________________________________ > Architecture mailing list > [email protected] > https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture > >
_______________________________________________ Architecture mailing list [email protected] https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture
