4. REST Introduction REST is a unifying theory for how “distributed hypermedia” systems are best organized and structured. Lesson learnt from developers: CRUD operations correspond to HTTP POST, GET, PUT, and DELETE. Consistent, robust, and understandable. Names identifies resources
5. Resources A resource is something with identity. a row in adatabase, a physical object, an abstract concept, or a real-world event in progress A resource has a URI. Possible to have more than one??? Different representations of a resource vary based on their content types. How does the server know which one to send? URI extensions (/users/1.html,/users/1.xml) Content negotiation (Accept-Language, Accept-Charset, Accept-Encoding, or Accept)
7. Embrace hyperlinks Use hyperlinks to related resources. Provide a reasonable quantity of information and link to further details.
8. Statelessness REST is stateless. It presents scalibility. Each request carries no state at lower or higher levels. Resource state the internal state that all non trivial resources carry, and it is essential to a web application. Application state (session state) the state of the cli-ent’s interaction with the server keeping this state on the server violates REST principles as it breaks addressability.
9. HTTP Verbs (HTTP Methods) Verbs correspond to actions on resources. GET HEAD POST PUT DELETE
10. Safe Methods Safe methods are used for retrieval. never be to perform an update All safe methods are idempotent.
11. Idempotent Methods GET, HEAD, PUT, and DELETE are idempotent methods. The response (and resource state) is the same, no matter how many times thataction is performed.
12. HTTP Status Codes Success and failure should be inferred from the HTTP response status not from an error message within the payload. 1xx: Informational 2xx: Success 3xx: Redirection 4xx: Client Error 5xx: Server Error
13. GET Method Transfers a representation of a resource to the client. Read-only access to a resource. The server must decide to perform an update based on a safe request.
14. PUT Method Updates a resource with the representation provided in the body. If not exist before, the request creates a new one.
15. DELETE Method Deletes the resource identified by its URI. Subsequent GET queries to the same URI should return a status code of 410 (Gone) or 404 (Not Found).
16. POST Method Neither safe nor idempotent Two primary uses: creation of new objects annotation of existing objects The URI of the POST is that of the object’s container or parent. The Location header should point to the URI of the created resource
18. Resource-Based Named Routes Encapsulates all of the Rails CRUD actions into one routing statement map.resources :users
19. Custom resource routes create custom named routes either to the collection (the parent resource) or the members of the collection (the children). map.resources :people, :collection => { :search => :get }, :member => { :deactivate => :post }
20. Nested routes map.resources :people do |person| person.resources :friends end /people/1/friends /people/1/friends/2 map.resources :people do |person| person.resources :friends, :name_prefix => 'person_' end The name _prefix option adds a prefix to the generated routes. person_friends_path and person_friend_path
21. Nested routes (cont.) map.resources :people map.resources :friends, :name_prefix => 'person_', :path_prefix => '/people/:person_id‘ path_prefix option will add a prefix to the URIs that the route will recognize and generate.
22. Singleton resource routes Sometimes, there will be an entity that exists as a singleton. map.resources :users do |user| user.resource :account end The resource name is still singular, but the inferred controller name is plural.
23. ActionView Support The link_to family of helpers can take a :method parameter to define the HTTP method. generate hidden form field for the _method parameter for PUT and DELETE. <%= link_to 'Delete', person_path(@person), :method => :delete %>
24. Content Types Rails has introduced rich support for rendering different responses based on the content type the client wants, via the respond_to method. respond_to do |format| format.html #format.html { render } format.xml { render :xml => @product } end respond_to :html, :xml In config/initializers/mime_types.rb Mime::Type.register "image/jpeg", :jpg, [], %w(jpeg)
27. Resourceful session state Alternative to holding session state on the server? Nearly any problem REST developers face, the solution is to model it as a resource.
37. Authentication Can we used cookies? Yes, cookies can be used, but mainly for authentication. How to authenticate users in a RESTful way via the browser and other clients?
38. Authentication (cont.) Use cookies/sessions to store information just for authentication. Use HTTP Basic authentication for other server side clients. For more secure, use secure http.