REST

REpresentational State Transfer

http://mbranko.github.io/webkurs

Ovo je deo web kursa

Literatura

REST: REpresentational State Transfer

  • Roy Fielding: "Architectural Styles and the Design of Network-based Software Architectures"
    • PhD rad sa University of California, Irvine, 2000.
  • definiše principe softverske arhitekture za web
  • alternativa za razvoj web servisa u odnosu na standardni SOAP+WSDL+...
  • autor je učestvovao u razvoju:
    • HTTP (RFC 1945, RFC 2616, RFC 2145, RFC 2068)
    • URI (RFC 2396, RFC 1808)
    • Apache HTTP Server

REST principi

  • pojam resursa: svaki entitet na webu je resurs. Npr. web sajt, HTML strana, XML fajl, web servis, fizički uređaj, ...
  • adresa resursa: svaki resurs je identifikovan svojim URI-jem
  • nad resursima se obavljaju jednostavne operacije

REST principi

  • jednostavne operacije nad resursima kao HTTP metode:
    • GET -- čitanje
    • POST -- kreiranje
    • PUT -- ažuriranje
    • DELETE -- brisanje

Primer: kupovina avionskih karata

  • resurs = avionska karta
  • HTTP metoda jasno označava operaciju:

Šta znači "representational state transfer"?

  • klijent se obraća resursu putem URI-ja
  • dobija reprezentaciju resursa
  • ta reprezentacija pomera klijenta u novo stanje
  • klijent se zatim obraća drugom resursu, itd.
  • seoba klijenta iz stanja u stanje = transfer

Motiv za razvoj RESTa

  • definisanje dizajn šablona koji opisuje kako bi web trebalo da radi
  • tako da predstavlja okvir za razne web standarde
  • i dizajn web servisa

REST nije standard

  • W3C ga neće propisati kao standard
  • IBM/Oracle/Microsoft/itd neće prodavati REST razvojne alate
  • REST stimuliše upotrebu standarda:
    • HTTP
    • URI
    • XML/HTML/JSON/GIF/JPEG/itd. (formati za reprezentaciju resursa)

REST + XML/JSON

  • nije obavezno koristiti HTML za podatke
  • možemo koristiti i HTML, ...
  • ali ako nam trebaju machine-readable podaci, XML ili JSON su najzgodniji
  • pri tome, niko ne nameće neku posebnu šemu za podatke, niti format poruka!

Povezivanje podataka

  • podaci koje vraća web servis treba da sadrže linkove ka drugim podacima
  • → dizajn podataka kao mreže informacija
  • nasuprot tome, OO dizajn promoviše enkapsulaciju

Primer RESTful servisa: studentska služba

  • neka je naš web servis dostupan na adresi http://www.ftn.uns.ac.rs
  • neka je opis jednog studenta u JSON-u ovakav:


{
  "name": "Žika",
  "age": 20
}          

Lista studenata kao XML resurs


[
  {
    "name": "Žika",
    "age": 20
  },
  {
      "name": "Laza",
      "age": 21
  }
]
          

Pristup podacima

  • na adresi http://www.ftn.uns.ac.rs/students je lista studenata
  • na adresi http://www.ftn.uns.ac.rs/students/<ime> je konkretan student

Čitanje podataka o studentu: zahtev


GET /students/Žika HTTP/1.1
Host: www.ftn.uns.ac.rs
Date: Fri, 20 May 2011 12:00:00 GMT
Accept: application/json
          

Čitanje podataka o studentu: odgovor


HTTP/1.1 200 OK
Date: Fri, 20 May 2011
Server: Apache 2.2.0
Content-Length: 123
Connection: close
Content-Type: application/json

{
  "name": "Žika",
  "age": 20
}
          

Dodavanje novog studenta: zahtev


POST /students HTTP/1.1
Host: www.ftn.uns.ac.rs
Date: Fri, 20 May 2011 12:00:00 GMT
Accept: text/xml
Content-Length: 123
Content-Type: application/json

{
  "name": "Pera",
  "age": 20
}
          

Dodavanje novog studenta: odgovor


HTTP/1.1 201 Created
Date: Fri, 20 May 2011 12:00:00 GMT
Location: http://www.ftn.uns.ac.rs/students/Pera
Content-Length: nnn
Content-Type: application/json

{
  "name": "Pera",
  "age": 20
}
          

Pojedinačni resursi i kolekcije resursa

  • URI za kolekciju:
    http://www.ftn.uns.ac.rs/students
  • URI za pojedinačni resurs:
    http://www.ftn.uns.ac.rs/students/<ime>
  • operacije nad različitim vrstama URI-ja imaju različito značenje!

Pojedinačni resursi i kolekcije resursa

  Collection URI Element URI
GET izlista URI-je i eventualno druge podatke o elementima kolekcije dobija reprezentaciju elementa kolekcije u obliku odgovarajućeg MIME tipa
POST kreira novi element kolekcije; URL novog elementa se vraća u odgovoru tretira dati element kao kolekciju i kreira novi element u njoj
PUT zameni celu kolekciju novom Zameni element novim; ako ne postoji, kreira ga
DELETE uklanja celu kolekciju uklanja dati element kolekcije

Java klijent za RESTful web servis

  • potrebni sastojci:
    1. rukovanje HTTP konekcijama
    2. parsiranje XML-a

Twitter klijent


URL twitter = new URL(
  "http://twitter.com/statuses/public_timeline.xml");
URLConnection tc = twitter.openConnection();
BufferedReader in = new BufferedReader(
  new InputStreamReader(tc.getInputStream(), "UTF8"));
          

Odgovor Twittera


<?xml version="1.0" encoding="UTF-8"?>
<statuses type="array">
<status>
  <created_at>Fri May 20 18:49:46 +0000 2011</created_at>
  <id>71648829237248000</id>
  <text>So high school is done. LET THE PARTY BEGIN</text>
  <truncated>false</truncated>
  <favorited>false</favorited>
  <in_reply_to_status_id></in_reply_to_status_id>
  <in_reply_to_user_id></in_reply_to_user_id>
  <in_reply_to_screen_name></in_reply_to_screen_name>
  <retweet_count>0</retweet_count>
  <retweeted>false</retweeted>

  <user>
    <id>250394499</id>
    <name>Taylor Stricklin</name>
    <screen_name>TaylorStricklin</screen_name>
...
</statuses>
          

Odgovor Twittera u raznim formatima

  • XML:
    http://twitter.com/statuses/public_timeline.xml
  • JSON:
    http://twitter.com/statuses/public_timeline.json
  • RSS:
    http://twitter.com/statuses/public_timeline.rss
  • ATOM:
    http://twitter.com/statuses/public_timeline.atom

Korisne biblioteke

  • Apache HttpComponents:
    precizna i detaljna implementacija HTTP protokola sa klijentske strane
  • Apache Commons Codec:
    konverzija različitih formata

Klijent sa Apache bibliotekama


HttpClient client = new HttpClient();

GetMethod get = new GetMethod(
  "http://twitter.com/statuses/public_timeline.json");

int statusCode = client.executeMethod(get);

if (statusCode == HttpStatus.SC_OK) {
  ... method.getResponseBody() ...
}
          

RESTful servisi i Java

  • JAX-RS: Java API for RESTful Web Services
  • implementacije:
    • Jersey
    • Apache CXF
    • RESTEasy
    • Restlet
    • Apache Wink
  • pisanje servisa pomoću anotiranih Java klasa

Resurs

  • resurs = anotirana POJO klasa

@Path("/students")
public class Students {
...

@Path("/students/{username}")
public class Student {
...

@Path("/teachers/{username: [a-zA-Z]}")
public class Teacher {
...
          

Operacije

  • operacije = anotirane metode u resurs klasi

@Path("/students")
public class Students {

  @GET
  public String handleGet() { ... }
  
  @POST
  public String handlePost(String payload) { ... }  
  
  @PUT
  public String handlePut(String payload) { ... }  

  @DELETE
  public String handleDelete() { ... }
...
          

URI promenljive

  • prijem parametara iz URI-ja

@Path("/student/{username}")
public class Student {

  @GET
  public String handleGet(@PathParam("username") String username) { ... }
  
...
          

Različiti formati podataka

  • ista operacija može primiti podatke u različitim formatima

@Path("/student/{username}")
public class Student {

  @PUT
  @Consumes("application/xml")
  public String updateXML(String payload) { ... }
  
  @PUT
  @Consumes("application/json")
  public String updateJSON(String payload) { ... }
  
...
          

Različiti formati podataka

  • ista operacija može vratiti podatke u različitim formatima

@Path("/student/{username}")
public class Student {

  @GET
  @Produces("application/xml")
  public String getXML() { ... }
  
  @GET
  @Produces("application/json")
  public String getJSON() { ... }
  
...
          

Prijem podataka iz HTML formi

  • primer HTML forme:

<form action="users" method="POST">
  Name: <input type="text" name="name"/>
  Age: <input type="text" name="age"/>
  Address: <input type="text" name="address"/>
</form>
          

Prijem podataka iz HTML formi


@Path("/students")
public class Students {

  @POST
  @Consumes("application/x-www-form-urlencoded")
  public void addUser(
      @FormParam("name") String name,
      @FormParam("age") String age,
      @FormParam("address") String address) { ... }
  
...
          

Karakteristike operacija

  • PUT i DELETE: idempotentne
    više identičnih zahteva daje isti rezultat

  • GET: bezbedna (safe method)
    samo za čitanje; ne sme da menja stanje na serveru

Karakteristike operacija

  • RESTful servisi su stateless:
    stanje je isključivo na klijentu
  • transakcije su u nadležnosti klijenta

Kraj dela

← Početak dela

⇐ Početak kursa