RESTING ON HTTP
DEVELOPER WEEK - 17.06.2015
WHO AM I?
Maximilian Berghoff
Mayflower GmbH (Würzburg)
@ElectricMaxxx
Maximilian.Berghoff@mayflower.de
ABOUT?
REST = HTTP?
HTTP
GET /info HTTP/1.1
Host: www.expamle.dev
Content­Type: text/html
Header Request
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF­8">
    <title>Information</title>
</head>
<body>
  <h1>Information about this page</h1>
  <p>Here you will get your information</p>
</body>
</html>
Content der Response
HTTP/1.1 200 OK
Content­Type: text/html; charset=UTF­8
..
           
Header Response
STATUS CODES
1XX - Bearbeitung dauert an (Intermediate)
2XX - Anfrage Erfolgreich
3XX - Umleitungen
4XX - Fehler in der Anfrage/beim Client
5XX - Fehler am Server
METHOD
SAVE METHOD?
GET
GET /BLOG/2/EDIT
GET /BLOG/2/EDIT
POST / PUT
POST
POST /users HTTP/1.1
Host: www.example.dev
Content­Type: application/json
{
    "firstName": "Max",
    "lastName": "Berghoff"
}
                        
POST request
HTTP/1.1 201 Created
Content­Type: application/json;
Content­Location: /users/3
{
    "id": "3",
    "firstName": "Max",
    "lastName": "Berghoff"
}
                        
POST response
PUT
PUT /users/3 HTTP/1.1
Host: www.example.dev
Content­Type: application/json
{
    "firstName": "Max",
    "lastName": "Berghoff",
    "email": "Maximilian.Berghoff@mayflower.de"
}
                        
PUT request
HTTP/1.1 200 OK
Content­Type: application/json;
{
    "id": "3",
    "firstName": "Max",
    "lastName": "Berghoff",
    "email": "Maximilian.Berghoff@mayflower.de"
}
                        
POST response
PATCH
POST / PUT / PATCH
DELETE
DELETE /users/3 HTTP/1.1
Host: www.example.dev
DELETE request
HTTP/1.1 204 No Content
Location: /users
DELETE response
OPTIONS
HEAD
ROY FIELDING
HTTP Spezification
DISERTATION
ARCHITECTURAL STYLES AND THE DESIGN OF NETWORK-BASED SOFTWARE ARCHITECTURES
DOCTOR OF PHILOSOPHY, 2000
4 CONSTRAINTS
1.
ADRESSIERBARKEIT
2.
REPRÄSENTATIONEN
3.
ZUSTANDSLOSIGKEIT
4.
OPERATIONEN
RESOURCEN?
JEDE INFORMATION KANN
RESOURCE SEIN
(HTML) Dokument
Bild
Liste von Resourcen
Alles was Ziel einer Referenz/eines Link sein kann.
REPRÄSENTATIONEN
{
    "userId": "3",
    "username": "ElectricMaxxx",
    "firstName": "Max",
    "lastName": "Berghoff",
    "email": "Maximilian.Berghoff@mayflower.de"
}
User als JSON
<user>
    <userId>3</userId>
    <userName>ElectricMaxxx</userName>
    <firstName>Maximilian</firstName>
    <lastName>Berghoff</lastName>
    <email>Maximilian.Berghoff@gmx.de</email>
</user>
User als XML
<ul>
    <li>
        <strong>Username: </strong> ElectricMaxxx
    </li>
    <li>
        <strong>FirstName: </strong> Max
    </li>
    <li>
        <strong>LastName: </strong> Berghoff
    </li>
    <li>
        <strong>Email: </strong> Maximilian.Berghoff@mayflower.de
    </li>
</ul>
User als HTML in einem Profil
WIE ERHALTE ICH DIE
GEWÜNSCHTE
REPRÄSENTATION?
IN DER URL
/users/3.json
Oder /users/3.xml
Oder /users/3.html
IM HEADER
GET /users/3
Content-Type: application/json
Oder Content-Type: application/xml
Oder Content-Type: text/html
WIE SOLL RESOURCE
AUSSEHEN?
HATEOAS
HYPERMEDIA
AS THE ENGINE OF
APPLICATION STATE
WTF?
<?xml version="1.0"?>
<user>
    <userName>ElectricMaxxx</userName>
    <firstName>Maximilian</firstName>
    <lastName>Berghoff</lastName>
    <email>Maximilian.Berghoff@gmx.de</email>
    <link rel="groups" href="/users/3/groups" />
    <link rel="roles" href="/users/3/roles" />
    <link rel="orders" href="/users/3/orders" />
</user>
JSON ?
HAL Spezifikation
"_links":{
    "self": { "href": "/users/3" }
},
"userId": "3",
"_embedded": {
    "orders": [{
        "_links": {
            "self": { "href": "users/3/orders/123"}
        }
    }],
    "groups": [{
        "_links": {
            "self": { "href": "users/3/orders/2"}
        }
    }]
}
ZURÜCK AUF NULL
GET /users/3 HTTP/1.1
Host: www.expamle.dev
Content­Type: application/xml
Request auf User mit der ID 3
HTTP/1.1 200 OK
Content­Type: application/xml
<?xml version="1.0"?>
<user>
    <userName>ElectricMaxxx</userName>
    <firstName>Maximilian</firstName>
    <lastName>Berghoff</lastName>
    <email>Maximilian.Berghoff@gmx.de</email>
    <link rel="groups" href="/users/3/groups" />
    <link rel="roles" href="/users/3/roles" />
    <link rel="orders" href="/users/3/orders" />
</user>
                        
Anwort des Services in XML
CONTRAINTS ERFÜLLT
-> REST = HTTP?
NEIN!!!
HYPETEXT TRANSFER
PROTOCOL
REPRESENTATIONAL
STATE TRANSFER
I LOVE
RESTING ON HTTP
QUESTIONS ?
Ask now!
Twitter:   @ElectricMaxxx
Mail:   Maximilian.Berghoff@mayflower.de
THANK YOU!
< <

RESTing on HTTP