DEV Community

Cover image for A Full Guide: Understand Everything About APIs with Examples
Ahmed Radwan
Ahmed Radwan

Posted on • Edited on • Originally published at nerdleveltech.com

A Full Guide: Understand Everything About APIs with Examples

What is API with examples?

You might have heard the term "API" before. But what exactly does it mean, and why is it important?

In simple terms, an API (which stands for "Application Programming Interface") is a way for different computer programs to talk to each other. Think of it like a secret code that one program can use to ask another program for information or ask it to do something.

For example, have you ever used a website or an app that lets you log in with your Facebook or Google account? When you do that, the website or app is using an API to talk to Facebook or Google's systems and ask if you're really you. If everything checks out, the website or app can let you in.

Another example is weather apps. You might use a weather app on your phone to check the forecast for your area. But the app itself doesn't actually create the forecast - it uses an API from a weather service to get the information. The app asks the weather service for the forecast for your area, and the weather service sends back the information in a way the app can understand.

There are all kinds of APIs for all kinds of things - social media platforms, online stores, maps and navigation, and many others. APIs make it possible for different programs and services to work together, which is why they're so important in the world of technology.

man, adult, businessman

Mindset When Building an API?

APIs are incredibly useful because they allow them to focus on building the specific features they need for their projects, without having to worry about creating everything from scratch. By using APIs, developers can save time and resources, and build more robust and innovative software.

APIs can also make it easier for developers to work together. If one developer has built an API that performs a certain function, other developers can use that API in their own projects. This can lead to faster development, greater collaboration, and more successful software overall.

For example, a developer might use an API to combine weather data with traffic data, creating a more powerful and useful app than either service could provide on its own.

What are the Different Types of APIs?

There are several types of APIs, including:

  1. SOAP (Simple Object Access Protocol) APIs: SOAP APIs are used for exchanging structured information in the implementation of web services. SOAP is a protocol that uses XML as a format to exchange messages between applications.

  2. XML-RPC APIs: XML-RPC is a remote procedure call (RPC) protocol that uses XML to encode its calls and HTTP as a transport mechanism. It is used to build web services and allows clients to communicate with a server using HTTP requests.

  3. REST (Representational State Transfer) APIs: REST is an architectural style that uses HTTP as a communication protocol. RESTful APIs allow clients to access and manipulate web resources using HTTP requests, such as GET, POST, PUT, and DELETE.

  4. JSON-RPC APIs: JSON-RPC is a lightweight remote procedure call (RPC) protocol that uses JSON as a format to encode its calls and HTTP as a transport mechanism. It is used to build web services and allows clients to communicate with a server using HTTP requests.

  5. GraphQL APIs: GraphQL is a query language for APIs that was developed by Facebook. It allows clients to request and receive only the data they need, making it more efficient than traditional REST APIs.

  6. OpenAPI (formerly Swagger) APIs: OpenAPI is a specification for building APIs that allows for machine-readable documentation of the API. It is used to describe RESTful web services and provides a way to automatically generate client libraries and server stubs.

Each type of API has its own advantages and disadvantages, we will discuss that later in a different article, just don't forget to join our mailing list. Back to types: the choice of which type to use depends on the specific needs of the application or system being built. REST APIs are currently the most popular type of API, due to their simplicity, flexibility, and ease of use.

In addition to the different protocol-based types of APIs, there are also different categories or classifications of APIs based on their use and who has access to them. Here's an overview of some of the main types of APIs based on access:

  1. Public APIs: Public APIs are accessible to anyone and can be used to build applications that are available to the public. Examples of public APIs include social media APIs, weather APIs, and mapping APIs. Public APIs usually require authentication but are generally more open and flexible than other types of APIs.

  2. Partner APIs: Partner APIs are accessible to specific business partners or customers, and are typically used to integrate two separate systems or applications. Examples of partner APIs include payment gateway APIs and shipping APIs. Partner APIs are generally more secure and controlled than public APIs, but still require authentication and a certain level of trust between the partners.

  3. Internal APIs: Internal APIs are used within an organization to enable communication between different departments or applications. Examples of internal APIs include HR APIs and inventory management APIs. Internal APIs are usually more secure and controlled than partner and public APIs, and may require specialized knowledge to use.

  4. Composite APIs: Composite APIs are created by combining multiple APIs together to create a new, more complex API. This is typically done to provide a more customized or specific service than what is available through a single API. Composite APIs require more advanced technical skills to create and use than other types of APIs.

  5. B2B APIs: B2B (Business-to-Business) APIs are used for business-to-business communication and integration. They are designed to facilitate communication between two separate businesses and are usually more secure and controlled than other types of APIs. B2B APIs require a certain level of trust between the two businesses, and may require specialized knowledge to use.

Understanding these Two Important Data Formats (XML and JSON)

If you've ever used a website or app, you've probably encountered XML or JSON - two popular data formats used by developers to share information between different programs. In this section, we'll explain what XML and JSON are, and why they're important.

XML

XML (which stands for "Extensible Markup Language") is a way to store and share data in a structured format. It's often used for things like website content, online forms, and other types of data that need to be organized and easy to read.

In an XML document, data is organized into "tags" and "elements" that describe the data's structure. For example, if you were storing information about books, you might use tags like "title," "author," and "publisher" to organize the data.

Here's an example of what an XML document might look like:

<book>
    <title>The Hitchhiker's Guide to the Galaxy</title>
    <author>Douglas Adams</author>
    <publisher>Pan Books</publisher>
</book>

JSON

JSON (which stands for "JavaScript Object Notation") is another way to store and share data, often used in web development. Like XML, JSON is structured, but it uses a different syntax.

In a JSON document, data is organized into "key-value pairs" that describe the data's structure. For example, the same book data we used in the XML example might look like this in JSON:

{
    "title": "The Hitchhiker's Guide to the Galaxy",
    "author": "Douglas Adams",
    "publisher": "Pan Books"
}

One advantage of JSON over XML is that it's often faster and easier to parse (or read) in web applications, because it's a more lightweight format.

spiritual, meditate, geometry, decoding

Decoding the REST APIs

Explanation of How REST APIs Work

So, how do REST APIs work? At its simplest, a REST API is a collection of URLs (or "endpoints") that a developer can use to send requests and receive data. For example, if you were building an app that displayed weather data, you might use a REST API to get that data from a weather service.

To use a REST API, a developer sends an HTTP request to the API's endpoint with certain parameters. The API then sends back a response in a specified format (like JSON or XML) that the developer's program can understand.

Overview of the Characteristics of REST APIs

One of the key features of REST APIs is that they're "stateless." That means that each request is independent of any other request, and the API doesn't keep track of the state between requests. This makes REST APIs very flexible and scalable, and easy to use in web applications.

More to understand about the statelessness principle:

  • Each Request is Self-Contained

In a stateless architecture, each request sent to the server contains all the information required to complete the request. This means that the server doesn't store any client context between requests. For example, let's say a client makes a request to a REST API to retrieve some data. The request would include all the necessary parameters, such as the type of data to retrieve, any filters to apply, and the format of the response. The server processes the request and returns the requested data in the specified format. The server doesn't store any information about the client, such as their session state or authentication information.

  • No Client Session is Maintained

In a stateless architecture, the server doesn't maintain any client sessions between requests. This means that each request is treated independently, and the server doesn't rely on any previous requests to process the current one. For example, let's say a client sends a request to update some data in a database. The request would include all the necessary parameters, such as the data to update and any constraints to apply. The server would process the request and update the data in the database. The server wouldn't keep any state about the client, such as which data the client had previously updated.

  • Scalability and Reliability

The statelessness principle makes REST APIs highly scalable and reliable. Because each request is self-contained, the server doesn't need to maintain any client state or context between requests. This means that the server can process each request independently and in parallel, which improves performance and scalability. Additionally, because each request is independent, if one request fails, it doesn't affect the processing of other requests. This makes REST APIs more reliable and fault-tolerant.

  • More characteristics of REST APIs

is that they use a standard set of HTTP methods to describe the actions that can be performed on the API's resources. These methods include "GET" (which retrieves data), "POST" (which creates new data), "PUT" (which updates existing data), and "DELETE" (which deletes data).

Here's an example of what a simple REST API request might look like, using the example of a weather app:

GET https://api.weather.com/forecast?zip=90210&appid=YOUR_API_KEY

In this example, the developer is sending a "GET" request to the API's endpoint to retrieve the weather forecast for a specific zip code. The API will send back a response in the format specified by the developer.

apis, use of api,

Some more examples...

  • Retrieving data using the GET method:

JavaScript example:

fetch('https://api.example.com/data')
  .then(response => response.json())
  .then(data => console.log(data));

Python example:

import requests

response = requests.get('https://api.example.com/data')
data = response.json()
print(data)

In these examples, we're using the GET method to retrieve data from a REST API endpoint. In JavaScript, we're using the fetch function to make the request and then parsing the response as JSON. In Python, we're using the requests library to make the request and then parsing the response as JSON.

  • Creating new data using the POST method:

JavaScript example:

fetch('https://api.example.com/data', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ name: 'John', age: 25 })
})
  .then(response => response.json())
  .then(data => console.log(data));

Python example:

import requests

response = requests.post('https://api.example.com/data', json={'name': 'John', 'age': 25})
data = response.json()
print(data)

In these examples, we're using the POST method to create new data in a REST API. In JavaScript, we're using the fetch function again, but this time we're specifying that we want to use the POST method and sending JSON data in the request body. In Python, we're using the requests library to make the POST request and sending JSON data in the request body.

  • Updating existing data using the PUT method:

JavaScript example:

fetch('https://api.example.com/data/123', {
  method: 'PUT',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ name: 'John', age: 26 })
})
  .then(response => response.json())
  .then(data => console.log(data));

Python example:

import requests

response = requests.put('https://api.example.com/data/123', json={'name': 'John', 'age': 26})
data = response.json()
print(data)

In these examples, we're using the PUT method to update existing data in a REST API. In JavaScript, we're using the fetch function once again, but this time we're specifying that we want to use the PUT method and sending JSON data in the request body. In Python, we're using the requests library to make the PUT request and sending JSON data in the request body.

  • Deleting data using the DELETE method:

JavaScript example:

fetch('https://api.example.com/data/123', {
  method: 'DELETE'
})
  .then(response => console.log('Data deleted'));

Python example:

import requests

response = requests.delete('https://api.example.com/data/123')
print('Data deleted')

In these examples, we're using the DELETE method to delete data from a REST API. In JavaScript, we're using the fetch function again, but this time we're specifying that we want to use the DELETE method. In Python, we're using the requests library to make the DELETE request. Note that in both cases, we're not expecting a response with data, so we're just logging a message to the console instead.

security, protection, antivirus, securing

How to secure a REST API?

If you're building a REST API, it's important to make sure it's secure from potential attacks. In this section, we'll explain some of the best practices for securing a REST API.

1- Use HTTPS

One of the most important things you can do to secure a REST API is to use HTTPS. HTTPS is a way of encrypting data sent over the internet, making it harder for attackers to intercept and read the data. To use HTTPS, you'll need to obtain an SSL/TLS certificate from a trusted certificate authority.

Here's an example of how to enable HTTPS in a Node.js application using the Express framework:

const https = require('https');
const fs = require('fs');
const express = require('express');
const app = express();

const options = {
  key: fs.readFileSync('/path/to/private.key'),
  cert: fs.readFileSync('/path/to/certificate.crt')
};

app.get('/', (req, res) => {
  res.send('Hello, world!');
});

https.createServer(options, app).listen(443);

2- Implement Authentication and Authorization

Another important aspect of securing a REST API is implementing authentication and authorization. Authentication is the process of verifying a user's identity, while authorization is the process of determining what actions a user is allowed to take.

One way to implement authentication and authorization is to use tokens. When a user logs in to your application, you can generate a token that represents that user's session. The token can then be sent with each request to the API, and the API can use the token to verify the user's identity and permissions.

Here's an example of how to implement token-based authentication in a Node.js application using the JSON Web Token (JWT) library:

const jwt = require('jsonwebtoken');
const express = require('express');
const app = express();

app.post('/login', (req, res) => {
  // verify user credentials
  const user = { id: 1, name: 'John Doe' };
  const token = jwt.sign(user, 'secret');
  res.json({ token });
});

app.get('/protected', (req, res) => {
  // verify token
  const authHeader = req.headers.authorization;
  if (!authHeader) return res.sendStatus(401);
  const token = authHeader.split(' ')[1];
  jwt.verify(token, 'secret', (err, user) => {
    if (err) return res.sendStatus(403);
    res.send(`Welcome, ${user.name}!`);
  });
});

app.listen(3000);

In this example, the /login endpoint is used to generate a JWT token when a user logs in. The token is then sent with requests to the /protected endpoint, which verifies the token and sends a response if the user is authorized.

3- Limit Access and Use Rate-Limiting

To further secure your REST API, you can limit access and use rate-limiting. Access limits can be implemented by restricting which IP addresses or domains are allowed to access the API. Rate-limiting can be used to prevent users from making too many requests in a short amount of time, which can help prevent DDoS attacks.

Here's an example of how to implement rate-limiting in a Node.js application using the express-rate-limit library:

const rateLimit = require('express-rate-limit');
const express = require('express');
const app = express();

const limiter = rateLimit({
  windowMs: 60 * 1000, // 1 minute
  max: 100, // limit each
});

app.use(limiter);

app.get('/', (req, res) => {
  res.send('Hello, world!');
});

app.listen(3000);

In this example, the express-rate-limit middleware is used to limit the number of requests to 100 per minute. If a user exceeds this limit, they'll receive a 429 Too Many Requests response.

4- Validate User Input

Finally, it's important to validate user input to prevent attacks such as SQL injection and cross-site scripting (XSS). Always make sure to sanitize and validate user input before using it in database queries or rendering it in HTML.

Here's an example of how to validate user input in a Node.js application using the validator.js library:

const validator = require('validator');
const express = require('express');
const app = express();

app.post('/user', (req, res) => {
  const { name, email, password } = req.body;
  if (!validator.isEmail(email)) {
    return res.status(400).json({ message: 'Invalid email address' });
  }
  // create new user in database
  res.json({ message: 'User created' });
});

app.listen(3000);

In this example, the validator.js library is used to validate the email address before creating a new user in the database. If the email address is invalid, the API returns a 400 Bad Request response.

plans, design, web design

How to write API documentation?

When building an API, it's important to provide clear and comprehensive documentation that makes it easy for developers to understand and use your API. In this section, we'll explain some of the best practices for API documentation.

  • Keep it Simple

The first rule of API documentation is to keep it simple. Developers want to be able to quickly understand how your API works and how to use it. Use clear and concise language, and avoid using technical jargon or overly complicated concepts.

Here's an example of simple and clear API documentation for a weather API:

/**
 * @api {get} /weather Request weather information
 * @apiName GetWeather
 * @apiGroup Weather
 *
 * @apiParam {String} location The name of the location you want the weather for (required).
 * @apiParam {String="metric","imperial"} [units="metric"] The units to display the weather in (optional).
 *
 * @apiSuccess {String} location The name of the location.
 * @apiSuccess {Number} temperature The temperature in the specified units.
 * @apiSuccess {String} conditions The current weather conditions.
 *
 * @apiSuccessExample Success-Response:
 *     HTTP/1.1 200 OK
 *     {
 *       "location": "London",
 *       "temperature": 10,
 *       "conditions": "Cloudy"
 *     }
 */

Here's an example of API documentation that includes examples for a calendar API:

/**
 * @api {get} /events Request events for a specified period
 * @apiName GetEvents
 * @apiGroup Calendar
 *
 * @apiParam {String} start The start date of the events to retrieve, in ISO format (YYYY-MM-DD) (required).
 * @apiParam {String} end The end date of the events to retrieve, in ISO format (YYYY-MM-DD) (required).
 * @apiParam {String="public","private"} [type] The type of events to retrieve (optional).
 *
 * @apiSuccess {Object[]} events An array of events.
 * @apiSuccess {Number} events.id The ID of the event.
 * @apiSuccess {String} events.title The title of the event.
 * @apiSuccess {String} events.start The start time of the event, in ISO format.
 * @apiSuccess {String} events.end The end time of the event, in ISO format.
 * @apiSuccess {String} events.location The location of the event.
 *
 * @apiSuccessExample Success-Response:
 *     HTTP/1.1 200 OK
 *     [
 *       {
 *         "id": 123,
 *         "title": "Company Meeting",
 *         "start": "2022-03-15T10:00:00",
 *         "end": "2022-03-15T11:00:00",
 *         "location": "Office"
 *       },
 *       {
 *         "id": 456,
 *         "title": "Project Deadline",
 *         "start": "2022-03-25T12:00:00",
 *         "end": "2022-03-25T18:00:00",
 *         "location": "Remote"
 *       }
 *     ]
 */

Full Example of web API

Example of building an API using Flask, which is a popular web framework for building APIs.

Assuming that we are building an API for a simple e-commerce application, the first step would be to define the API requirements. For our e-commerce application, we may need to support the following functionality:

  • Retrieve a list of all products

  • Retrieve the details of a specific product

  • Create a new product

  • Update an existing product

  • Delete a product

Once the API requirements are defined, the next step would be to choose a programming language and framework. For this example, we will be using Python and Flask.

To begin building the API, we will need to install Flask using pip:

pip install flask

Next, we will create a new Flask application and define the endpoints for the API. Here is an example of how the code for this might look:

from flask import Flask, jsonify, request

app = Flask(__name__)

# Define the product data
products = [
    {'id': 1, 'name': 'Product 1', 'price': 10.00},
    {'id': 2, 'name': 'Product 2', 'price': 20.00},
    {'id': 3, 'name': 'Product 3', 'price': 30.00}
]

# Define the endpoints
@app.route('/products', methods=['GET'])
def get_all_products():
    return jsonify({'products': products})

@app.route('/products/<int:id>', methods=['GET'])
def get_product(id):
    for product in products:
        if product['id'] == id:
            return jsonify({'product': product})
    return jsonify({'message': 'Product not found'})

@app.route('/products', methods=['POST'])
def create_product():
    product = request.get_json()
    products.append(product)
    return jsonify({'message': 'Product created successfully'})

@app.route('/products/<int:id>', methods=['PUT'])
def update_product(id):
    for product in products:
        if product['id'] == id:
            product['name'] = request.json['name']
            product['price'] = request.json['price']
            return jsonify({'message': 'Product updated successfully'})
    return jsonify({'message': 'Product not found'})

@app.route('/products/<int:id>', methods=['DELETE'])
def delete_product(id):
    for product in products:
        if product['id'] == id:
            products.remove(product)
            return jsonify({'message': 'Product deleted successfully'})
    return jsonify({'message': 'Product not found'})

In this example, we have defined five endpoints for the API: /products, /products/<int:id>, /products, /products/<int:id>, and /products/<int:id>. These endpoints correspond to the functionality we defined earlier.

To test the API, we can use a tool like Postman to send requests to the API and verify the responses. For example, to retrieve a list of all products, we can send a GET request to the /products endpoint. Here is an example of how this might look in Postman:

"GET http://localhost:5000/products"

The response from the API would be:

{
    "products": [
        {
            "id": 1,
            "name": "Product 1",
            "price": 10.0
        },
        {
            "id": 2,
            "name": "Product 2",
            "price": 20.0
        },
        {
            "id": 3,
            "name": "Product 3",
            "price": 30.0
        }
    ]
}

Once the API is working as expected, the next step is to document the API. This can involve creating API documentation that describes the functionality of the API, as well as creating examples of how to use the API. For our e-commerce API, the documentation might look something like this:

The e-commerce API provides the following functionality:

  • GET /products: Retrieve a list of all products

  • GET /products/{id}: Retrieve the details of a specific product

  • POST /products: Create a new product

  • PUT /products/{id}: Update an existing product

  • DELETE /products/{id}: Delete a product

All requests and responses should be in JSON format.

Retrieving a List of All Products

To retrieve a list of all products, send a GET request to /products. The response will be a JSON object containing an array of products:

{
    "products": [
        {
            "id": 1,
            "name": "Product 1",
            "price": 10.0
        },
        {
            "id": 2,
            "name": "Product 2",
            "price": 20.0
        },
        {
            "id": 3,
            "name": "Product 3",
            "price": 30.0
        }
    ]
}

Retrieving the Details of a Specific Product

To retrieve the details of a specific product, send a GET request to /products/{id}, where {id} is the ID of the product. The response will be a JSON object containing the details of the product:

{
    "product": {
        "id": 1,
        "name": "Product 1",
        "price": 10.0
    }
}

Creating a New Product

To create a new product, send a POST request to /products with a JSON object containing the details of the product:

{
    "id": 4,
    "name": "Product 4",
    "price": 40.0
}

#Response:
{
    "message": "Product created successfully"
}

Updating an Existing Product

To update an existing product, send a PUT request to /products/{id}, where {id} is the ID of the product, with a JSON object containing the updated details of the product:

{
    "name": "New Product Name",
    "price": 15.0
}

#Response:
{
    "message": "Product updated successfully"
}

Deleting a Product

To delete a product, send a DELETE request to /products/{id}, where {id} is the ID of the product:

#Response:
{
    "message": "Product deleted successfully"
}

API documentation can make it easier for other developers to use your API and ensure that the API is easy to understand.

graduation, matriculation exam, testing

Conclusion

PIs have become an essential component of modern software development, enabling applications to communicate and share data with each other. In this article, we explored the basics of APIs, including what they are, how they work, and why they are important for developers.

We started by defining APIs and examining their core principles, including statelessness and uniform interface.

Next, we explored some of the common challenges associated with building and using APIs, such as security and documentation. We discussed best practices for securing APIs, including the use of authentication, and examined the importance of good documentation in helping other developers understand and use your API.

Finally, we put our knowledge into practice by building a simple e-commerce API using the Flask web framework and documenting the API using examples and sample code. By following the steps in this article, you should now have a solid understanding of APIs and be able to get started and build a simple APIs in your own projects.

Top comments (0)