- From: Markus Lanthaler <markus.lanthaler@gmx.net>
- Date: Wed, 17 Sep 2014 22:58:26 +0200
- To: <public-hydra@w3.org>
On Wed, 17 Sep 2014 19:06:32 +0100, Kev Kirkland wrote:
> [Replying to this in Web mail, I hope the inline comments look right
> otherwise I'll repost]
It's ok but text-only mails are generally preferred for various reasons.
>> An alternative would be to model this as a workflow so that you
>> explicitly state what the next valid step(s) are. Something like:
>>
>> OrderWorkflow
>> --- firstStep --> WorkflowStep [Payment]
>> ---> describes operation to execute this step
>> on success returns new WorkflowStep [Address]
>>
>> It might actually be interesting to integrate something like that
>> into Hydra. I created ISSUE-70 [1] so that we don't forget this.
>
> The case I'm thinking of involves routing (the steps are different
> depending on the user's choices as they go through the process) so
> Workflow might not be applicable (you probably don't want to make
> lots of workflows to cover all the permutations). However it might
What I described above, doesn't mean that you have to describe the
complete workflow a-priori. It was more intended to give you a
framework to communicate workflow steps at runtime. You start by
saying that ordering involves a workflow and how the first step looks
like. All subsequent steps are returned in response to the issued HTTP
requests.
> be useful for another user case I have in mind - editing a smaller
> portion of whole. I'll post this use case in a new email when I get
> round to it to avoid confusion.
OK
>>> ... how would the client know it needs to prompt the Hydra client
>>> for more information?
>>
>> Your client would need to be aware of the process
>
> I've thought of a way to focus on the problem using an analogy from
> Mike Amundsen's API book [1]. When explaining HTTP 303 codes Mike
> uses the following story:
>
> *You go to a pharmacy with a prescription to be filled. A 303 is
> **the pharmacist saying “We’ve filled your prescription. Go to the
> next window to pick **up your medicine.”*
That works only to a certain degree. A 303 simply redirects you to a
different resource. Your client needs to be smart enough to know how
to interpret that resource and how to proceed from there to achieve
its goal.
> The situation I have in mind is the pharmacist saying "We've filled
> your prescription. Go to the next window and fill in a new form"
> (Maybe you have to fill in a new form saying you accept the risks of
> taking the medicine before it's given to you.) HTTP 303 tells us to
> 'go to the next' window, but it can't tell us to 'fill in the form'
> when we get there. I think this is a situation where Hydra can help.
Right. That's the scenario I had in mind with my workflow proposal.
The server basically informs the client upfront that multiple steps
might be required to achieve a certain goal and that it will guide the
client. Then, after each step, the server sends instructions for the
next step (a new workflow step).
> Stepping back a moment, I like what Mike calls 'The semantic
> challenge' for Hypermedia APIs. When using a website we (as a human)
> get clues that we need to keep supplying information when going
> through a process (like filling in forms during the order process in
> the original post). When we submit a form and see another form in
> front of us we think, 'OK, I need to fill this out form too so I can
> get to the end'. There may be other clues like some text saying
> 'step 1 of 3'. I guess the challenge is reproducing this in a
> Hypermedia API. How does a machine know that it is supposed to keep
> supplying information (until the server tells it it's got enough)?
Exactly. There are basically two solutions: either you make your
client smarter by teaching it more about the application domain (there
are orders, orders may require payment information and a shipping
address, etc.) or you generalize this teach your client how to execute
what I called a "workflows".
> I think the solution you mention below does this (if I interpret it
> correctly). That is we return a representation that has a single
> Hydra operation and the single operation is to POST some information
> using a SupportedClass?
Right. Your client, however, would also need to know that it has to
make a payment to complete an order (although it would be nice to be
able to order things without having to pay :-)
>> ... I would simply embed the operations in its representation
>> {
>> ...
>> "@type": "Order",
>> "operation": {
>> "method": "POST",
>> "label": "Make payment",
>> "expects": "vocab:PaymentDetails",
>> "returns": "vocab:Order"
>> }
>> }
>>
>> As soon as the user made the payment, you replace that operation
>> with an operation to set the address.
>
> The client would automatically go into 'form mode' when it sees that
> there is only one POST operation available (if it's a UI type
> client).
Yeah, that's one heuristic you could use.
>>> I'm building a Hydra Javascript client which mimics a Single Page Web
>>> Application
>>
>> Awesome! Do you already have something you can share with us?
>
> Certainly happy to share. I just need to tidy up a few things before
> releasing it (it uses a hard coded API Doc url at the moment). I'll
> supply some more information when I release it, but I wanted to make
> a client that was purely javascript (I'm clueless when it comes to
> PHP!), that works like a Single Page Application and has features
> like forward/backward navigation using the browser buttons. Also a
> good way to really learn about the spec!
That sounds super interesting. I'm really look forward to learn more
about it soon.
>> Btw. it would be great if you could join the Hydra W3C Community
>> Group
>
> Done!
Fantastic. Welcome on board! :-)
Cheers,
Markus
--
Markus Lanthaler
@markuslanthaler
Received on Wednesday, 17 September 2014 20:59:00 UTC