ugrás a tartalomhoz

REST - Állapotmentesség - Session?

kemmma · 2013. Ápr. 5. (P), 07.06
Sziasztok! Egy kis segítséget szeretnék kérni, ha egy REST api-t szeretnék írni, akkor az állapotmentesség megszorítás azt jelenti, hogy nem használhatok session-t? Merthogy a kliens állapotát nem tárolhatom a szerveren. Vagy ezt nem így kell érteni?
 
1

Sütemény

Hidvégi Gábor · 2013. Ápr. 5. (P), 08.54
A http-n a sütikkel oldják meg az állapot tárolását, szerintem te is nyugodtan használhatod őket. Meg ha neked nem tetszik az állapotmentesség, nem muszáj az utolsó betűig ragaszkodni a leírtakhoz.
2

Köszi! Én nem ragaszkodom semmihez. :)

kemmma · 2013. Ápr. 5. (P), 09.07
Köszi! Én nem ragaszkodom semmihez. :)
Igazság szerint inkább csak érdeklődök, hogy a leírtakat jól értem-e, vagy sem?
A konkrét problémámra a megoldás meg valószínűleg az lesz, hogy egyszerűen nem nevezem RESTful-nak és akkor nincs ellentmondás. :)
3

úgy értsd, hogy

szabo.b.gabor · 2013. Ápr. 5. (P), 09.09
csiripek között épp most van

In other words, when you call a method on a service, the result should depend only on the provided arguments, and the service should not keep track of previous calls made.


tehát első kérés mondjuk egy auth, ez visszaad vmi azonosítót, amit a többi kérés elküld (session cookie tulajdonképpen)

és nem lehet olyan kérés, hogy cancelLastRequest pl.
4

Hol a határ?

kemmma · 2013. Ápr. 5. (P), 09.29
Néztem ezt a bejegyzést, emiatt is jutott eszembe ez a számomra régi ellentmondás.

Értem az idézett mondatot, de nem tudom, hogy hol a határ.

Adott egy egyszerű lekérés, arra egy egyszerű válasz.
Jön egy utasítás, hogy álljunk át hibakereső módba. (ez egy másik típusú http kérés, és ezt nem tudom, hogy ez mennyire RESTful)
Majd ismét meghívjuk az első lekérést és már egy teljesen más, részletesebb válasz érkezik.

Ekkor nem igaz az a feltétel, hogy az előzmények nem voltak hatással az aktuális lekérésre. Illetve a szerveren lévő klienshez tartozó információ miatt jött az létre, hogy ugyanarra a lekérésre más válasz születik.

De lehetséges, hogy ezt most csak én kombinálom túl.
5

kliens oldalon?

szabo.b.gabor · 2013. Ápr. 5. (P), 10.40
amit írsz, az valószínűleg borítja a REST szabályokat, de mi van akkor ha a kliensednek azt mondod, hogy na most hibakereső mód van, és onnantól a kérésekhez hozzácsap egy __debug=1 paramétert.

hogy nyersz-e ezzel valamit vagy sem? nem tudom, de Poetro biztos tudja :)
6

Re: kliens oldalon?

kemmma · 2013. Ápr. 5. (P), 12.00
Eredetileg azért nem megy minden az url-ben, mert akkor az túl hosszú lenne. (a fenti csak egy kiragadott példa volt, sokkal több paraméter lenne. Nem tudom, hogy ma még létezik ennek fizikai korlátai, elvileg az url nem lehet hosszabb, mint 255 karakter)

Egy megoldás lenne, hogy extra header-eket csinálunk. (bár lehet, hogy nem baj, ha nem hívom REST api-nak és akkor nincs gondom:)

Az zavar, hogy sehol nem láttam azt leírva, hogy REST = nem használhatsz Session-t. De ha nem arra használom a session-t, hogy idővel megváltozzon az értéke, akkor mire használnám? Tehát nem tudok elképzelni olyan valós példát, ahol használok Session-t, de mégsem sérül az a feltétel, hogy az előző lekérés befolyással van a következő lekérésre.
7

elvileg az url nem lehet

MadBence · 2013. Ápr. 5. (P), 12.17
elvileg az url nem lehet hosszabb, mint 255 karakter

Ez nem igaz! A protokoll (RFC2616) nem tartalmaz limitet
The HTTP protocol does not place any a priori limit on the length of
a URI. Servers MUST be able to handle the URI of any resource they
serve, and SHOULD be able to handle URIs of unbounded length if they
provide GET-based forms that could generate such URIs. A server
SHOULD return 414 (Request-URI Too Long) status if a URI is longer
than the server can handle (see section 10.4.15).

Az implementációkra azonban ez nem feltétlenül igaz, de 255 karakter nem okozhat problémát egyik böngészőnek sem, az IE is csak 2000 karakter körüli url-hossznál hal le.

A 255 karakteres limit csak egy ajánlás, és a hosztnévre vonatkozik (ez csak a DNS miatti limitáció). (RFC3986)
8

Re: url hossz

kemmma · 2013. Ápr. 5. (P), 13.16
Miután elküldtem az előző hozzászólást annyira éreztem, hogy kár volt ilyet leírni, oké, elfogadom. Viszont magához az eredeti kérdéshez ez már nagyon off.

Nekem továbbra is nagyon nem tetszik az, hogy REST = ne használj Session-t, igazság szerint titkon abban reménykedem, hogy valaki majd jön és jól megmagyarázza, hogy miért szabad mégiscsak használni. :)
9

LUSTA

Hidvégi Gábor · 2013. Ápr. 5. (P), 13.44
Ha figyelmen kívül hagyjuk az állapotmentességet, mi az, ami miatt a REST-re esett a választásod?

Olvasgatom a wiki linket:
A szerverek nem foglalkoznak a felhasználói felülettel
Ennek például a HTML eleve nem felel meg.
10

Nem választottam...

kemmma · 2013. Ápr. 5. (P), 13.49
Öhhh... :) A helyzet fordított, készült egy felület, amiről nem tudom, hogy REST-e?

Adott egy webes szolgáltatás, amelyről először Android telefonok kértek le infókat. Elkészült a rendszer úgy-ahogy. Majd amikor az IOS-s oldalt készítették, akkor rákérdeztek, hogy akkor egy REST api-ról beszélünk-e? Ekkor én még nem tudtam, hogy arról beszélünk-e. :) Vagyis még most sem tudom, de ekkor kezdtem el gondolkodni, hogy milyen frankó lenne, ha tényleg erről beszélnénk. :)

Várhatóan felmerül majd a harmadik mobilplatform, és nem szeretnék teljesen hülyén állni, ha majd a harmadik csapat is rákérdez erre. Emiatt a topic. :)

(annyira nem ragaszkodom én a "szabványhoz", hogy emiatt a felépítést átírjuk, csupán érdeklődök)
11

A REST arról szól, hogy az

MadBence · 2013. Ápr. 5. (P), 13.50
A REST arról szól, hogy az URL-ek erőforrásokat reprezentálnak (egyedi erőforrást, vagy valami gyűjteményt). Egy erőforrás lekérése nem változtathatja meg az állapotát, azaz a művelet megismétlése független a többitől, mindig ugyanazt az eredményt adja vissza (idempotens), tehát szükségtelen a munkamenetek használata. Persze módosítani is lehet ezeket, viszont ilyenkor is minden szükséges információ benne van a kérésben, megint csak szükségtelen a munkamenetek használata.

Milyen jellegű dologra kell neked a session?
12

Felhasználók

Hidvégi Gábor · 2013. Ápr. 5. (P), 14.04
Onnantól kezdve, hogy szükség van felhasználóspecifikus információt megjeleníteni, az állapotmentesség bukik.
13

Ez alatt mit értesz?

MadBence · 2013. Ápr. 5. (P), 14.11
Ez alatt mit értesz?
14

A legegyszerűbb példa, amikor

Hidvégi Gábor · 2013. Ápr. 5. (P), 14.13
A legegyszerűbb példa, amikor a fejlécben kiírod, hogy "Bejelentkezve X. Y. néven.".
15

De itt REST api-ról van szó,

MadBence · 2013. Ápr. 5. (P), 14.19
De itt REST api-ról van szó, ahol tipikusan valamilyen szerializált formában (XML,JSON,stb) kapod meg az erőforrás reprezentációját.

De egyébként akárhányszor frissíted az oldalt, mindig az lesz, hogy "Bejelentkezve X. Y. néven" :-).

Autentikáció&autorizáció és egyebek a REST koncepciójában is benne vannak természetesen (pl. OAuth protokollon keresztül), nem mondanak ellent a korábban említett állításoknak.
16

Akkor valószínűleg

Hidvégi Gábor · 2013. Ápr. 5. (P), 14.21
Akkor valószínűleg félreértettem valamit.
17

A kliens kezelhet

Joó Ádám · 2013. Ápr. 5. (P), 16.36
A kliens kezelhet munkamenetet, tehát tárolhatja és küldheti a kéréssel az azonosító sütit, ami része a kérésnek, így a szerver kiszolgálhat a süti alapján más tartalmat, de mindig ugyanazt kell kiszolgálja, mert ő nem tárolhat munkamenetet.
18

Kérnék egy kis pontosítást! :)

kemmma · 2013. Ápr. 5. (P), 17.44
Légyszi ezt egy kicsit bővebben fejtsd ki, mert pont az ilyen mondatok azok, amik miatt ekkora a bizonytalanság bennem.

Mit jelent, hogy a kliens kezelhet munkamenetet, de a szerver nem tárolhat munkamenetet? Mit kezel a kliens, ha a szerver nem tárol hozzá semmit? Ha a kliens átadja a session_id, akkor azért adja át a szervernek, hogy az annak megfelelő választ adjon. Azaz a szervernek csak kell tárolnia valamit.
19

The client–server

Joó Ádám · 2013. Ápr. 5. (P), 17.53
The client–server communication is further constrained by no client context being stored on the server between requests. Each request from any client contains all of the information necessary to service the request, and any session state is held in the client.


Kiemelés tőlem. A lényeg, hogy minden kérés egy atomi tranzakció, a kérések nem függenek össze, a szerver állapota mindig konzisztens kettő közt. A legjobb ellenpélda a többoldalas űrlap.
20

Szerintem egyszerűbb

Hidvégi Gábor · 2013. Ápr. 5. (P), 18.22
Szerintem egyszerűbb adatok/oldalak kiszolgálására jó a REST, de sokszor annyi adattal kell dolgozni, hogy egyszerűbb a szerveroldali munkamenetben tárolni a dolgokat. Ilyenkor például meg lehet szabadulni a bejövő adatok ellenőrzésének a felelősségétől (legalábbis a nagy részétől), valamint van olyan, amikor nem is szabad bizonyos állapotinformációknak kikerülnie a kliensre.