[occi-wg] JSON Rendering proposal, rev 2
Ralf Nyren
ralf at nyren.net
Wed Feb 29 06:11:41 EST 2012
On Wed, 29 Feb 2012 09:36:50 +0100, <alexander.papaspyrou at tu-dortmund.de>
wrote:
>> I have tried to incorporate much of the feedback received so far. Short
>> summary:
>> - Use separate media-types for rendering the different payload
>> contents. Inspired from Florians references to the CDMI spec.
>
> I'm not sure whether I really like the different media types, and I
> think it could be done without. This would make the content type
> negotiation easier, if you consider clients that handle different
> renderings at the same time in conjunction with servers that deliver
> several different renderings.
Sure, the media-type negotiation will involve a few more bytes in the
Accept header but I don't see that as such a big deal. But lets leave that
issue for the moment and just look at the payload _received_ by a server
or client.
The HTTP protocol's use of Accept and Content-Type headers basically work
like this:
Client: Give me the content of this URL, I can handle (Accept) this list
of different formats (media-types) and I really prefer you to use format X
or Y if you can, please.
Server: Look at content pointed to by URL and try to return something that
satisfies the client.
Client: Look at the Content-Type and apply decoding/processing based on
media-type alone.
So, essentially the Client do not know what the Server will return. The
media-type should be enough to tell the Client what to do with the
payload. I rather have it that the Client does not have to poke around
within the payload to figure out what to do with it (e.g. the html
rendering mess).
> If we go for HTTP-based usage of the JSON rendering, it should just be
> application/json.
No, I disagree. By saying application/json the receiver only knows about
the syntax. Let's say you get a bunch of data with media-type
application/json. Ok, you can decode the json data but then what? You have
no clue about the semantics of the format. I believe there is a reason
that the Atom Syndication Format use media type application/atom+xml and
not just application/xml.
If you happen to be a browser you just throw the json structures at the
user and let him figure out what it means. For OCCI however your typical
client may be a machine and then it needs to know how to interpret the
json structures.
So at a minimum we should say application/occi+json. But in that case we
need something in the json structures to say e.g. "format": "entity" vs
"format": "discover" in order to distinguish between the different data
representation formats. And no, I don't want the one-format-fits-all we
did for the HTTP rendering. Therefore I vote on having separate
media-types for each data representation format.
> This brings me to the second issue I have: I don't think that it is a
> good idea to mix JSON data rendering, and the introduction of a
> JSON-based protocol. I am perfectly fine with the former, but for the
> latter, we really have HTTP. This might require certain modifications to
> the HTTP core API (although I wouldn't bet for it without checking), but
> it would keep things nicely separate.
This is a very good point, I agree we should avoid creating a JSON
protocol.
However, we do not have a clean OCCI HTTP Protocol spec today. The HTTP
Rendering doc is a happy mix of both protocol and data format stuff. Since
much of the multi-resource support was added in a hurry just before public
comment there are things in there that does not fully work with the JSON
rendering. No big issues a client would be affected by but enough that I
cannot use it as a basis for the JSON rendering spec.
If people do not disagree I would be glad to create a clean "OCCI HTTP
Protocol" doc totally free of any payload or header rendering data
formats. Then the JSON and text/xxx renderings could be built on top of
it. I.e. a clean separation between data format and protocol. We could
call it occi/1.2 and have it backward compatible with occi/1.1. Any
objections to that? ;)
> Besides that, there is no reason forcing to use JSON over HTTP, if they
> don't want to: replacing the "href" by an URI (and maybe renaming it to
> "location" would allow for broader use of the JSON data rendering; and
> everything else is pretty agnostic of HTTP and friends.
Ok, renaming "href" back to "uri" then. Good proof you actually read the
details :D
(mind-note to add other small obscure changes in next rev just to see if
people notice...)
What to call the category identifier? I used "rel" now based on the HTTP
way of doing things. Any better naming suggestions, "type" ? [1]
> And btw.: HTTP gives us all we need to do the protocol part; the
> RESTfulness lies in there, anyway. Therefore, the interaction part
> should be described there, agnostic of the content-type (after all,
> that's what HTTP is about). That way, people could implement the HTTP
> protocol rendering once, and reuse it for several OCCI data renderings.
Agreed on that. Support my proposal on an OCCI HTTP Protocol doc above :)
>> - Try to make the single-instance format more lightweight and not
>> duplicating any information available through the discovery interface.
>> Thanks Jamie.
>
> That actually I like very much. It might be nice to think about a
> shallow/deep rendering option on the protocol level, but that's just a
> thought.
If you are referring to all the white-space in the examples it is just
there for readability. I should put in a note that a server/client should
remove all unnecessary white-space for real communication.
If not, please elaborate.
>> - Use the "marker" concept from OpenStack for pagination as suggested
>> by Andy.
>
> This is also something that should be taken care of in the protocol,
> rather than the data format. Why on earth would people want to see this
> if the protocol they use only delivers batches of things? And in fact,
> looking at the spec, it has been done on the HTTP level, anyway.
It is done both on the HTTP level (query parameters) and in the payload :-\
Is it just the "next" and "limit" members you want removed from the
collection format? Anything else you deem to be protocol stuff?
I guess we could put the "next" link in a Link header and actually use
RFC5988 as it was meant to be used (as opposed to how we abused it in
text/occi rendering). We have to verify if browsers would choke on this
though and it makes life a bit harder for JavaScript implementations which
would need to parse the Link headers. Other ideas?
> Frankly, this should be something to be added to the HTTP protocol
> rendering and made available to all data representations, rather than in
> a proprietary, JSON-specific way only.
Agreed, with reservation for possible browser problems...
>> - "range" and "default" attribute properties as requested by Florian.
>
> Great idea. We might want to consider pushing this upstream to core.
That was my intention. I have long wanted to have the "default" property
into Core since without it a client cannot create custom templates.
Thanks for the feedback Alex. More of this and we might have something to
publish in not a too distant future.
/Ralf
[1] http://martinfowler.com/bliki/TwoHardThings.html
More information about the occi-wg
mailing list