RESTful Style

Zack YL Shih

REST vs RESTful

Beauty vs Beautiful

Representational State Transfer

Standard
Protocol
Style

REST

  • Client-Server
  • Stateless
  • Cacheable
  • Uniform Interface
    • Identification of resources
    • Manipulation of resources
  • Layered System
  • Code-On-Demand

Be Simplicity

REST

  • It's all about RESOURCE
  • Every resource has an unique identifier
  • Generic connector interface (e.g. HTTP)
  • Resource identifier is immutable
  • Each operation is stateless

Restful Web Service

  • Web Service build with HTTP in RESTful Style
  • CRUD
    • Create (POST)
    • Read (GET)
    • Update (PUT)
    • Delete (DELETE)

Web Service Defination

  • Nouns: http://example.com/resources/
  • Verbs: GET, POST, PUT, DELETE
  • Content Types : JSON, XML

Constraints are liberating

In Action

Ethernet

/network/ethernets/{id}

{
    "id":1,
    "name":"eth0",
    "ip":"192.168.3.127",
    "mac":"FF:FF:FF:FF:FF:FF",
    "netmask":"255.255.255.0",
    "subnet":"192.168.3.0",
    "gateway":"192.168.3.254",
    "dns":["8.8.8.8", "8.8.4.4"],
    "currentStatus":1,
    "enable":1,
    "enableDhcp":0
}

Ethernet

/network/ethernets/{id}

Request:
    curl 'http://localhost/network/ethernets/1'

Response:
    200 (OK)
    Content-Type: application/json

    {
        "id":1,
        "name":"eth0",
        "ip":"192.168.3.127",
        "mac":"FF:FF:FF:FF:FF:FF",
        "netmask":"255.255.255.0",
        "subnet":"192.168.3.0",
        "gateway":"192.168.3.254",
        "dns":["8.8.8.8", "8.8.4.4"],
        "currentStatus":1,
        "enable":1,
        "enableDhcp":0
    }

Get eth0 information

Ethernet

/network/ethernets/{id}

Request:
    curl --request PUT \
         --header "Content-Type: application/json" \
         --data-binary '{"dns":["192.168.50.33", "168.95.1.1"]}' \
         'http://localhost/network/ethernets/1'

Response:
    200 (OK)
    Content-Type: application/json

    {
        "id":1,
        "name":"eth0",
        "ip":"192.168.3.127",
        "mac":"FF:FF:FF:FF:FF:FF",
        "netmask":"255.255.255.0",
        "subnet":"192.168.3.0",
        "gateway":"192.168.3.254",
        "dns":["8.8.8.8", "8.8.4.4"],
        "currentStatus":1,
        "enable":1,
        "enableDhcp":0
    }

Set eth0 DNS to 192.168.50.33 and 168.95.1.1

Wifi

/network/wifis

{
    "id":1,
    "name":"wlan0",
    "mode":1,
    "enable":1,
    "currentStatus":1,
    "mac":"FF:FF:FF:FF:FF:FF",
    "client": {
        "ssid": "MOXA-MAR-1",
        "signal": -79,
        "ip":"192.168.41.127",
        "netmask":"255.255.255.0",
        "subnet":"192.168.41.0",
        "gateway":"192.168.41.254",
        "enableDhcp": 1,
        "network": [
            {
                "enable": 1,
                "priority": 0,
                "ssid": "MOXA-MAR-1",
                "mode": 2,
                "keyFormat": 0,
                "psk": "moxamoxa",
                "txKey": 0,
                "key": ["", "", "", ""],
                "identity": "",
                "password": ""
            }
        ]
    }
}

CPU Status

/system/status/cpu

{
    "data": [
        {"time": "2014/09/14 15:18:48", "value": 54.1},
        {"time": "2014/09/14 15:19:48", "value": 40.2},
        {"time": "2014/09/14 15:20:48", "value": 35.9}
    ]
}

Memory Status

/system/status/memory

{
    "data": [
        {
            "time": "2014/09/14 15:18:48",
            "total": "200MB",
            "used": "50MB",
            "free": "150MB",
            "usedPercentage": 25
        },
        {
            "time": "2014/09/14 15:19:48",
            "total": "200MB",
            "used": "50MB",
            "free": "150MB",
            "usedPercentage": 25
        }
    ]
}

RESTful Style

By YuLun Shih

RESTful Style

  • 969