Hi Rohit,

I didn't mean changing the format of the HTTP request, but only changing
the intermediate format in which we keep it in the property of the Command
class. I mentioned the format in the request just to explain what I meant.

My proposal is to leave the request format as it is, but then when the
method "apiDispatcher#setFieldValue" parses the map and assign it to the
property, do it in a normal way: which is a Map<String, String> instead of
a Map<String, Map<String, Object>> as it is now. And then, our getter
methods (like CreateTagsCommand#GetTag) will be just a normal getter that
doesn't need to transform the structure on the fly.

Thanks, cheers
antonio


2014-02-11 17:38 GMT+01:00 Rohit Yadav <rohityada...@gmail.com>:

> Hi Antonio,
>
> On Tue, Feb 11, 2014 at 9:57 PM, Antonio Fornié Casarrubios
> <antonio.for...@gmail.com> wrote:
> > Hi all,
> >
> > When invoking a CS API command that has parameters of type Map, the
> request
> > will be something like this:
> >
> URL/api?command=createTags&tags[0].key=region&tags[0].value=canada&tags[1].key=name&tags[1].value=bob
> >
> > in order to send a Map with the pairs:
> >
> > tags{
> >    region : "canada",
> >    name : "bob"
> > }
> >
> > Then in the server side the parameters go through several stages (IMHO
> too
> > many), and have different formats. At some point
> >
> > apiDispatcher#setFieldValue
> >
> > will assign the value to the command property (CreateTagsCmd#tag in the
> > example) in a VERY strange way:
> >
> > CreateTagsCmd#tag = {
> >    0 : {
> >       "key" : "region",
> >       "value" : "canada"
> >    },
> >    1 : {
> >       "key" : "name",
> >       "value" : "bob"
> >    }
> > }
> >
> > This is true for several Cmd classes. And the funny thing is they usually
> > provide a public getter method to get the Map in an already "normalized"
> > structure. The problem is we have this method again a again in each of
> > these commands, only with different name depending on what property the
> > get, and the body is almost copy and pasted. so my next refactoring would
> > be to have a generic method only once in BaseCmd so that all subclasses
> can
> > reuse it for their Map getters. Pretty obvious, but...
>
> This is a well know issue and is such a pain, both for the users of
> the API to create this API and the programmer who have to put hack at
> the backend to extract the map.
>
> > Is it really necessary to have this strange format? Wouldn't it be much
> > better to just store it in a more normal way from the beginning, and have
> > the getters just standard getters? Does it have any use to have those
> Maps
> > of Maps?
>
> Changing the API will break many client so no one attempted it for
> keeping backward-compatibility I think.
>
> The HTTP RFC states that if same keys are sent in param they must be
> received as an array. For example, /api?q=1&q=2&q=3 should received q
> = [1,2,3] which is what we're not doing.
>
> We should do that and this way we can capture maps using keys and
> values in order, so for example,
> /api?q.key1=value1&q.key2=value2&q.key1=value3&q.key2=value4 should be
> received as as array of maps: [{key1: value1, key2: value2},
> {key3:value3, key4: value4}] etc.
>
> I think it does not have to be maps of maps, but since our API is
> query based these ugly hacks were invented. We should definitely get
> rid of them, and perhaps work on the RESTful API layer, cloud-engine
> and other good stuff we were talking about more than a year ago and
> deprecate the present query API over next few years. Thoughts, flames?
>
> Regards.
>
> >
> > Thanks. Cheers
> > Antonio Fornie
> > Schuberg Philis - MCE
>

Reply via email to