[katello-devel] API v2 - proposed changes in routes

Tomas Strachota tstrachota at redhat.com
Tue Mar 5 17:00:09 UTC 2013


On 03/05/2013 04:39 PM, Justin Sherrill wrote:
> On 03/05/2013 10:28 AM, Dmitri Dolguikh wrote:
>> On 05/03/13 02:52 PM, Eric D Helms wrote:
>>>
>>>
>>>
>>> On Tue, Mar 5, 2013 at 9:11 AM, Tomas Strachota
>>> <tstrachota at redhat.com <mailto:tstrachota at redhat.com>> wrote:
>>>
>>>     On 03/05/2013 02:29 PM, Eric D Helms wrote:
>>>
>>>         On #2, if one of our core operating principles is that nearly
>>>         everything
>>>         is scoped based on an organization, why would we want to
>>>         abstract that
>>>         away and not make it explicit as part of resource look-up?
>>>          Given that a
>>>         design goal of RESTful APIs is to be predictable, I would
>>>         think the form
>>>         that includes organization at the trunk of the route is more
>>>         predictable
>>>         and mimics how resources are structured.
>>>
>>>
>>>     The idea was not to get rid of the resource relations. The scope
>>>     would still be there for collections. For example environments
>>>     would look like:
>>>
>>>     crate:   POST   /organization/ACME/
>>>     list:    GET    /organization/ACME/environments/
>>>     show:    POST   /environments/1/
>>>     update:  PUT    /environments/1/
>>>     destroy: DELETE /environments/1/
>>>
>>>     I think of it like this:
>>>     I want to see what environments I have in org ACME -> I go to
>>>     /organization/ACME/environments/. Now I know ids of all the
>>>     environments I'm interested in. If I want to change it, I know
>>>     it's environment so I go to /environments/1/. I don't have to
>>>     keep in mind what org it's in.
>>>     When whole api behaves the same I find it predictable.
>>>
>>> Given that the API is another user interface, I feel that it's
>>> important for all our interfaces to mimic one another in structure as
>>> well as keep certain details in the forefront of users minds.  In the
>>> UI, most entities are scoped based on Organization and this is
>>> expressed throughout the design goals.  This should, in my opinion,
>>> spill over into the API so that resources are predictable and mimic
>>> other workflows the user will be accustomed to.  Using our API, I
>>> should have to actively deal with the fact that System A is a part of
>>> Org X to help me understand the implications and because this is a
>>> built in hierarchy that we've expressed as a guiding principle of our
>>> design.
>>
>> API doesn't have a concept of the 'current' organization, which is
>> another hint at the fact that API is used differently from UI. Using
>> organizations and environments as an example, a typical flow would be:
>>
>> GET organizations/:id/environments
>> PUT environments/:id
>>
>> The presence of the organization bit in the url would imply to me that
>> the environment id is unique within organization only (which has its
>> own consequences). As this is not the case here, organization
>> information isn't merely noise, it's misleading.
>
> I think not having the org_id in the url makes our api much more
> confusing today.  For example,
>
> GET environments/   requires  organization_id as a parameter, as does
> POST environments/
>
> so the user is left guessing, does this require an org_id or not? I also
> think the concept of "if the environment id is unique within the org
> only or not" is moot, as the user does not define the id, so why does he
> care under what scope is it unique?  If the id was set by the user that
> might be a valid point.
>

I'm not sure if it was obvious but I agree with what you say here. We 
also try to solve this problem in the proposal.
The routes I mention in the etherpad document are always tied to a 
method. If there is a note "Move to" it means we want to move only the 
named methods. The rest would stay as it is.

What I find confusing today:

1) Not having ids of parent resources in the url
This is what you mention above.
GET and POST environments/ requires organization_id as a parameter

Solution:
Nest the GETs (for collection) and POSTs. In this case
GET /organizations/:id/environments/ for listing envs in an org
POST /organizations/:id/environments/ for creating new envs

2) Requiring two unique ids in routes
I guess the problem is understood and we all just differ in opinions.

Proposed solution is to get rid of the redundant ids:
GET /environments/:id/ for showing a single env
PUT /environments/:id/ for updates
DELETE /environments/:id/ for destroy

T.

> -Justin
>
>
>>
>>>
>>> I can understand your argument for predictability, but if I start
>>> querying the collection via
>>> /organization/ACME_Corporation/environments/, based on the principles
>>> of REST, I would expect that I can just add an ID to the end of that
>>> URL and acquire the specific resource.
>>
>> What principle[s] of REST do you refer to here?
>>
>> -d
>>
>>
>> _______________________________________________
>> katello-devel mailing list
>> katello-devel at redhat.com
>> https://www.redhat.com/mailman/listinfo/katello-devel
>
>
>
> _______________________________________________
> katello-devel mailing list
> katello-devel at redhat.com
> https://www.redhat.com/mailman/listinfo/katello-devel
>




More information about the katello-devel mailing list