I förra inlÀgget sade jag att REST var ett designmönster dÀr man anvÀnder HTTP som applikationsprotokoll, inte som i SOAP som försöker vara protokollagnostiskt och som betraktar HTTP som ett transportprotokoll, ett slags TCP som kan ta sig genom brandvÀggar.
NÄ, att REST anvÀnder HTTP som applikationsprotokoll betyder att applikationer skrivna efter REST-mönstret Àrver egenskaperna frÄn den kommunikationsmodell som HTTP bygger pÄ.
Detta Ă€r ju inget konstigt. SOAP Ă€rver egenskaperna frĂ„n sin kommunikationsmodell. SOAPs modell kan vi kalla för RPC-modellen som i sin tur Ă€r en distribuerad variant av den vanliga ”message passing object oriented”-modellen (Java, C++, m fl).
Message-passing, det betyder att all interaktion med ett objekt gĂ„r ut pĂ„ att man skickar ett meddelande till det objektet (populĂ€rt kallat: ”anropa en metod pĂ„ objektet”). Oavsett vad meddelandet ska göra (ta bort, lĂ€gga till, förĂ€ndra, ingenting).
I RPC-modellen finns det ett ”objekt” (eller egentligen ett interface) pĂ„ en annan datamaskin. Metoderna i detta interface kan man anropa, nĂ€stan som vore de lokala anrop (i alla fall Ă€r det sĂ„ det ska kĂ€nnas). Det Ă€r RPC-modellens styrka: den imiterar lokala anrop sĂ„ gott det gĂ„r. Och sĂ„ funkar ju EJB, sĂ„ funkar CORBA, sĂ„ funkar XML-RPC och sĂ„ funkar SOAP:
//ganska begripligt interface, enkelt att omvandla till
//distribuerat objekt sÄsom SOAP, CORBA EJB m fl.
public Customer findCustomer( String searchString);
public void saveCustomer( Customer customer);
public void removeCustomer( String customerId);
public double getCurrencyMultiplier( String currencyIso);
public String[] getCurrencies();
REST Ä sin sida handlar om webben. Och webben Àr bland annat följande:
- En gigantisk samling resurser, som oavsett vad de Àr för nÄgot, Àr Ätkomliga via varsin URL. PÄ lika villkor.
- En plats dÀr man enkelt kan be om en resurs, och den kommer till en i form av en radda oktetter (bytes). Oavsett om det Àr ett foto eller om det Àr en vÀderprognos eller om det Àr ett javaprogram. PÄ lika sÀtt.
- Ăven om webben Ă€r agnostisk i vad den skickar, sĂ„ meddelar den prydligt vad oktettströmmen ska tolkas som: text/plain, image/png, application/x-java-jnlp-file, x-whatever/x-from-the-future.
- Att be om en resurs kallas för GET. Det finns Àven PUT för att placera en resurs pÄ en URL, och DELETE för att ta bort en resurs pÄ en URL.
- Det handlar om en tillstÄndslös kommunikation. I grund och botten struntar protokollet HTTP i om du bad om en viss resurs alldeles nyss, för HTTP Àr alla anrop lika. TillstÄndet bestÀms istÀllet av vilken resurs klienten rÄkar titta pÄ för tillfÀllet.
- DÀremot innehÄller protokollet sÀtt att be en anvÀndare identifiera och autentiera sig, vilket ju Àr det vanligaste skÀlet till att man alls vill ha sessioner. Men autentieringen och auktorisationen Àger alltsÄ rum en gÄng per anrop.
Vad innebĂ€r denna skillnad? Jo…
Webbmodellen stödjer tre specialmeddelanden: HÀmta resurs, Spara resurs, Ta bort resurs. Verben GET, PUT och DELETE. Precis som ett filsystem, fast med globalt Ätkomliga objekt.
Kan du nu förklara för mig hur grÀnssnittet ovan (findCustomer() osv) skulle kunna se ut, om man istÀllet tÀnkte i REST-banor?
Helt riktigt. NÀr man modellerar system, sÄ inser man att dessa tre verb Àr tillÀmpliga pÄ i stort sett alla objekt. PUT Àr en införande, eller en förÀndrande, hÀndelse, DELETE Àr en borttagande hÀndelse. GET Àr ju helt enkelt att betrakta ett objekt, en betraktande hÀndelse, en hÀndelse som inte ska pÄverka objektet sjÀlvt.
Vi ser att alla metoderna i vÄrt interface ovan Àr av dessa tre slag. Fast för olika resurser:
GET /customers?name~Ola*
GET /currencies
GET /currencies/USD
PUT /customers/Ola
DELETE /customers/Ola
NÀsta gÄng ska vi titta mer pÄ varför och hur.