- From: David Janes <davidjanes@davidjanes.com>
- Date: Wed, 3 Jun 2015 16:06:59 -0400
- To: Vlad Trifa <vladounet@gmail.com>
- Cc: "public-web-of-." <public-web-of-things@w3.org>
- Message-ID: <CACp1KyPKewtGTr5ePEn6xyORgLEtrt58f_kDL2ya+gcbeLwuiw@mail.gmail.com>
__ REST / Actions __ (sorry, gmail won't let me change the Subject:)
Thanks, I get what you're saying I'm pretty sure.
1)
You're still using a verb (changestatus) in the URL. So this is
non-RESTful.
See anti-patterns on this page:
http://www.restapitutorial.com/lessons/restfulresourcenaming.html
2)
You've now created _another_ resource to be monitored - "
http://mydoorlock.com/lock29/actions/changestatus/66373". When do you
dispose of it?
Note that this is another REST violation, as the server has to know that
someone may be interested in what happened due to a request in the pass.
It's not stateless:
http://en.wikipedia.org/wiki/Representational_state_transfer#Stateless
3)
How does a third party know that "http://mydoorlock.com/lock29/
<http://mydoorlock.com/lock29/actions/changestatus/66373>" is being
manipulated at this time? Do I have to list what's at "
http://mydoorlock.com/lock29/actions/changestatus
<http://mydoorlock.com/lock29/actions/changestatus/66373>" and check every
one of the children? If I only get a list of "active request" children,
does the server have to remember I was interested in this in case I check
back to see how they worked out?
4)
Is this not RPC? Does not the resource "
http://mydoorlock.com/lock29/actions/changestatus/66373" represent the
end-to-end request, response, status of a particular action request?
D.
On Wed, Jun 3, 2015 at 8:48 AM, Vlad Trifa <vladounet@gmail.com> wrote:
> Hey David,
>
> I partially agree with this.
>
> I'll rarely need to get the metadata of what properties & co are, so they
> obviously shouldn't be returned every time, and that's why you'd call the
> end-point below only once (to discover it and understand it). Then you'll
> only need to interact with ".../sensors/humidity" directly where you don't
> get that data model anymore - but just the definition.
>
> I'm not OK with the idea that any property and sensor MUST use JSON-LD. If
> we can all agree here on one basic model that is good enough and
> sufficiently flexible to deal with (yes, you are introducing some coupling,
> which you're doing with JSON-LD anyway, and even more so), then I don't
> need JSON-LD.
>
> But I'm obviously OK with the idea that any device can (and even should)
> expose its services with json-id so that it has more flexibility to expose
> metadata & co and more (non-wot) clients can also process it.
>
>
> Now, where I disagree is the "actions" model is RPC and non-RESTful. This
> is most likely because I didn't explain them well, so let's see:
>
> Doing a PUT .../actions/lockdoor is indeed non-RESTful (or worse: GET
> .../actions/lockdoor?lock=true ---> horrible, I know!!), because you're
> putting rpc semantics in the URL. That's bad!
>
> BUT, this is *not* how actions work!
>
> When you do an action, you're creating a REST resource (so you MUST use
> POST), and this resource is a "request to do something" (that might happen
> or not).
>
> The way you'd unlock the door would look like this:
>
> POST http://mydoorlock.com/lock29/actions/changestatus
> {
> "status":"lock"
> }
>
> 202 ACCEPTED (or 201 CREATED, if instantaneous)
> Location: http://mydoorlock.com/lock29/actions/changestatus/66373
>
> Then you can retrieve this resource any later time and see whether it's
> been successfully executed or not. This has the added advantage that you
> naturally have a buffer where different clients can schedule several
> requests simultaneously (and the device decides when & how to schedule
> those), which is particularly helpful, clean, and RESTful.
>
> I'll happily sit down and watch you demonstrate what's not RESTful about
> this ;)
>
> What do you think?
>
>
> Vlad
>
>
>
> On 03 Jun 2015, at 00:50, David Janes <davidjanes@davidjanes.com> wrote:
>
> So just taking these as examples (make sure to add Accept:
> application/json)
>
> http://devices.webofthings.io/pi/sensors/
>
> "humidity": {
>
> "description": "A temperature sensor.",
>
> "frequency": 5000,
>
> "name": "Humidity Sensor",
>
> "timestamp": "2015-06-02T16:06:26.398Z",
>
> "type": "float",
>
> "unit": "percent",
>
> "value": 40.2
>
> },
>
> From IOTDB's POV, there's a bunch of stuff being mixed together here:
>
> The model, comprising the values: description, type, unit
> The metadata, comprising the value: name, frequency
> The ostate, comprising: timestamp, value
>
> In IOTDB world, the value record would look something like this:
>
> {
> "@context": "...",
> "value": 40.2,
> "timestamp": "2015-06-02T16:06:26.398Z",
> }
>
> @context is JSON-LD magic to provide meaning to "value" and "timestamp",
> defined in the Model (@vocab may be needed too, JSON-LD needs some
> tightening).
>
> The Model is then basically static, and the part that defines value e.g.
> looks like this
>
> {
> "@id": "#value",
> "iot:unit": "iot:float",
> "iot:purpose": "iot-attribute:sensor.humidity",
> }
>
> A lot of those iot: can be taken out, but you get used to it.
>
> Metadata is less frequently changing data and is to taste, but you'll note
> that the value will only reference the Model, not the Metadata.
> Furthermore, Metadata will typically draw it's definitions from the core
> vocab, rather than having to be defined on a case by case basis.
>
>
> D.
>
>
>
>
>
Received on Wednesday, 3 June 2015 20:07:50 UTC