On Sat, Apr 28, 2018 at 6:40 PM, Heldt-Sheller, Nathan <
nathan.heldt-shel...@intel.com> wrote:

> Hi Gregg,
>
>
>
> I’m thinking you’re mixing “safe” and “idempotent”.  There is some
> contention about how the term “idempotent” applies to RESTful interfaces,
> but the CoAP RFC at least clearly defines what is meant (“safe” means
> essentially no side-effects; “idempotent” means that there isn’t an
> order-dependency to operations on the RESTful interface… for more thorough
> description see the CoAP RFC).  In CoAP, the GET, DELETE and PUT methods
> are idempotent; the POST method is not.  If you think about that, it’s
> sensible: you don’t want DELETE(r1), DELETE(r2) to have a different outcome
> than DELETE(r2), DELETE(r1) because UDP.
>

I guess this is a little off-topic for OCF, but it's interesting (at least
to me) so here goes:

I am not mixing "safe" and "idempotent". I am challenging the entire
paradigm. I think it is fundamentally and irredeemably broken. Mainly
because it's trying to apply a computational model (Turing/Lambda) that is
entirely inappropriate. Also because, intellectually, it's unbelievably
sloppy,

>From RFC 7252:


"CoAP supports the basic methods of GET, POST, PUT, and DELETE, which
   are easily mapped to HTTP.  They have the same properties of safe
   (only retrieval) and idempotent (you can invoke it multiple times
   with the same effects) as HTTP (see Section 9.1 of [RFC2616]
<https://tools.ietf.org/html/rfc2616#section-9.1>).  The
   GET method is safe; therefore, it MUST NOT take any other action on a
   resource other than retrieval."



RFC 2616:

'In particular, the convention has been established that the GET and

   HEAD methods SHOULD NOT have the significance of taking an action
   other than retrieval. These methods ought to be considered "safe".'


But this is meaningless.  What the hell does "retrieval" mean, anyway?
Retrieval of what, exactly?



> But back to the GET method (because the others are a tangent): the GET
> method must be “safe” (that is, no side-effects) and therefore altering the
> Resource on GET.  That is **not** the same, of course, as saying two GETs
> must return the same value.  Thus your Hue example isn’t really right… the
> GET method will reflect the current state of the Device, which may change,
> but NOT as a result of the GET itself.
>

Sorry, I don't think that works.  Ethan's use case is precisely one in
which a GET may cause a change of state.

Look at it this way: Turing (functional) computing involves white
(transparent) boxes.  Interactionist computing involves black (opaque)
boxes.  In the latter case, the internal state of a black box is
off-limits, therefore we have no business placing constraints on the
effects of actions on black-box state.  You send a GET (or a PUT, or
whatever), and you get a response. That is all.  What the receiving
black-box does with the GET - other than responding -  is none of your
business.

I'll answer my own question: "retrieval" is meaningless. Actually, it's
bullshit: you can take "retrieval" to mean whatever you want it to mean,
including changing state before returning the "result" of "retrieval".


>   Your GetNextIterator() example is therefore illegal in CoAP’s definition
> of RESTful GET… you would need a different interface definition to separate
> the GET from the POST (increment).
>

Where did GetNextIterator() come from? Not my example.

>
>
> In any case, as I said to begin with: Ethan’s use case is okay, as long as
> the results of GET to /oic/res aren’t changed by his side-effect functions
> that are triggered by GET to /oic/res.  E.g. kicking off an unrelated
> operation would be fine; modifying /oic/res would not.
>

Huh? What does "results of GET to /oic/res aren't changed" mean? How can
"results" ever change? You send a GET, you get a result. You send another
GET, you get another result. There is no change there.

Regarding "modifying /oic/res": what does that even mean?  It's just a
Resource; why should it be immutable?  Again, you send a GET, you get a
result.  What happens on the server side is totally irrelevant from the
client perspective - it's a black box, if the server wants to change its
internal state in response to a GET, who cares? You get a response, end of
story.  More importantly: nobody can do anything about it.  The OCF
protocol  can legislate messaging; it cannot (and should not try to)
legislate the internal processing of OCF black boxes.  It's a protocol, not
a computational model.

-Gregg

>
_______________________________________________
iotivity-dev mailing list
iotivity-dev@lists.iotivity.org
https://lists.iotivity.org/mailman/listinfo/iotivity-dev

Reply via email to