SlideShare a Scribd company logo
Hydras	
  and	
  Hypermedia	
  
                              Ian	
  Robinson	
  




http://ianSrobinson.com	
  
@ianSrobinson	
  
ianSrobinson@gmail.com	
  
Your	
  friendly	
  neighbourhood	
  enterprise	
  
Meet	
  the	
  apps	
  




                    ERP	
     DMS	
  
And	
  their	
  alter	
  egos…	
  




              Wired	
  Erp	
         Dungeon	
  Master	
  
Fighting	
  Fantasy	
  
Pick	
  your	
  path	
  to	
  adventure	
  
The	
  goal…	
  


 Find	
  
 and	
  

 Defeat	
  

 E0920ba0'df0e-42a1-b304-a312c834fd62	
  	
  

       tyrannical	
  Lich-­‐Uuid	
  
 the	
  
The	
  plan…	
  


                   until	
  goal	
  achieved	
  
                     	
  while	
  healthy	
  
                     	
   	
  fight	
  
                     	
  |	
  flee	
  
                     	
  |	
  without	
  retracing	
  steps	
  
                     	
   	
  |	
  north	
  
                     	
   	
  |	
  east	
  
                     	
   	
  |	
  west	
  
                     	
   	
  |	
  south	
  
                     	
  |	
  investigate	
  
                     	
  |	
  retrace	
  steps	
  
Once	
  upon	
  a	
  time…	
  

                      POST /quests
                      Host: dms
                      Content-Type: application/prs.dms+xml
                      Content-Length: ...

                     <difficulty>intermediate</difficulty>


                                 HTTP/1.1 201 Created
                                 Content-Type: application/prs.dms+xml
                                 Location: http://dms/quests/1/locations/1
                                 Content-Length: ...


  <location>
    <title>Entrance</title>
    <summary>
      Your adventure begins as you descend a rope into a rubble-strewn hall.
      The air is cold and dank.
    </summary>
    <dimensions>
      <north-south>20</north-south>
      <east-west>20</east-west>
    </dimensions>
    <link rel="http://dms/north" type="application/prs.dms+xml" href="/quests/1/locations/2"/>
    <link rel="http://dms/east" type="application/prs.dms+xml" href="/quests/1/locations/3"/>
    <link rel="http://dms/west" type="application/prs.dms+xml" href="/quests/1/locations/4"/>
  </location>
Heading	
  north…	
  

                    GET /quests/1/locations/2 HTTP/1.1
                    Host: dms


                               HTTP/1.1 303 See Other
                               Content-Type: application/prs.dms+xml
                               Location: http://dms/quests/1/encounters/1
                               Content-Length: ...


    <link rel="related" type="application/prs.dms+xml" href="/quests/1/encounters/1"/>
When	
  frameworks	
  go	
  bad…	
  

                        GET /quests/1/encounters/1 HTTP/1.1
                        Host: dms


                                  HTTP/1.1 200 OK
                                  Content-Type: application/prs.dms+xml
                                  Content-Length: ...


<encounter>
  <title>Skeleton!</title>
  <summary>
    From out of the shadows lurches a skeleton brandishing a scimitar.
  </summary>
  <model>
    <instance rel="http://dms/attack">
      <intention>
        <attack>
           <weapon/>
           <strategy/>
        </attack>
      </intention>
    </instance>
    <submission resource="/quests/1/encounters/1/fight" method="POST" mediatype="application/prs.dms+xml"/>
  </model>
  <model>
    <instance rel="http://dms/flee">
      <intention>
        <flee/>
      </intention>
    </instance>
    <submission resource="/quests/1/encounters/1/flight" method="POST" mediatype="application/prs.dms+xml"/>
  </model>
</encounter>
Hacker…	
  

                      POST /quests/1/encounters/1/fight HTTP/1.1
                      Host: dms
                      Content-Type: application/prs.dms+xml
                      Content-Length: ...

                     <intention>
                       <attack>
                         <weapon>sword</weapon>
                         <strategy>slash</strategy>
                       </attack>
                     </intention>


                                 HTTP/1.1 201 Created
                                 Content-Type: application/prs.dms+xml
                                 Location: http://dms/quests/1/encounters/1/outcomes/1
                                 Content-Length: ...


  <outcome>
    <title>Success</title>
    <summary>
      The skeleton shatters and its scimitar clatters to the ground.
      Searching the fragments, you find a silver key.
    </summary>
    <items>
      <link type="application/prd.dms+xml" href="/quests/1/objects/1">silver key</link>
    </items>
    <link rel="next" type="application/prs.dms+xml" href="/quests/1/locations/2"/>
  </outcome>
Stone	
  door	
  

                      GET /quests/1/locations/2 HTTP/1.1
                      Host: dms


                                 HTTP/1.1 200 OK
                                 Content-Type: application/prs.dms+xml
                                 ETag: "FEC6956217C1"
                                 Content-Length: ...


 <location>
   <title>Stone door</title>
   <summary>
     The hall narrows, and you follow a low passage to a stone door with a deeply recessed keyhole.
   </summary>
   <dimensions>
     <north-south>15</north-south>
     <east-west>5</east-west>
   </dimensions>
   <link rel="http://dms/south" type="application/prs.dms+xml" href="/quests/1/locations/1"/>
   <model>
     <instance rel="http://dms/action">
       <intention>
         <unlock>
            <key/>
         </unlock>
       </intention>
     </instance>
     <submission resource="/quests/1/locations/2" method="POST" mediatype="application/prs.dms+xml"/>
   </model>
 </location>
But	
  we’ve	
  got	
  a	
  key…	
  

                       POST /quests/1/locations/2 HTTP/1.1
                       Host: dms
                       If-Match: "FEC6956217C1"
                       Content-Type: application/prs.dms+xml
                       Content-Length: ...

                      <intention>
                        <unlock>
                          <key>http://dms/quests/1/objects/1</key>
                        </unlock>
                      </intention>

                                  HTTP/1.1 412 Precondition Failed
What’s	
  going	
  on?	
  

                      GET /quests/1/locations/2 HTTP/1.1
                      Host: dms
                      If-None-Match: "FEC6956217C1"


                                 HTTP/1.1 200 OK
                                 Content-Type: application/prs.dms+xml
                                 ETag: "6809E4D87D43"
                                 Content-Length: ...


 <location>
   <title>Stone door</title>
   <summary>
     You're standing in front of a stone door with a deeply recessed keyhole.
     Electricity crackles around the keyhole.
   </summary>
   <dimensions>
     <north-south>15</north-south>
     <east-west>5</east-west>
   </dimensions>
   <link rel="http://dms/south" type="application/prs.dms+xml" href="/quests/1/locations/1"/>
   <model>
     <instance rel="http://dms/action">
       <intention>
         <unlock>
            <key/>
         </unlock>
       </intention>
     </instance>
     <submission resource="/quests/1/locations/2" method="POST" mediatype="application/prs.dms+xml"/>
   </model>
 </location>
Wait…	
  

            GET /quests/1/locations/2 HTTP/1.1
            Host: dms
            If-None-Match: "6809E4D87D43"


                      HTTP/1.1 304 Not Modified
Wait…	
  

                      GET /quests/1/locations/2 HTTP/1.1
                      Host: dms
                      If-None-Match: "6809E4D87D43"


                                 HTTP/1.1 200 OK
                                 Content-Type: application/prs.dms+xml
                                 ETag: "871CDA1C9935"
                                 Content-Length: ...


 <location>
   <title>Stone door</title>
   <summary>
     You're standing in front of a stone door with a deeply recessed keyhole.
   </summary>
   <dimensions>
     <north-south>15</north-south>
     <east-west>5</east-west>
   </dimensions>
   <link rel="http://dms/south" type="application/prs.dms+xml" href="/quests/1/locations/1"/>
   <model>
     <instance rel="http://dms/action">
       <intention>
         <unlock>
            <key/>
         </unlock>
       </intention>
     </instance>
     <submission resource="/quests/1/locations/2" method="POST" mediatype="application/prs.dms+xml"/>
   </model>
 </location>
Now!	
  

                     POST /quests/1/locations/2 HTTP/1.1
                     Host: dms
                     If-Match: "871CDA1C9935"
                     Content-Type: application/prs.dms+xml
                     Content-Length: ...

                     <intention>
                       <unlock>
                         <key>http://dms/quests/1/objects/1</key>
                       </unlock>
                     </intention>


                                HTTP/1.1 201 Created
                                Content-Type: application/prs.dms+xml
                                Location: http://dms/quests/1/locations/2/outcomes/1
                                Content-Length: ...


  <outcome>
    <title>Success</title>
    <summary>
      The key turns in the lock and the door grinds open.
      Beyond, a flight of steep steps lead down into the darkness.
      A blast of warm, fetid air issues from below, followed by an inhuman shriek.
    </summary>
    <link rel="related" type="application/prs.dms+xml" href="/quests/1/locations/2"/>
    <link rel="http://dms/north" type="application/prs.dms+xml" href="/quests/1/locations/5"/>
    <link rel="http://dms/south" type="application/prs.dms+xml" href="/quests/1/locations/1"/>
  </outcome>
Leonard	
  Richardson's	
  Web	
  service	
  maturity	
  heuristic	
  


          What?	
                            Why?	
                       How?	
  

                                        Spreads	
  complexity	
              URIs	
  
    Divide	
  and	
  conquer	
  
                                        around	
  


              Refactor	
  
     (Do	
  the	
  same	
  things	
     Reduces	
  complexity	
              HTTP	
  
      in	
  the	
  same	
  way)	
  


       Describe	
  special	
  
                                        Makes	
  complexity	
             Hypermedia	
  
       behaviour	
  in	
  a	
  
                                        learnable	
  
       standard	
  way	
  


                                                             http://www.crummy.com/writing/	
  
HATEOAS	
  –	
  the	
  riddle	
  of	
  the	
  Sphinx	
  



            Hypermedia	
  
            as	
  
            the	
  
            Engine	
  
            of	
  
            Application	
  
            State	
  
Some	
  definitions…	
  



           Application	
  protocol	
  




                                                                                                                Application	
  state	
  

Photo	
  taken	
  from	
  Twissie’s	
  Flickr	
  stream	
  under	
  the	
  Creative	
  Commons	
  licence	
  
Application	
  protocol	
  state	
  machine	
  


                                             GET
           POST
                         exploring                 confronting
                         entrance                    skeleton

                                                                 POST
                                             GET

                        investigating              triumphant
                            door


              POST

                         standing at
                        top of steps
Reality	
  intermission	
  



                                  request quote


                           quote
                           requested

                                   place order


                              goods
                              ordered             cancel order

                 fulfill order


                            order                     order
                            completed                 cancelled
Hypermedia	
  systems	
  transform	
  application	
  state	
  

                       <encounter>
                         <title>Skeleton!</title>
                         <summary>
                           From out of the shadows lurches a skeleton brandishing a scimitar.
                         </summary>
                         <model>
                           <instance rel="http://dms/attack">
                              <intention>
                                <attack>
                    <outcome>     <weapon/>
                      <title>Success</title>
                                  <strategy/>
                      <summary> </attack>
                        The skeleton shatters and its scimitar clatters to the ground.
                              </intention>
                        Searching the fragments, you find a silver key.
                           </instance>
                      </summary>
                           <submission resource="/quests/1/encounters/1"
                      <items> method="POST" mediatype="application/prs.dms+xml"/>
                        <link type="application/prd.dms+xml"
                         </model>
                          href="/quests/1/objects/1">silver key</a:link>
                         <model>
                      </items>
                           <instance rel="http://dms/flee">
                      <link rel="next" type="application/prs.dms+xml"
                              <intention>
                        href="/quests/1/locations/2"/>
                                <flee/>
                    </outcome></intention>
                           </instance>
                           <submission resource="/quests/1/encounters/1"
                             method="POST" mediatype="application/prs.dms+xml"/>
                         </model>
                       </encounter>




                                                                POST /quests/1/encounters/1 HTTP/1.1
                                                                GET /quests/1/encounters/1 HTTP/1.1
                                                                <intention>
                                                                  <attack>
                                                                    <weapon>sword</weapon>
                                                                    <strategy>slash</strategy>
                                                                  </attack>
                                                                </intention>
Anatomy	
  of	
  a	
  hypermedia	
  control	
  	
  

                   <link
                     rel="http://dms/north"
                     type="application/prs.dms+xml"
                     href="/quests/1/locations/2"
                     />


      Semantic	
  context	
  
      WHY	
  access	
  the	
  linked	
  
      resource?	
                                                      Interpretation	
  
                                                             WHAT	
  form	
  does	
  the	
  
                                                             linked	
  resource	
  take?	
  
                                  Address	
  
                                  WHERE	
  does	
  the	
  
                                  linked	
  resource	
  
                                  reside?	
  
Media	
  type	
  is	
  a	
  key	
  into	
  an	
  interpretative	
  scheme	
  




                                                  Schemas	
  

            Hypermedia	
  controls	
  


                                          Processing	
  model	
  
           Link	
  relations	
  
Archaeology	
  of	
  an	
  application	
  protocol	
  




      Why?	
                            How?	
           What?	
  

  Link	
  relations	
               HTTP	
  idioms	
     Media	
  types	
  
Manipulate	
  resources	
  using	
  HTTP	
  idioms	
  



   <submission resource="/quests/1/locations/2"
     method="POST" mediatype="application/prs.dms+xml"/>




               OPTIONS /quests/1/locations/2 HTTP/1.1
               Host: dms


                              HTTP/1.1 200 OK
                              Allow: GET, POST




                                                 HTTP/1.1 200 OK
                                                 Content-Type: application/prs.dms+xml
                                                 ETag: "871CDA1C9935"
                                                 Content-Length: ...


                                                 HTTP/1.1 303 See Other
                                                 Content-Type: application/prs.dms+xml
                                                 Location: http://dms/quests/1/encounters/1
                                                 Content-Length: ...
Down	
  in	
  the	
  dungeons…	
  

             http://dms/quests/1/locations/2
                http://dms/quests/1/encounters/1
          http://dms/quests/1/encounters/1/outcomes/1



                                    guarded by                    involves


                Location                                                                           Skeleton
                                                                Encounter
                                                                                                    dead-
      guarded   unguarded                                                                 undead
                                                                                                    dead



                                      unresolved    resolving     resolved




                                                                                    resolved by
                    modifies
                                                                                                    affects


                                      Outcome                                Intention


                               determined          determines       declared
Design	
  and	
  implementation	
  guidelines	
  
Equipping	
  the	
  client	
  



     Capability	
                                    Description	
  
            HTTP	
  client	
          Implement	
  HTTP	
  idioms	
  (eg.	
  conditional	
  GET).	
  


                                      Parse/	
  assemble	
  hypermedia	
  representations;	
  
      Media	
  type	
  handlers	
  
                                      surface	
  hypermedia	
  controls.	
  

       Evaluate	
  semantic	
         Understand	
  semantic	
  context	
  for	
  controls	
  in	
  
            context	
                 relation	
  to	
  client	
  goal.	
  

      Choose	
  and	
  activate	
     Decide	
  on	
  next	
  transition	
  based	
  on	
  goal,	
  
           control	
                  application	
  state	
  and	
  available	
  transitions.	
  


               Cache	
                Client-­‐side	
  caching,	
  including	
  revalidation	
  
Hypermedia	
  and	
  Systems	
  Architecture	
  


              How	
  to	
  GET	
  a	
  Cup	
  of	
  Coffee	
  
              http://www.infoq.com/articles/webber-­‐rest-­‐workflow	
  




                            Jim	
  Webber	
                                                      Savas	
  Parastatidis	
     Ian	
  Robinson	
  
Photos	
  taken	
  from	
  ElDave’s	
  Flickr	
  stream	
  under	
  the	
  Creative	
  Commons	
  licence	
  
Thank	
  you	
  




http://ianSrobinson.com	
  
@ianSrobinson	
  
ianSrobinson@gmail.com	
  

More Related Content

Similar to Hydras And Hypermedia

Building Windows 8 Apps with Windows Azure
Building Windows 8 Apps with Windows AzureBuilding Windows 8 Apps with Windows Azure
Building Windows 8 Apps with Windows AzureSupote Phunsakul
 
Performance optimization - Advanced techniques
Performance optimization - Advanced techniquesPerformance optimization - Advanced techniques
Performance optimization - Advanced techniquesFilip Mares
 
OpenWeb Discovery
OpenWeb DiscoveryOpenWeb Discovery
OpenWeb Discovery
James Walker
 
#NewMeetup Performance
#NewMeetup Performance#NewMeetup Performance
#NewMeetup PerformanceJustin Cataldo
 
Microformats, Institute of Engineering and Technology
Microformats, Institute of Engineering and TechnologyMicroformats, Institute of Engineering and Technology
Microformats, Institute of Engineering and TechnologyNishikant Taksande
 
OpenERP e l'arte della gestione aziendale con Python
OpenERP e l'arte della gestione aziendale con PythonOpenERP e l'arte della gestione aziendale con Python
OpenERP e l'arte della gestione aziendale con Python
PyCon Italia
 
AD102 - Break out of the Box
AD102 - Break out of the BoxAD102 - Break out of the Box
AD102 - Break out of the Box
Karl-Henry Martinsson
 
Nick harris-sic-2011
Nick harris-sic-2011Nick harris-sic-2011
Nick harris-sic-2011
Seattle Interactive Conference
 
Makroekonomi topik-8-1
Makroekonomi topik-8-1Makroekonomi topik-8-1
Makroekonomi topik-8-1020881
 
Terraform 0.9 + good practices
Terraform 0.9 + good practicesTerraform 0.9 + good practices
Terraform 0.9 + good practices
Radek Simko
 
Espacios en-tu-vida
Espacios en-tu-vidaEspacios en-tu-vida
Espacios en-tu-vidaepacheco1
 
Delivering Go.CD with Terraform and Docker
Delivering Go.CD with Terraform and DockerDelivering Go.CD with Terraform and Docker
Delivering Go.CD with Terraform and Docker
Jorrit Salverda
 
Microsoft Accademic Cloud Tour Genova
Microsoft Accademic Cloud Tour GenovaMicrosoft Accademic Cloud Tour Genova
Microsoft Accademic Cloud Tour Genovaantimo musone
 
HTML5 Essentials
HTML5 EssentialsHTML5 Essentials
HTML5 Essentials
Marc Grabanski
 
Defcon 22-blake-self-cisc0ninja-dont-ddos-me-bro
Defcon 22-blake-self-cisc0ninja-dont-ddos-me-broDefcon 22-blake-self-cisc0ninja-dont-ddos-me-bro
Defcon 22-blake-self-cisc0ninja-dont-ddos-me-bro
Priyanka Aash
 
.Net debugging 2017
.Net debugging   2017.Net debugging   2017
.Net debugging 2017
Tess Ferrandez
 
Enhancing mobile applications with Windows Azure
Enhancing mobile applications with Windows AzureEnhancing mobile applications with Windows Azure
Enhancing mobile applications with Windows Azure
Karl Ots
 
Understanding the Node.js Platform
Understanding the Node.js PlatformUnderstanding the Node.js Platform
Understanding the Node.js Platform
Domenic Denicola
 

Similar to Hydras And Hypermedia (20)

Building Windows 8 Apps with Windows Azure
Building Windows 8 Apps with Windows AzureBuilding Windows 8 Apps with Windows Azure
Building Windows 8 Apps with Windows Azure
 
Performance optimization - Advanced techniques
Performance optimization - Advanced techniquesPerformance optimization - Advanced techniques
Performance optimization - Advanced techniques
 
OpenWeb Discovery
OpenWeb DiscoveryOpenWeb Discovery
OpenWeb Discovery
 
#NewMeetup Performance
#NewMeetup Performance#NewMeetup Performance
#NewMeetup Performance
 
Microformats, Institute of Engineering and Technology
Microformats, Institute of Engineering and TechnologyMicroformats, Institute of Engineering and Technology
Microformats, Institute of Engineering and Technology
 
OpenERP e l'arte della gestione aziendale con Python
OpenERP e l'arte della gestione aziendale con PythonOpenERP e l'arte della gestione aziendale con Python
OpenERP e l'arte della gestione aziendale con Python
 
AD102 - Break out of the Box
AD102 - Break out of the BoxAD102 - Break out of the Box
AD102 - Break out of the Box
 
Nick harris-sic-2011
Nick harris-sic-2011Nick harris-sic-2011
Nick harris-sic-2011
 
Makroekonomi topik-8-1
Makroekonomi topik-8-1Makroekonomi topik-8-1
Makroekonomi topik-8-1
 
Terraform 0.9 + good practices
Terraform 0.9 + good practicesTerraform 0.9 + good practices
Terraform 0.9 + good practices
 
Espacios en-tu-vida
Espacios en-tu-vidaEspacios en-tu-vida
Espacios en-tu-vida
 
Delivering Go.CD with Terraform and Docker
Delivering Go.CD with Terraform and DockerDelivering Go.CD with Terraform and Docker
Delivering Go.CD with Terraform and Docker
 
Intro to JavaScript
Intro to JavaScriptIntro to JavaScript
Intro to JavaScript
 
Microsoft Accademic Cloud Tour Genova
Microsoft Accademic Cloud Tour GenovaMicrosoft Accademic Cloud Tour Genova
Microsoft Accademic Cloud Tour Genova
 
HTML5 Essentials
HTML5 EssentialsHTML5 Essentials
HTML5 Essentials
 
Devices + Cloud: Using Windows Azure with Windows Phone, iOS, Android, ...
Devices + Cloud: Using Windows Azure with Windows Phone, iOS, Android, ...Devices + Cloud: Using Windows Azure with Windows Phone, iOS, Android, ...
Devices + Cloud: Using Windows Azure with Windows Phone, iOS, Android, ...
 
Defcon 22-blake-self-cisc0ninja-dont-ddos-me-bro
Defcon 22-blake-self-cisc0ninja-dont-ddos-me-broDefcon 22-blake-self-cisc0ninja-dont-ddos-me-bro
Defcon 22-blake-self-cisc0ninja-dont-ddos-me-bro
 
.Net debugging 2017
.Net debugging   2017.Net debugging   2017
.Net debugging 2017
 
Enhancing mobile applications with Windows Azure
Enhancing mobile applications with Windows AzureEnhancing mobile applications with Windows Azure
Enhancing mobile applications with Windows Azure
 
Understanding the Node.js Platform
Understanding the Node.js PlatformUnderstanding the Node.js Platform
Understanding the Node.js Platform
 

More from Skills Matter

5 things cucumber is bad at by Richard Lawrence
5 things cucumber is bad at by Richard Lawrence5 things cucumber is bad at by Richard Lawrence
5 things cucumber is bad at by Richard Lawrence
Skills Matter
 
Patterns for slick database applications
Patterns for slick database applicationsPatterns for slick database applications
Patterns for slick database applications
Skills Matter
 
Scala e xchange 2013 haoyi li on metascala a tiny diy jvm
Scala e xchange 2013 haoyi li on metascala a tiny diy jvmScala e xchange 2013 haoyi li on metascala a tiny diy jvm
Scala e xchange 2013 haoyi li on metascala a tiny diy jvm
Skills Matter
 
Oscar reiken jr on our success at manheim
Oscar reiken jr on our success at manheimOscar reiken jr on our success at manheim
Oscar reiken jr on our success at manheimSkills Matter
 
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...
Skills Matter
 
Cukeup nyc ian dees on elixir, erlang, and cucumberl
Cukeup nyc ian dees on elixir, erlang, and cucumberlCukeup nyc ian dees on elixir, erlang, and cucumberl
Cukeup nyc ian dees on elixir, erlang, and cucumberl
Skills Matter
 
Cukeup nyc peter bell on getting started with cucumber.js
Cukeup nyc peter bell on getting started with cucumber.jsCukeup nyc peter bell on getting started with cucumber.js
Cukeup nyc peter bell on getting started with cucumber.js
Skills Matter
 
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...
Skills Matter
 
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...
Skills Matter
 
Progressive f# tutorials nyc don syme on keynote f# in the open source world
Progressive f# tutorials nyc don syme on keynote f# in the open source worldProgressive f# tutorials nyc don syme on keynote f# in the open source world
Progressive f# tutorials nyc don syme on keynote f# in the open source world
Skills Matter
 
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...
Skills Matter
 
Dmitry mozorov on code quotations code as-data for f#
Dmitry mozorov on code quotations code as-data for f#Dmitry mozorov on code quotations code as-data for f#
Dmitry mozorov on code quotations code as-data for f#
Skills Matter
 
A poet's guide_to_acceptance_testing
A poet's guide_to_acceptance_testingA poet's guide_to_acceptance_testing
A poet's guide_to_acceptance_testing
Skills Matter
 
Russ miles-cloudfoundry-deep-dive
Russ miles-cloudfoundry-deep-diveRuss miles-cloudfoundry-deep-dive
Russ miles-cloudfoundry-deep-diveSkills Matter
 
Simon Peyton Jones: Managing parallelism
Simon Peyton Jones: Managing parallelismSimon Peyton Jones: Managing parallelism
Simon Peyton Jones: Managing parallelism
Skills Matter
 
I went to_a_communications_workshop_and_they_t
I went to_a_communications_workshop_and_they_tI went to_a_communications_workshop_and_they_t
I went to_a_communications_workshop_and_they_tSkills Matter
 

More from Skills Matter (20)

5 things cucumber is bad at by Richard Lawrence
5 things cucumber is bad at by Richard Lawrence5 things cucumber is bad at by Richard Lawrence
5 things cucumber is bad at by Richard Lawrence
 
Patterns for slick database applications
Patterns for slick database applicationsPatterns for slick database applications
Patterns for slick database applications
 
Scala e xchange 2013 haoyi li on metascala a tiny diy jvm
Scala e xchange 2013 haoyi li on metascala a tiny diy jvmScala e xchange 2013 haoyi li on metascala a tiny diy jvm
Scala e xchange 2013 haoyi li on metascala a tiny diy jvm
 
Oscar reiken jr on our success at manheim
Oscar reiken jr on our success at manheimOscar reiken jr on our success at manheim
Oscar reiken jr on our success at manheim
 
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...
 
Cukeup nyc ian dees on elixir, erlang, and cucumberl
Cukeup nyc ian dees on elixir, erlang, and cucumberlCukeup nyc ian dees on elixir, erlang, and cucumberl
Cukeup nyc ian dees on elixir, erlang, and cucumberl
 
Cukeup nyc peter bell on getting started with cucumber.js
Cukeup nyc peter bell on getting started with cucumber.jsCukeup nyc peter bell on getting started with cucumber.js
Cukeup nyc peter bell on getting started with cucumber.js
 
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...
 
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...
 
Progressive f# tutorials nyc don syme on keynote f# in the open source world
Progressive f# tutorials nyc don syme on keynote f# in the open source worldProgressive f# tutorials nyc don syme on keynote f# in the open source world
Progressive f# tutorials nyc don syme on keynote f# in the open source world
 
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...
 
Dmitry mozorov on code quotations code as-data for f#
Dmitry mozorov on code quotations code as-data for f#Dmitry mozorov on code quotations code as-data for f#
Dmitry mozorov on code quotations code as-data for f#
 
A poet's guide_to_acceptance_testing
A poet's guide_to_acceptance_testingA poet's guide_to_acceptance_testing
A poet's guide_to_acceptance_testing
 
Russ miles-cloudfoundry-deep-dive
Russ miles-cloudfoundry-deep-diveRuss miles-cloudfoundry-deep-dive
Russ miles-cloudfoundry-deep-dive
 
Serendipity-neo4j
Serendipity-neo4jSerendipity-neo4j
Serendipity-neo4j
 
Simon Peyton Jones: Managing parallelism
Simon Peyton Jones: Managing parallelismSimon Peyton Jones: Managing parallelism
Simon Peyton Jones: Managing parallelism
 
Plug 20110217
Plug   20110217Plug   20110217
Plug 20110217
 
Lug presentation
Lug presentationLug presentation
Lug presentation
 
I went to_a_communications_workshop_and_they_t
I went to_a_communications_workshop_and_they_tI went to_a_communications_workshop_and_they_t
I went to_a_communications_workshop_and_they_t
 
Plug saiku
Plug   saikuPlug   saiku
Plug saiku
 

Recently uploaded

Connector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a buttonConnector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a button
DianaGray10
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
91mobiles
 
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Product School
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
UiPathCommunity
 
Essentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with ParametersEssentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with Parameters
Safe Software
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
Elena Simperl
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
Prayukth K V
 
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
Product School
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
Ralf Eggert
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Thierry Lestable
 
Accelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish CachingAccelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish Caching
Thijs Feryn
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
James Anderson
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance
 
Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*
Frank van Harmelen
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
Guy Korland
 
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Inflectra
 
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
Sri Ambati
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance
 
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
DanBrown980551
 
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsTo Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
Paul Groth
 

Recently uploaded (20)

Connector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a buttonConnector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a button
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
 
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
 
Essentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with ParametersEssentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with Parameters
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
 
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
 
Accelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish CachingAccelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish Caching
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
 
Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
 
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
 
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
 
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
 
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsTo Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
 

Hydras And Hypermedia

  • 1. Hydras  and  Hypermedia   Ian  Robinson   http://ianSrobinson.com   @ianSrobinson   ianSrobinson@gmail.com  
  • 3. Meet  the  apps   ERP   DMS  
  • 4. And  their  alter  egos…   Wired  Erp   Dungeon  Master  
  • 6. Pick  your  path  to  adventure  
  • 7. The  goal…   Find   and   Defeat   E0920ba0'df0e-42a1-b304-a312c834fd62     tyrannical  Lich-­‐Uuid   the  
  • 8. The  plan…   until  goal  achieved    while  healthy      fight    |  flee    |  without  retracing  steps      |  north      |  east      |  west      |  south    |  investigate    |  retrace  steps  
  • 9. Once  upon  a  time…   POST /quests Host: dms Content-Type: application/prs.dms+xml Content-Length: ... <difficulty>intermediate</difficulty> HTTP/1.1 201 Created Content-Type: application/prs.dms+xml Location: http://dms/quests/1/locations/1 Content-Length: ... <location> <title>Entrance</title> <summary> Your adventure begins as you descend a rope into a rubble-strewn hall. The air is cold and dank. </summary> <dimensions> <north-south>20</north-south> <east-west>20</east-west> </dimensions> <link rel="http://dms/north" type="application/prs.dms+xml" href="/quests/1/locations/2"/> <link rel="http://dms/east" type="application/prs.dms+xml" href="/quests/1/locations/3"/> <link rel="http://dms/west" type="application/prs.dms+xml" href="/quests/1/locations/4"/> </location>
  • 10. Heading  north…   GET /quests/1/locations/2 HTTP/1.1 Host: dms HTTP/1.1 303 See Other Content-Type: application/prs.dms+xml Location: http://dms/quests/1/encounters/1 Content-Length: ... <link rel="related" type="application/prs.dms+xml" href="/quests/1/encounters/1"/>
  • 11. When  frameworks  go  bad…   GET /quests/1/encounters/1 HTTP/1.1 Host: dms HTTP/1.1 200 OK Content-Type: application/prs.dms+xml Content-Length: ... <encounter> <title>Skeleton!</title> <summary> From out of the shadows lurches a skeleton brandishing a scimitar. </summary> <model> <instance rel="http://dms/attack"> <intention> <attack> <weapon/> <strategy/> </attack> </intention> </instance> <submission resource="/quests/1/encounters/1/fight" method="POST" mediatype="application/prs.dms+xml"/> </model> <model> <instance rel="http://dms/flee"> <intention> <flee/> </intention> </instance> <submission resource="/quests/1/encounters/1/flight" method="POST" mediatype="application/prs.dms+xml"/> </model> </encounter>
  • 12. Hacker…   POST /quests/1/encounters/1/fight HTTP/1.1 Host: dms Content-Type: application/prs.dms+xml Content-Length: ... <intention> <attack> <weapon>sword</weapon> <strategy>slash</strategy> </attack> </intention> HTTP/1.1 201 Created Content-Type: application/prs.dms+xml Location: http://dms/quests/1/encounters/1/outcomes/1 Content-Length: ... <outcome> <title>Success</title> <summary> The skeleton shatters and its scimitar clatters to the ground. Searching the fragments, you find a silver key. </summary> <items> <link type="application/prd.dms+xml" href="/quests/1/objects/1">silver key</link> </items> <link rel="next" type="application/prs.dms+xml" href="/quests/1/locations/2"/> </outcome>
  • 13. Stone  door   GET /quests/1/locations/2 HTTP/1.1 Host: dms HTTP/1.1 200 OK Content-Type: application/prs.dms+xml ETag: "FEC6956217C1" Content-Length: ... <location> <title>Stone door</title> <summary> The hall narrows, and you follow a low passage to a stone door with a deeply recessed keyhole. </summary> <dimensions> <north-south>15</north-south> <east-west>5</east-west> </dimensions> <link rel="http://dms/south" type="application/prs.dms+xml" href="/quests/1/locations/1"/> <model> <instance rel="http://dms/action"> <intention> <unlock> <key/> </unlock> </intention> </instance> <submission resource="/quests/1/locations/2" method="POST" mediatype="application/prs.dms+xml"/> </model> </location>
  • 14. But  we’ve  got  a  key…   POST /quests/1/locations/2 HTTP/1.1 Host: dms If-Match: "FEC6956217C1" Content-Type: application/prs.dms+xml Content-Length: ... <intention> <unlock> <key>http://dms/quests/1/objects/1</key> </unlock> </intention> HTTP/1.1 412 Precondition Failed
  • 15. What’s  going  on?   GET /quests/1/locations/2 HTTP/1.1 Host: dms If-None-Match: "FEC6956217C1" HTTP/1.1 200 OK Content-Type: application/prs.dms+xml ETag: "6809E4D87D43" Content-Length: ... <location> <title>Stone door</title> <summary> You're standing in front of a stone door with a deeply recessed keyhole. Electricity crackles around the keyhole. </summary> <dimensions> <north-south>15</north-south> <east-west>5</east-west> </dimensions> <link rel="http://dms/south" type="application/prs.dms+xml" href="/quests/1/locations/1"/> <model> <instance rel="http://dms/action"> <intention> <unlock> <key/> </unlock> </intention> </instance> <submission resource="/quests/1/locations/2" method="POST" mediatype="application/prs.dms+xml"/> </model> </location>
  • 16. Wait…   GET /quests/1/locations/2 HTTP/1.1 Host: dms If-None-Match: "6809E4D87D43" HTTP/1.1 304 Not Modified
  • 17. Wait…   GET /quests/1/locations/2 HTTP/1.1 Host: dms If-None-Match: "6809E4D87D43" HTTP/1.1 200 OK Content-Type: application/prs.dms+xml ETag: "871CDA1C9935" Content-Length: ... <location> <title>Stone door</title> <summary> You're standing in front of a stone door with a deeply recessed keyhole. </summary> <dimensions> <north-south>15</north-south> <east-west>5</east-west> </dimensions> <link rel="http://dms/south" type="application/prs.dms+xml" href="/quests/1/locations/1"/> <model> <instance rel="http://dms/action"> <intention> <unlock> <key/> </unlock> </intention> </instance> <submission resource="/quests/1/locations/2" method="POST" mediatype="application/prs.dms+xml"/> </model> </location>
  • 18. Now!   POST /quests/1/locations/2 HTTP/1.1 Host: dms If-Match: "871CDA1C9935" Content-Type: application/prs.dms+xml Content-Length: ... <intention> <unlock> <key>http://dms/quests/1/objects/1</key> </unlock> </intention> HTTP/1.1 201 Created Content-Type: application/prs.dms+xml Location: http://dms/quests/1/locations/2/outcomes/1 Content-Length: ... <outcome> <title>Success</title> <summary> The key turns in the lock and the door grinds open. Beyond, a flight of steep steps lead down into the darkness. A blast of warm, fetid air issues from below, followed by an inhuman shriek. </summary> <link rel="related" type="application/prs.dms+xml" href="/quests/1/locations/2"/> <link rel="http://dms/north" type="application/prs.dms+xml" href="/quests/1/locations/5"/> <link rel="http://dms/south" type="application/prs.dms+xml" href="/quests/1/locations/1"/> </outcome>
  • 19. Leonard  Richardson's  Web  service  maturity  heuristic   What?   Why?   How?   Spreads  complexity   URIs   Divide  and  conquer   around   Refactor   (Do  the  same  things   Reduces  complexity   HTTP   in  the  same  way)   Describe  special   Makes  complexity   Hypermedia   behaviour  in  a   learnable   standard  way   http://www.crummy.com/writing/  
  • 20. HATEOAS  –  the  riddle  of  the  Sphinx   Hypermedia   as   the   Engine   of   Application   State  
  • 21. Some  definitions…   Application  protocol   Application  state   Photo  taken  from  Twissie’s  Flickr  stream  under  the  Creative  Commons  licence  
  • 22. Application  protocol  state  machine   GET POST exploring confronting entrance skeleton POST GET investigating triumphant door POST standing at top of steps
  • 23. Reality  intermission   request quote quote requested place order goods ordered cancel order fulfill order order order completed cancelled
  • 24. Hypermedia  systems  transform  application  state   <encounter> <title>Skeleton!</title> <summary> From out of the shadows lurches a skeleton brandishing a scimitar. </summary> <model> <instance rel="http://dms/attack"> <intention> <attack> <outcome> <weapon/> <title>Success</title> <strategy/> <summary> </attack> The skeleton shatters and its scimitar clatters to the ground. </intention> Searching the fragments, you find a silver key. </instance> </summary> <submission resource="/quests/1/encounters/1" <items> method="POST" mediatype="application/prs.dms+xml"/> <link type="application/prd.dms+xml" </model> href="/quests/1/objects/1">silver key</a:link> <model> </items> <instance rel="http://dms/flee"> <link rel="next" type="application/prs.dms+xml" <intention> href="/quests/1/locations/2"/> <flee/> </outcome></intention> </instance> <submission resource="/quests/1/encounters/1" method="POST" mediatype="application/prs.dms+xml"/> </model> </encounter> POST /quests/1/encounters/1 HTTP/1.1 GET /quests/1/encounters/1 HTTP/1.1 <intention> <attack> <weapon>sword</weapon> <strategy>slash</strategy> </attack> </intention>
  • 25. Anatomy  of  a  hypermedia  control     <link rel="http://dms/north" type="application/prs.dms+xml" href="/quests/1/locations/2" /> Semantic  context   WHY  access  the  linked   resource?   Interpretation   WHAT  form  does  the   linked  resource  take?   Address   WHERE  does  the   linked  resource   reside?  
  • 26. Media  type  is  a  key  into  an  interpretative  scheme   Schemas   Hypermedia  controls   Processing  model   Link  relations  
  • 27. Archaeology  of  an  application  protocol   Why?   How?   What?   Link  relations   HTTP  idioms   Media  types  
  • 28. Manipulate  resources  using  HTTP  idioms   <submission resource="/quests/1/locations/2" method="POST" mediatype="application/prs.dms+xml"/> OPTIONS /quests/1/locations/2 HTTP/1.1 Host: dms HTTP/1.1 200 OK Allow: GET, POST HTTP/1.1 200 OK Content-Type: application/prs.dms+xml ETag: "871CDA1C9935" Content-Length: ... HTTP/1.1 303 See Other Content-Type: application/prs.dms+xml Location: http://dms/quests/1/encounters/1 Content-Length: ...
  • 29. Down  in  the  dungeons…   http://dms/quests/1/locations/2 http://dms/quests/1/encounters/1 http://dms/quests/1/encounters/1/outcomes/1 guarded by involves Location Skeleton Encounter dead- guarded unguarded undead dead unresolved resolving resolved resolved by modifies affects Outcome Intention determined determines declared
  • 30. Design  and  implementation  guidelines  
  • 31. Equipping  the  client   Capability   Description   HTTP  client   Implement  HTTP  idioms  (eg.  conditional  GET).   Parse/  assemble  hypermedia  representations;   Media  type  handlers   surface  hypermedia  controls.   Evaluate  semantic   Understand  semantic  context  for  controls  in   context   relation  to  client  goal.   Choose  and  activate   Decide  on  next  transition  based  on  goal,   control   application  state  and  available  transitions.   Cache   Client-­‐side  caching,  including  revalidation  
  • 32. Hypermedia  and  Systems  Architecture   How  to  GET  a  Cup  of  Coffee   http://www.infoq.com/articles/webber-­‐rest-­‐workflow   Jim  Webber   Savas  Parastatidis   Ian  Robinson   Photos  taken  from  ElDave’s  Flickr  stream  under  the  Creative  Commons  licence  
  • 33. Thank  you   http://ianSrobinson.com   @ianSrobinson   ianSrobinson@gmail.com