API RESTful Version
Hello,
We need to create a versioning of an existing API, so we going to set a default version (so far) for current connections to version 1
My first attempt is:
/// Get customer info (API version default)
Also, I have a parameter called DEFAULTVERSION with value 1
By this way, the newer calls will have the version number and response according the version of API
The URL will be:
apiserver.com/api/2/getCustomer
I'm checking if the version is less than a CURRENTVERSION, the call is fine
According to a new especification, the URL will be "api/v2/getCustomer", before it was an integer, and now will be a string.
How can I check if this parameter is well formed (v and number), then I can evaluate if the number is an valid API version?
We can change our versioning, so any suggest will be welcome
Comments
I would do something like this.
if pVersion?1"v"1n.n {
// Parameter is well formed vnnn
} else {
// Parameter is not well formed
}
It's just I need... By this way, I have the version number
Many thanks
Good approach, thanks for your answer.
The methods will be exactly the same as before. The changes in version is a slight change in BP, so I need which version is calling. If I user the version number as parameter, I can add into a message and calls to BP with the version and not replay all methods for each version.
I'll be in mind for future versions.
Thanks
Look at the Atelier API, they have versioning.
Approach 1
I would be tempted to have your Dispatch class have a forwarding rule for the API version eg v1 or v2 and this will help ensure a clear hierarchical separation both in the URL and in the class definitions between versions. You might also be interested in the %request.URL property for checking relative paths. An example based on your route map might look like
<MapPrefix="/v1/customer"Forward="MyApp.APIVersion1.Customer"/>
<MapPrefix="/v2/customer"Forward="MyApp.APIVersion2.Customer"/>
And your class MyApp.APIVersion1.Customer might look like
<Routes>
<RouteUrl="/getcustomer"Method="Post"Call="GetCustomer"/>
</Routes>
Personally, I like the classmethod names to reflect the HTTP Method so if I see a GetCustomer method I know that's a HTTP Get method but this is based on personal preference and convention rather than a rule.
Approach 2
The alternative approach is to have everything in the same class but over time this may cause your classes to be rather bloated and unwieldy
<MapPrefix="/v1/customer"Method="Post" Call="GetCustomerV1"/>
<MapPrefix="/v2/customer"Method="Post" Call="GetCustomerV2"/>
Other Thoughts
I do not know if there's a specific function that can be called prior the classmethod in the route map that can validate or invalidate routes. Perhaps the OnPreHTTP method could be used? I noted that some of your methods had the word "default" in them. You can define default route as "/" in your route map.