Čo presne je programovanie RESTful?

Čo presne je programovanie RESTful?

REST je základným architektonickým princípom webu. Na webe je úžasné to, že klienti (prehliadače) a servery môžu komunikovať zložitým spôsobom bez toho, aby klient vopred vedel čokoľvek o serveri a zdrojoch, ktoré hostí. Kľúčovým obmedzením je, že server a klient sa musia dohodnúť na použitom médiu, čo je v prípade webu HTML.

Rozhranie API, ktoré dodržiava zásady REST, nevyžaduje, aby klient vedel čokoľvek o štruktúre rozhrania API. Server musí skôr poskytnúť všetky informácie, ktoré klient potrebuje na interakciu so službou. Príkladom je formulár HTML: Server špecifikuje umiestnenie zdroja a požadované polia. Prehliadač vopred nevie, kam má informácie odoslať, a vopred nevie, aké informácie má odoslať. Obidve formy informácií poskytuje výhradne server (Tento princíp sa nazýva HATEOAS: Hypermedia As The Engine Of Application State.)

Ako sa to teda vzťahuje na HTTP a ako sa to dá implementovať v praxi? HTTP je orientovaný na slovesá a zdroje. Dve slovesá, ktoré sa bežne používajú, sú GET a POST, ktoré, myslím, každý pozná. Štandard HTTP však definuje niekoľko ďalších, napríklad PUT a DELETE. Tieto slovesá sa potom aplikujú na zdroje podľa pokynov poskytnutých serverom.

Predstavme si napríklad, že máme databázu používateľov, ktorú spravuje webová služba. Naša služba používa vlastné hypermédium založené na JSON, ktorému priradíme mimetyp application/json+userdb (môže existovať aj application/xml+userdb a application/whatever+userdb - podporovaných môže byť mnoho typov médií). Klient aj server boli naprogramovaní tak, aby rozumeli tomuto formátu, ale navzájom o sebe nič nevedia. Ako uvádza Roy Fielding:

Rozhranie REST API by malo vynaložiť takmer všetko svoje úsilie na opis

definovanie typu(ov) médií používaných na reprezentáciu zdrojov a riadenie stavu aplikácie, alebo pri definovaní rozšírených názvov vzťahov a/alebo hypertextového značkovania pre existujúce štandardné mediálne typy.

Požiadavka na základný zdroj / môže vrátiť niečo takéto:

požiadavka

GET /
Accept: application/json+userdb

Odpoveď

200 OK
Content-Type: application/json+userdb

{
    "version": "1.0",
    "links": [
        {
            "href": "/user",
            "rel": "list",
            "method": "GET"
        },
        {
            "href": "/user",
            "rel": "create",
            "method": "POST"
        }
    ]
}

Z popisu nášho média vieme, že informácie o súvisiacich zdrojoch môžeme nájsť v sekciách s názvom "odkazy". Toto sa nazýva Hypermediálne ovládacie prvky. V tomto prípade môžeme z takejto sekcie zistiť, že zoznam používateľov môžeme nájsť tak, že vykonáme ďalšiu požiadavku na /user:

požiadavka

GET /user
Accept: application/json+userdb

Odpoveď

200 OK
Content-Type: application/json+userdb

{
    "users": [
        {
            "id": 1,
            "name": "Emil",
            "country: "Sweden",
            "links": [
                {
                    "href": "/user/1",
                    "rel": "self",
                    "method": "GET"
                },
                {
                    "href": "/user/1",
                    "rel": "edit",
                    "method": "PUT"
                },
                {
                    "href": "/user/1",
                    "rel": "delete",
                    "method": "DELETE"
                }
            ]
        },
        {
            "id": 2,
            "name": "Adam",
            "country: "Scotland",
            "links": [
                {
                    "href": "/user/2",
                    "rel": "self",
                    "method": "GET"
                },
                {
                    "href": "/user/2",
                    "rel": "edit",
                    "method": "PUT"
                },
                {
                    "href": "/user/2",
                    "rel": "delete",
                    "method": "DELETE"
                }
            ]
        }
    ],
    "links": [
        {
            "href": "/user",
            "rel": "create",
            "method": "POST"
        }
    ]
}

Z tejto odpovede sa dá veľa vyčítať. Napríklad teraz vieme, že môžeme vytvoriť nového používateľa pomocou POST na /user:

požiadavka

POST /user
Accept: application/json+userdb
Content-Type: application/json+userdb

{
    "name": "Karl",
    "country": "Austria"
}

Odpoveď

201 Created
Content-Type: application/json+userdb

{
    "user": {
        "id": 3,
        "name": "Karl",
        "country": "Austria",
        "links": [
            {
                "href": "/user/3",
                "rel": "self",
                "method": "GET"
            },
            {
                "href": "/user/3",
                "rel": "edit",
                "method": "PUT"
            },
            {
                "href": "/user/3",
                "rel": "delete",
                "method": "DELETE"
            }
        ]
    },
    "links": {
       "href": "/user",
       "rel": "list",
       "method": "GET"
    }
}

Vieme tiež, že môžeme zmeniť existujúce údaje:

Požiadavka

PUT /user/1
Accept: application/json+userdb
Content-Type: application/json+userdb

{
    "name": "Emil",
    "country": "Bhutan"
}

Odpoveď

200 OK
Content-Type: application/json+userdb

{
    "user": {
        "id": 1,
        "name": "Emil",
        "country": "Bhutan",
        "links": [
            {
                "href": "/user/1",
                "rel": "self",
                "method": "GET"
            },
            {
                "href": "/user/1",
                "rel": "edit",
                "method": "PUT"
            },
            {
                "href": "/user/1",
                "rel": "delete",
                "method": "DELETE"
            }
        ]
    },
    "links": {
       "href": "/user",
       "rel": "list",
       "method": "GET"
    }
}

Všimnite si, že na manipuláciu s týmito zdrojmi používame rôzne HTTP slovesá (GET, PUT, POST, DELETE atď.) a že jediná znalosť, ktorú predpokladáme na strane klienta, je naša definícia média.

Ďalšie čítanie:

(Táto odpoveď bola predmetom pomerne veľkej kritiky za to, že jej chýba zmysel. Z väčšej časti to bola spravodlivá kritika. To, čo som pôvodne opísal, bolo skôr v súlade s tým, ako sa REST zvyčajne implementoval pred niekoľkými rokmi, keď som to písal prvýkrát, než s jeho skutočným významom. Odpoveď som zrevidoval, aby lepšie predstavovala skutočný význam).

Komentáre (39)

REST používa na manipuláciu s údajmi rôzne metódy HTTP (najmä GET/PUT/DELETE).

Namiesto použitia konkrétnej adresy URL na vymazanie metódy (napríklad /user/123/delete) by ste poslali požiadavku DELETE na adresu URL /user/[id], na úpravu používateľa, na získanie informácií o používateľovi by ste poslali požiadavku GET na adresu /user/[id]

Namiesto toho môžete použiť napríklad sadu adries URL, ktoré môžu vyzerať ako niektoré z nasledujúcich..

GET /delete_user.x?id=123
GET /user/delete
GET /new_user.x
GET /user/new
GET /user?id=1
GET /user/id/1

Používate HTTP "slovesá" a máte..

GET /user/2
DELETE /user/2
PUT /user
Komentáre (5)

Je to programovanie, pri ktorom architektúra vášho systému zodpovedá štýlu REST, ktorý stanovil Roy Fielding vo svojej práci 1. Keďže ide o architektonický štýl, ktorý (viac-menej) opisuje web, zaujíma sa oň veľa ľudí.

Bonusová odpoveď: Pokiaľ neštudujete softvérovú architektúru ako akademický pracovník alebo nenavrhujete webové služby, nie je dôvod, aby ste tento termín počuli.

Komentáre (4)