REST APIs

undefined
REST APIs
A PRACTICAL GUIDE
Key Elements of REST APIs - 1
Resources
The first key element is the resource itself.
Let assume that a web application on a server has records of several employees.
Let's assume the URL of the web application is http://demo.guru99.com.
Now in order to access an employee record resource via REST, one can issue the command
http://demo.guru99.com/employee/1
 This command tells the web server to please provide the details of the employee whose employee number is 1.
 
Then … the remaining info sent to the resource: VERBS, HEADERS, BODY (and then responses)
Key Elements - 2
 
Request Verbs
 
These describe what you want to do with the resource. A browser issues a GET verb to instruct the endpoint it wants to get data. However, there are
many other verbs available including things like POST, PUT, and DELETE. So in the case of the example http://demo.guru99.com/employee/1 , the web
browser is actually issuing a GET Verb because it wants to get the details of the employee record.
 
Request Headers
 
These are additional instructions sent with the request. These might define the type of response required or the authorization details.
 
Request Body
 
Data is sent with the request. Data is normally sent in the request when a POST request is made to the REST web service. In a POST call, the client
actually tells the web service that it wants to add a resource to the server. Hence, the request body would have the details of the resource which is
required to be added to the server.
 
Response Body
 
This is the main body of the response. So in our example, if we were to query the web server via the request http://demo.guru99.com/employee/1 , the
web server might return an XML document with all the details of the employee in the Response Body.
 
Response Status codes
 
These codes are the general codes which are returned along with the response from the web server. An example is the code 200 which is normally
returned if there is no error when returning a response to the client.
Key Elements - 3
 
RESTful Methods
 
The below list shows the verbs (POST, GET, PUT, and DELETE) and an example of what they would
mean.
 
Let's assume that we have a RESTful web service is defined at the location.
http://demo.guru99.com/employee . When the client makes any request to this web service, it can
specify any of the normal HTTP verbs of GET, POST, DELETE and PUT.
 
Below is what would happen If the respective verbs were sent by the client:
 
POST – This would be used to create a new employee using the RESTful web service
 
GET - This would be used to get a list of all employee using the RESTful web service
 
PUT - This would be used to update all employee using the RESTful web service
 
DELETE - This would be used to delete all employee using the RESTful web service
An example
 
Let's take a look from a perspective of just a single record. Let's say there was an employee
record with the employee number of 1, and we want to get their info.
 
The following actions would have their respective meanings.
 
POST
 – This would 
not
 be applicable since we are fetching data of employee 1 which is already
created.
 
GET
 - This would be used to get the details of the employee with Employee no. as 1 using the
RESTful web service
 
PUT
 - This would be used to update the details of the employee with Employee no. as 1 using
the RESTful web service
 
DELETE
 - This is used to delete the details of the employee with Employee no. as 1
Why REST?
ADVANTAGES
Standardization
Sort of … it’s a loosely defined standard.  No strict
rules for syntax or behaviour.  More guidelines
Simple interface representation
As long as you can encode the data (usually json),
you have your interface
Readable
Again, json
Easy to CREATE APIs
Human readable, no special tools (unlike SOAP)
DISADVANTAGES
Loose syntax and semantics
Interface basically enforced in code
Often, a RESTful implementation is not
(RESTful)
There’s no real way to enforce the
principles
REST, to a large degree, owes it’s growth to adoption by google, facebook, twitter … and it’s simplicity
How it looks on the
Network …
 
GET /api/v1/employee/1 HTTP/1.1
 
Host: dummy.restapiexample.com
 
Connection: keep-alive
 
Upgrade-Insecure-Requests: 1
 
DNT: 1
 
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116
Safari/537.36 Edg/83.0.478.58
 
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/we
bp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
 
Referer: http://dummy.restapiexample.com/
 
Accept-Encoding: gzip, deflate
 
Accept-Language: en-US,en;q=0.9
 
Cookie: PHPSESSID=5a45cbef42e2fe9918eef269fc2862e6;
 
HTTP/1.1 200 OK
 
Access-Control-Allow-Origin: *
 
Access-Control-Expose-Headers: Content-Type, X-Requested-With, X-
authentication, X-client
 
Cache-Control: no-store, no-cache, must-revalidate
 
Content-Type: 
application/json
;charset=utf-8
 
Date: Wed, 08 Jul 2020 17:09:12 GMT
 
Display: staticcontent_sol
 
Expires: Thu, 19 Nov 1981 08:52:00 GMT
 
Host-Header: c2hhcmVkLmJsdWVob3N0LmNvbQ==
 
Pragma: no-cache
 
Referrer-Policy:
 
Response: 200
 
Server: nginx/1.16.0
 
Vary: Accept-Encoding
 
Vary: Accept-Encoding,User-Agent,Origin,X-APP-JSON
 
X-Ezoic-Cdn: Miss
 
X-Middleton-Display: staticcontent_sol
 
X-Middleton-Response: 200
 
X-Sol: pub_site
 
Content-Length: 134
 
{"status":"success","data":{"id":"1","employee_name":"Tiger
Nixon","employee_salary":"320800","employee_age":"61","profile_image":""}}
Server side
API: URL AND QUERY STRING
 
from
 flask_restful 
import
 request
 
from
 flask_restful 
import
 reqparse
 
import
 json
 
class
 
HelloWord_2_URL_Params
(
Resource
):
 
    
def
 
get
(
self
param1
param2
):
 
        
print
(
f
"param1=
{
param1
}
; param2=
{
param2
}
"
)
 
        
return
 
def
 
post
(
self, param1, param2
):
 
        print(f"2:POST: param1={param1}; param2={param2}")
 
        return (f"2:POST: param1={param1}; param2={param2}")
 
class
 
HelloWord_2a_URL_Params
(
Resource
):
 
    
def
 
get
(
self
param1
):
 
        
print
(
f
"param1=
{
param1
}
"
)
 
        
return
 
f
"GET made it with 
{
param1
}
"
 
class
 
HelloWorld_3_QueryString
(
Resource
):
 
    
def
 
get
(
self
):
 
        p1 = request.args.get(
'param1'
)
 
        p2 = request.args.get(
'param2'
)
 
        
print
(
f
"QueryString param1=
{
p1
}
; param2=
{
p2
}
"
)
 
        
return 
f
"QueryString param1=
{
p1
}
; param2=
{
p2
}
"
API: BODY
 
class
 
HelloWorld_4_BodyParams
(
Resource
):
 
    
def
 
post
(
self
):
 
        
# Define parser and request args
 
        parser = reqparse.RequestParser()
 
        parser.add_argument(
'param1'
type
=
str
)
 
        parser.add_argument(
'param2'
type
=
str
)
 
        args = parser.parse_args()
 
        p1 = args[
'param1'
]
 
        p2 = args[
'param2'
]
 
        
print
(
f
"QueryString param1=
{
p1
}
; param2=
{
p2
}
"
)
SERVER.PY 
#where you declare the endpoint routing
api.add_resource(HelloWord_2_URL_Params, 
'/h2/<string:param1>&<string:param2>'
#api 'endpoint’
api.add_resource(HelloWord_2a_URL_Params, 
'/h2/<string:param1>/path2'
#api param in middle of 'endpoint'
api.add_resource(HelloWorld_3_QueryString, 
'/h3'
#api 'endpoint’; params added when you call URL
api.add_resource(HelloWorld_4_BodyParams, 
'/h4'
#api 'endpoint’; params added via code in html body
Notice how you can
have the same API
signature but a
different verb!
Client side
 
import
 json
 
    
def
 
test_hello_world_params
(
self
):
 
        
print
(
"Testing different param methods"
)
 
        #URL
        result = get_rest_call(
self
,
 
          
'http://localhost:5000/h2/param1_value&param2_value'
)
 
        
print
(
f
"HelloWorld_2_URL_Params:
{
result
}
"
)
#URL with param in the middle
 
        result = get_rest_call(
self
'http://localhost:5000/h2/param1_value/path2'
)
 
        
print
(
f
"HelloWorld_2a_URL_Params:
{
result
}
"
)
 
        #Query string
 
       result = get_rest_call(
self
,
 
          
'http://localhost:5000/h3?param1=param1_value&param2=param2_value'
)
 
        
print
(
f
"HelloWord_2_URL_Params:
{
result
}
"
)
 
        #Body params
 
      data = 
dict
(
param1
=
'param1_value'
param2
=
'param2_value'
)
 
        jdata = json.dumps(data)
 
        
hdr = {'content-type': 'application/json’}
 #Must set content type
 
        result = post_rest_call(
self
'http://localhost:5000/h4’, jdata, hdr
)
 
        
print
(
f
"HelloWorld_4_BodyParams:
{
result
}
"
)
 
The big difference … (pseudo code)
BEFORE
NOW
def get_users():
  return exec_get_al(“SELECT * from users”)
def test_check_users():
  #See if there are 10 users
  users = get_users()
  assertTrue(len(users)==10)
def list_users():
    return exec_get_all('SELECT id, foo FROM
example_table')
def test_check_users():
     #See if there are 10 users
         expected = 10
        actual = get_rest_call(self, 'http://localhost:5000/users')
        self.assertTrue(len(actual) == expected)
api.add_resource(Users, '/users') #In server.py
class Users(resource):
    def get(self):
        return dict(example.list_users())
A few cautions
 
There are some other ‘rules’ in using the various VERBS in HTTP/ RESTful APIs
 
POST
 – Data is usually sent in the body of the message, along with any params in the URL/
Query string
 
GET
 - There is generally NO data in the body of the message.  Only params in the URL/ Query
string
 
PUT
 - Similar to POST.  Data is usually sent in the body of the message, along with any params in
the URL/ Query string
 
DELETE
 - There is generally NO data in the body of the message.  Only params in the URL/ Query
string
 
For GET/ POST, you can technically craft an HTTP payload with data in the body, but some
servers may drop that content – best not to take the risk!
Slide Note
Embed
Share

Key elements of REST APIs include resources, request verbs, and RESTful methods. Resources represent the entities accessed through the API, while request verbs define actions like GET, POST, PUT, and DELETE. RESTful methods correspond to HTTP verbs and dictate actions such as creating, retrieving, updating, and deleting resources. Understanding these key elements is essential for building and interacting with RESTful web services effectively.

  • REST APIs
  • Resources
  • Verbs
  • RESTful Methods
  • Web Services

Uploaded on Feb 16, 2025 | 0 Views


Download Presentation

Please find below an Image/Link to download the presentation.

The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author.If you encounter any issues during the download, it is possible that the publisher has removed the file from their server.

You are allowed to download the files provided on this website for personal or commercial use, subject to the condition that they are used lawfully. All files are the property of their respective owners.

The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author.

E N D

Presentation Transcript


  1. REST APIs A PRACTICAL GUIDE

  2. Key Elements of REST APIs - 1 Resources The first key element is the resource itself. Let assume that a web application on a server has records of several employees. Let's assume the URL of the web application is http://demo.guru99.com. Now in order to access an employee record resource via REST, one can issue the command http://demo.guru99.com/employee/1 This command tells the web server to please provide the details of the employee whose employee number is 1. Then the remaining info sent to the resource: VERBS, HEADERS, BODY (and then responses)

  3. Key Elements - 2 Request Verbs These describe what you want to do with the resource. A browser issues a GET verb to instruct the endpoint it wants to get data. However, there are many other verbs available including things like POST, PUT, and DELETE. So in the case of the example http://demo.guru99.com/employee/1 , the web browser is actually issuing a GET Verb because it wants to get the details of the employee record. Request Headers These are additional instructions sent with the request. These might define the type of response required or the authorization details. Request Body Data is sent with the request. Data is normally sent in the request when a POST request is made to the REST web service. In a POST call, the client actually tells the web service that it wants to add a resource to the server. Hence, the request body would have the details of the resource which is required to be added to the server. Response Body This is the main body of the response. So in our example, if we were to query the web server via the request http://demo.guru99.com/employee/1 , the web server might return an XML document with all the details of the employee in the Response Body. Response Status codes These codes are the general codes which are returned along with the response from the web server. An example is the code 200 which is normally returned if there is no error when returning a response to the client.

  4. Key Elements - 3 RESTful Methods The below list shows the verbs (POST, GET, PUT, and DELETE) and an example of what they would mean. Let's assume that we have a RESTful web service is defined at the location. http://demo.guru99.com/employee . When the client makes any request to this web service, it can specify any of the normal HTTP verbs of GET, POST, DELETE and PUT. Below is what would happen If the respective verbs were sent by the client: POST This would be used to create a new employee using the RESTful web service GET - This would be used to get a list of all employee using the RESTful web service PUT - This would be used to update all employee using the RESTful web service DELETE - This would be used to delete all employee using the RESTful web service

  5. An example Let's take a look from a perspective of just a single record. Let's say there was an employee record with the employee number of 1, and we want to get their info. The following actions would have their respective meanings. POST This would not be applicable since we are fetching data of employee 1 which is already created. GET - This would be used to get the details of the employee with Employee no. as 1 using the RESTful web service PUT - This would be used to update the details of the employee with Employee no. as 1 using the RESTful web service DELETE - This is used to delete the details of the employee with Employee no. as 1

  6. Why REST? ADVANTAGES DISADVANTAGES Standardization Loose syntax and semantics Sort of it s a loosely defined standard. No strict rules for syntax or behaviour. More guidelines Interface basically enforced in code Simple interface representation As long as you can encode the data (usually json), you have your interface Often, a RESTful implementation is not (RESTful) There s no real way to enforce the principles Readable Again, json Easy to CREATE APIs Human readable, no special tools (unlike SOAP) REST, to a large degree, owes it s growth to adoption by google, facebook, twitter and it s simplicity

  7. HTTP/1.1 200 OK Access-Control-Allow-Origin: * Access-Control-Expose-Headers: Content-Type, X-Requested-With, X- authentication, X-client Cache-Control: no-store, no-cache, must-revalidate Content-Type: application/json;charset=utf-8 Date: Wed, 08 Jul 2020 17:09:12 GMT Display: staticcontent_sol Expires: Thu, 19 Nov 1981 08:52:00 GMT Host-Header: c2hhcmVkLmJsdWVob3N0LmNvbQ== Pragma: no-cache Referrer-Policy: Response: 200 Server: nginx/1.16.0 Vary: Accept-Encoding Vary: Accept-Encoding,User-Agent,Origin,X-APP-JSON X-Ezoic-Cdn: Miss X-Middleton-Display: staticcontent_sol X-Middleton-Response: 200 X-Sol: pub_site Content-Length: 134 How it looks on the Network GET /api/v1/employee/1 HTTP/1.1 Host: dummy.restapiexample.com Connection: keep-alive Upgrade-Insecure-Requests: 1 DNT: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 Edg/83.0.478.58 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/we bp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Referer: http://dummy.restapiexample.com/ Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.9 Cookie: PHPSESSID=5a45cbef42e2fe9918eef269fc2862e6; {"status":"success","data":{"id":"1","employee_name":"Tiger Nixon","employee_salary":"320800","employee_age":"61","profile_image":""}}

  8. SERVER.PY #where you declare the endpoint routing api.add_resource(HelloWord_2_URL_Params, '/h2/<string:param1>&<string:param2>') #api 'endpoint api.add_resource(HelloWord_2a_URL_Params, '/h2/<string:param1>/path2') #api param in middle of 'endpoint' api.add_resource(HelloWorld_3_QueryString, '/h3') #api 'endpoint ; params added when you call URL api.add_resource(HelloWorld_4_BodyParams, '/h4') #api 'endpoint ; params added via code in html body Server side API: URL AND QUERY STRING API: BODY from flask_restful import request from flask_restful import reqparse import json class HelloWorld_4_BodyParams(Resource): def post(self): # Define parser and request args parser = reqparse.RequestParser() parser.add_argument('param1', type=str) parser.add_argument('param2', type=str) args = parser.parse_args() class HelloWord_2_URL_Params(Resource): def get(self, param1, param2): print(f"param1={param1}; param2={param2}") return def post(self, param1, param2): print(f"2:POST: param1={param1}; param2={param2}") return (f"2:POST: param1={param1}; param2={param2}") Notice how you can have the same API signature but a different verb! p1 = args['param1'] p2 = args['param2'] print(f"QueryString param1={p1}; param2={p2}") class HelloWord_2a_URL_Params(Resource): def get(self, param1): print(f"param1={param1}") return f"GET made it with {param1}" class HelloWorld_3_QueryString(Resource): def get(self): p1 = request.args.get('param1') p2 = request.args.get('param2') print(f"QueryString param1={p1}; param2={p2}") return f"QueryString param1={p1}; param2={p2}"

  9. Client side import json def test_hello_world_params(self): print("Testing different param methods") #URL result = get_rest_call(self, 'http://localhost:5000/h2/param1_value&param2_value') print(f"HelloWorld_2_URL_Params:{result}") #URL with param in the middle result = get_rest_call(self, 'http://localhost:5000/h2/param1_value/path2') print(f"HelloWorld_2a_URL_Params:{result}") #Query string result = get_rest_call(self, 'http://localhost:5000/h3?param1=param1_value&param2=param2_value') print(f"HelloWord_2_URL_Params:{result}") #Body params data = dict(param1='param1_value', param2='param2_value') jdata = json.dumps(data) hdr = {'content-type': 'application/json } #Must set content type result = post_rest_call(self, 'http://localhost:5000/h4 , jdata, hdr) print(f"HelloWorld_4_BodyParams:{result}")

  10. The big difference (pseudo code) NOW BEFORE def test_check_users(): #See if there are 10 users expected = 10 actual = get_rest_call(self, 'http://localhost:5000/users') self.assertTrue(len(actual) == expected) def test_check_users(): #See if there are 10 users users = get_users() assertTrue(len(users)==10) api.add_resource(Users, '/users') #In server.py class Users(resource): def get(self): return dict(example.list_users()) def get_users(): return exec_get_al( SELECT * from users ) def list_users(): return exec_get_all('SELECT id, foo FROM example_table')

  11. A few cautions There are some other rules in using the various VERBS in HTTP/ RESTful APIs POST Data is usually sent in the body of the message, along with any params in the URL/ Query string GET - There is generally NO data in the body of the message. Only params in the URL/ Query string PUT - Similar to POST. Data is usually sent in the body of the message, along with any params in the URL/ Query string DELETE - There is generally NO data in the body of the message. Only params in the URL/ Query string For GET/ POST, you can technically craft an HTTP payload with data in the body, but some servers may drop that content best not to take the risk!

More Related Content

giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#