Rest
REST
REST API
- Representation State Transfer
 
- An architectural pattern for creating an API that uses HTTP as its communication method
 
- for designing network based application
 
- Resource: 
- If we have endpoint/URI(URL or URN), lets say https://127.0.0.1/coders then we have resource. Here coders is a resource.
 
- Its nothing new, we already used to make URLs that way
 
 
- Representation:
- When a client makes a GET request to coders/toran/ client gets following JSON response
 | {
"nickname": "toran",
"powerLevel": 5
}
  | 
 
- so, this is representation in the form of JSON having metadata
 
- representation also could be XML, HTML
 
- the same applies when a client sends a request which contains a 'coder' data, its sends representation
 
 
- Representational State:
- like browsing the web
 
- a HTML page is a representation of a resource at current state (or current data) of that resource.
 
- When we submit a form, we just send a representation back to the server
 
 
- Representational State Transfer
- a client and server exchange representations of a resource, which reflects its current state or desired state.
 
- So, REST is a way for two machines to transfer the state of a resource via representations.
 
 
Note: There is a very common confusion in terminology. "Resource"
- In URI "app/questions/1" here "1" is also know as resource and at the same time "questions" is also know as resource.
- Some people around the globe also use "1" as record/entity & "questions" as resource.
- We could generalize "1" as "resource object" and "questions" as "resource class"
HTTP Request Methods (HTTP verbs)
HTTP defines a set of request methods to indicate the desired action to be performed for a given resource
GET
 | GET /questions/:question_id HTTP/1.1
Host: www.example.com
  | 
 
- The GET method requests a representation of a specified resource.
 
- GET request should only used for data retrieval. (But can also be used for submit/posting/sending data)
 
- a resource is mentioned in URL.
 
POST
 | POST /questions/<existing_question> HTTP/1.1
Host: www.example.com/
  | 
 
- Used to modify/update an existing entity of a specified resource.
- Do mention the object/entity of the resource in the URL to update
 
- we should use PUT and PATCH for update
- PUT would create a new unwanted resource when the resouce doesn't exists while updating that particular resource
 
- PATCH is perfect for partial updation
 
 
- But there is no restrictions using POST for updates
 
 
 | POST /questions/ HTTP/1.1
Host: www.example.com
  | 
 
- Used to submit a new entity/data to a specified resource.
- Do not mention the object/entity of the resource in the URL while creating it. Otherwise it will give "Resource Not Found" error.
 
- Use this if you want server to let the name, the URL object while creating a new one
 
 
- Causes change in state of the resource
 
- Two simultaneous POST requests works fine (lets say, 1st request is updating some part & 2nd request is updating other part of an object) 
 
- The 
UPDATE performed by the POST method might not result in a resource that can be identified by a URI. 
PUT
- Used to create a new resource entity or overrite (Completely replaces) the existing one.
 
- For a new resource entity:
    
 | PUT /questions/:new_question_id HTTP/1.1
Host: www.example.com
  | 
 
- To overrite an existing one:
    
 | PUT /questions/:existing_question_id HTTP/1.1
Host: www.example.com
  | 
 
- Usefull when you know the name of the entity/object
 
- Use this if you want to name the URL object while creating a new one
 
- PUT is idempotent, so if you PUT the same object twice, it has no effect (will overrite)
 
- Can create or update an object with the same URL
 
DELETE
 | DELETE /api/resource/:id HTTP/1.1
Host: www.example.com/
  | 
 
- Deletes/destroyes a specified resource object/entity/record
 
PATCH
 | PATCH /users/1 HTTP/1.1
Host: www.example.com
Content-Type: application/example
If-Match: "c0b42b66e"
Content-Length: 120
{changes}
  | 
 
where [changes] could be JSON/XML like {email:'[email protected]'}
- Used to make partial modification to an existing resource object/entity.
 
- Works differently than POST & PUT for update
 
- Need to have URL object known
 
HEAD
 | $ curl http://0.0.0.0:8010/ --head
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.7.3
Date: Sat, 23 Aug 2020 17:14:52 GMT
Content-type: application/json; charset=utf-8
Content-Length: 13306
  | 
 
- Ask for the response same as GET but without response/message body.
- i.e. returns Header & Status Code, except Body
 
 
- Usages?
- to fetch headers, or to verify the API by status code
 
- to get the content size of a media file - without fetcching it actually
 
 
- request has body? No
- can send query params only
 
 
- successful response has body? No
 
- safe? Yes
 
- idempotent? Yes
 
- cacheable? Yes
 
- allowed in HTML forms? No
 
OPTIONS
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20  | $ curl /api/resource -X OPTIONS -i
# responds with header; and empty body
HTTP/2 200 OK
date: Sat, 07 Aug 2021 16:48:46 GMT
content-length: 0
vary: Origin
access-control-allow-origin: https://api.toran.com
access-control-allow-credentials: true
access-control-allow-headers: Accept,Accept-Version,Content-Length,Content-MD5,Content-Type,Date,X-Auth-Token,x-requested-with,x-csrftoken,x-page-total,Accept-Language,Connection,x-page-limit,Accept-Encoding,x-page-page,cache-control
access-control-allow-methods: GET,HEAD,POST,PATCH,PUT,DELETE
access-control-max-age: 3600
content-security-policy: default-src 'self'; object-src 'none'; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline';
strict-transport-security: max-age=31536000; includeSubDomains; preload
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=()
server: kong/2.1.4
# (optional) Body, btw DRF sends body by default
{"name":"Api Resource","description":"","renders":["application/json","text/html"],"parses":["application/json","application/x-www-form-urlencoded","multipart/form-data"]}
  | 
 
- Used to describe the communication option for the target resource 
 
- tell the capabilities of the API server, like list of supported:
- HTTP methods by the server
 
- header keys
 
Content-Type 
Accepts 
 
- request has body? No
- can send query params only
 
 
- successful response has body? Yes (optional)
 
- safe? Yes
 
- idempotent? Yes
 
- cacheable? No 
 
- allowed in HTML forms? No
 
- usage?
 
CONNECT
- starts two-way communications with the requested resource
 
- it can be used to open a tunnel
 
- ref
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/connect
 
- https://reqbin.com/Article/HttpConnect
 
 
TRACE
- Performs message loop-back test along the path to the target resource
 
HTTP Response Codes
- 1XX informational
 
- 2XX Success
- 200 (Ok)
 
- 201 (Created)
 
- 204 (No Content)
 
 
- 3XX Redirection
 
- 4XX Client Error
 
- 5XX Server Error