Skip to content

REST

RERepresentational
SState
TTransfer

Server responds to requests with a representation of a resource (typically as JSON).


  • Roy Fielding identified 5 architectural concepts that make the web successful in his dissertation (2000):
    • Addressable Resources
    • A Uniform, Constrained Interface
    • Representation-Oriented
    • Communicate Statelessly
    • Hypermedia As the Engine Of Application State (HATEOAS)

  • Before REST was introduced there was often just one address where clients sent requests to.
  • The functionality or resource was specified within the message body.
  • REST uses the URI concept for distinguishing between resources within one service
    • people-service.com/students
    • people-service.com/teachers

  • Use a limited number of operations to manipulate resources.
HTTP-MethodDescription
GETRead-only, Idempotent, Secure, State will be unchanged
POSTAdd a new resource. Not idempotent: Every call will change state
PUTCreate a resource if it doesn’t exist, update it if it exists. Idempotent!
DELETEDeletes a resource. Idempotent
HEADJust as GET, but only status codes will be returned. Idempotent
OPTIONSList which methods are supported for a resource. Idempotent

An operation is idempotent if it can be applied multiple times without changing the result beyond the initial execution.

Idempotence on Wikipedia


Uniform, Constrained Interface - Advantages

Section titled “Uniform, Constrained Interface - Advantages”
  • Simplicity
    • Easy to understand
    • Lowers need for detailed interface description
    • No complex client libraries are needed
  • Interoperability
    • HTTP-Client-Library is sufficient for accessing REST services and available for practically every programming language or platform
  • Scalability
    • Results of read-only operations (GET, HEAD, OPTIONS) can be cached by clients and proxy-servers

  • Client and server exchange representations of resources using HTTP requests and responses.
  • Representation is not standardized
  • Common formats:
    • JSON
    • XML
    • YAML
  • HTTP-Header ‘Content-Type’ defines which format will be used:
    • Content-Type: application/json
  • Using HTTP-Header ‘Accept’, the client can specify the preferred format (e.g. if the server supports multiple formats)
    • Accept: application/json

  • A single request in independent from previous and following requests
  • Server keeps no state for clients
  • Hugely benefits scalability, as you can distribute load on various servers because state doesn’t have to be shared

  • Hypermedia As the Engine Of Application State
  • Servers provide information about resources dynamically
  • Subsequent requests can be made using the information from the response
GET /accounts/12345 HTTP/1.1
Host: bank.example.com
{
"account": {
"account_number": 12345,
"balance": {
"currency": "usd",
"value": 100.00
},
"links": {
"deposits": "/accounts/12345/deposits",
"withdrawals": "/accounts/12345/withdrawals",
"transfers": "/accounts/12345/transfers",
"close-requests": "/accounts/12345/close-requests"
}
}
}

  • /employees: all employees
  • /employees/{id}: specific employee
  • /logbookentries: all entries
  • /logbookentries/{id}: specific entry
  • /employees/{id}/logbookentries: all logbookentries for specific employee

  • GET /employees[?startIndex=0&size=5]
    • Read (a part of) all employee objects
  • GET /employees/{id}
    • Read an employee object via its key
  • POST /employees
    • Insert an employee object. Key will be generated and (usually) returned.
  • PUT /employees/{id}
    • Update an employee object. Create if not exists.
  • DELETE /employees/{id}
    • Delete an employee object (or mark as deleted)

  • Following the principles by Roy Fielding a RESTful service can use basically any communication protocol.
  • However in practice, REST is basically only used with HTTP

GET /employees HTTP/1.1
Host: employee-service.com
Accept: application/json
User-Agent: Mozilla/5.0
PUT /employees/42 HTTP/1.1
Host: employee-service.com
Content-Type: application/json
Accept: application/json
{
"firstName": "Fritz",
"lastName": "Phantom"
}

A response consists of

  • a status code
  • response headers
  • a body

CategoryDescription
1xxInformational response. Processing continues
2xxSuccess
3xxRedirection
4xxClient errors. (Error seems to have been caused by client)
5xxServer errors.

Status CodeMessageDescription
101Switching Protocolse.g. when opening WebSocket connection
200OKRequest was handled successfully
201CreatedRequest was successful, a resource has been created.
301Moved PermanentlyRedirects permanently to location specified in Location Header
400Bad RequestRequest is malformed
401UnauthorizedUser not logged in or no authorization information provided.
403ForbiddenUser is logged in but not permitted to access the resource.
404Not FoundRequested resource could not be found
418I’m a teapotApril fools joke by the IETF
500Internal Server ErrorUnspecified error on the server happened.

HTTP/1.1 200 OK
Date: Tue, 10 Sep 2024 09:15:42 GMT
Server: Apache/2.4.38 (Debian)
Content-Type: application/json; charset=UTF-8
{
"firstName" : "Fritz" ,
"lastName" : "Phantom"
}