Mobile App Development with WordPress Backend: A Practical Guide to REST API Integration by Sanjay - HTML preview
Download the book in PDF, ePub, Kindle for a complete version.
05 17
Consuming the REST API
in the Mobile App
Once your WordPress REST API is set up, you’ll want your mobile app to be able to
make requests to the API and retrieve data like posts, user profiles, or any other
custom content. In this section, I’ll explain how to set up your mobile app to interact
with the WordPress REST API and provide a simple example using React Native, a
popular framework for building cross-platform mobile apps.
Setting Up the Mobile App to Make Requests to the WordPress REST API
To consume the WordPress REST API from your mobile app, you need to:
1. Make an HTTP request from the mobile app to the WordPress endpoint.
2. Handle the response that WordPress sends back, which will usually be
in JSON format.
3. Display the data in your app's user interface (UI).
React Native provides built-in tools like fetch() to make HTTP requests and
handle responses.
Example for React Native App to Fetch Posts from WordPress
18
Here’s a basic example of a React Native app that fetches posts from a WordPress
site using the custom API endpoint we created earlier.

import React, { useEffect, useState } from 'react';

import { View, Text, FlatList } from 'react-native';
const App = () => {
// State to store the posts data
const [posts, setPosts] = useState([]);
// Fetch the posts when the component mounts
useEffect(() => {
// Making a GET request to the WordPress REST API endpoint fetch
.then(response => response.json()) // Convert the response to JSON .then(data => setPosts(data)) // Set the posts in the state .catch(error => console.error(error)); // Log any errors
}, []); // Empty dependency array means this effect runs once when the component mounts
return (
{/* Display the posts in a list */}
data={posts} // Pass the posts data to FlatList
keyExtractor={(item) => item.id.toString()} // Extract a unique key for each post renderItem={({ item }) => (
/>
);
}
export default App;
Explanation of the Code
useState: This hook creates a state variable called posts to store the
posts data fetched from the WordPress REST API.
19
useEffect: This hook is used to perform side effects in functional
components. In this case, it runs once when the component first mounts
(like componentDidMount in class components). It fetches the posts
data from the WordPress API.
fetch(): This is a built-in JavaScript function that allows you to make HTTP
requests. We use it to make a GET request to the custom
endpoint /wp-json/custom/v1/posts that we set up in WordPress.
response.json(): After receiving the response from WordPress, we convert
it into a JSON format using .json(). This is because the API will return
the data in JSON format, and we need to convert it into something
we can work with in JavaScript.
setPosts(data): This updates the posts state with the data received from the API. This triggers a re-render of the component with the new data.
FlatList: This is a React Native component used to efficiently render large
lists of data. It takes the posts array and displays each post’s title.
keyExtractor: React Native requires a unique key for each item in
a list, so we use the post’s ID to extract a key for each post.
renderItem: This function defines how each item in the list should
be rendered. In this case, it simply displays the title of each post.
How It Works
1. When the app loads, the useEffect hook triggers and makes a request
to the WordPress REST API.
2. The fetch() function sends a GET request to the endpoint
3. The data is then stored in the posts state.
4. The FlatList component renders the posts in a scrollable list, displaying
the title of each post.
06 20
Handling
CRUD Operations
In web development, CRUD stands for Create, Read, Update, and Delete. These
are the basic operations you perform on data in a database, and the WordPress
REST API allows you to perform all of these actions programmatically. Here, we'll
cover how to handle each of these operations in your mobile app using the
WordPress REST API.
1. Creating: POST Request to Create New Data
A POST request is used when you want to send new data to the server (e.g.,
creating a new post, user, or comment). This is the "Create" operation in CRUD.
To create new data in WordPress using the REST API, you typically send a
POST request to the appropriate endpoint.
Example: Creating a new post
Here’s how to send a POST request to create a new post:
21

fetch

method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`, // Include JWT token for authentication },
body: JSON.stringify({
title: 'New Post Title',
content: 'This is the content of the new post.',
status: 'publish', // Set the post status (publish, draft, etc.) })
})
.then(response => response.json())
.then(data => console.log('Post created:', data))
.catch(error => console.error('Error:', error));
In this example:
We send a POST request to the /wp-json/wp/v2/posts endpoint, which
is where posts are created.
The Authorization header includes the JWT token to authenticate the request.
The request body contains the post data, including the title,
content, and status.
2. Reading: GET Request to Fetch Data
A GET request is used to read or fetch data from the server. We’ve already
demonstrated how to use the GET request in a previous section to fetch
posts from WordPress.
Here’s a quick refresher on how you can use a GET request to retrieve data:
22

fetch

.then(response => response.json())
.then(data => console.log('Posts:', data))
.catch(error => console.error('Error:', error));
This example fetches the posts data from the custom /posts/ endpoint.
3. Updating: PUT or PATCH Request to Modify Existing Data
A PUT or PATCH request is used to update existing data. The difference
between the two is:
PUT replaces the entire resource (e.g., updating all fields of a post).
PATCH only updates the specified fields (e.g., updating just the
post title or content).
PUT requests are more common for fully replacing data, while PATCH is
used for partial updates.
Example: Updating a Post
Here’s how you can send a PUT request to update a post:

fetch

method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`, // Include JWT token for authentication },
body: JSON.stringify({
title: 'Updated Post Title', // New title for the post
content: 'Updated content of the post.', // New content for the post })
})
.then(response => response.json())
.then(data => console.log('Post updated:', data))
.catch(error => console.error('Error:', error));
23
In this example:
The PUT request is sent to the /wp-json/wp/v2/posts/1 endpoint,
where 1 is the ID of the post you want to update.
The body contains the updated data (the new title and content).
The post with ID 1 will be completely updated with the new data.
You can also use a PATCH request if you only want to update specific fields of the
post (e.g., just the title or content).
4. Deleting: DELETE Request to Remove Data
A DELETE request is used to remove data from the server
(e.g., deleting a post or a user). In WordPress, you can send a DELETE request
to the appropriate endpoint to remove data.
Example: Deleting a Post
Here’s how you can send a DELETE request to delete a post:

fetch

method: 'DELETE',
headers: {
'Authorization': `Bearer ${token}`, // Include JWT token for authentication },
})
.then(response => response.json())
.then(data => console.log('Post deleted:', data))
.catch(error => console.error('Error:', error));
24
In this example:
The DELETE request is sent to the /wp-json/wp/v2/posts/1 endpoint
to delete the post with ID 1.
The Authorization header includes the JWT token to authenticate the request.
Summary of CRUD Operations
Create: Use the POST request to send new data (e.g., creating a new post).
Read: Use the GET request to retrieve data (e.g., fetching posts).
Update: Use the PUT or PATCH request to modify existing data
(e.g., updating a post's title or content).
Delete: Use the DELETE request to remove data (e.g., deleting a post).
By using these HTTP methods, you can easily manage data in your WordPress
site through the REST API, allowing your mobile app to create, read, update,
and delete content as needed.
06 25
Handling API Responses
and Error Handling
When your mobile app makes requests to the WordPress REST API, it receives
responses from the server. These responses come with important information
about the status of the request, the data returned, or any errors that occurred. In
this section, we’ll discuss how to handle these responses properly, including
successful responses and errors.
Structure of a Typical API Response
An API response typically consists of:
Status Code: A number that indicates whether the request was successful
or if there was an error. This is the most important part of the response.
Response Body: The actual data sent back by the API, usually in JSON
format. This could be the requested data (like posts) or an error message.
For example, a successful request to fetch posts might return:

{

"id": 1,
"title": "Post Title",
"content": "Post content here",
"status": "publish"
}
26
This is the response body, containing the data that your mobile app
can display to the user.
Handling Successful Responses with Proper Status Codes
When an API request is successful, the server will return a status code to let
your app know everything went as expected. Some common success codes include:
200 OK: The request was successful, and the server is returning
the requested data.
201 Created: The request was successful, and new data was created
(e.g., a new post or user).
When handling these responses, your mobile app should check the status
code and handle the data appropriately.
For example, here’s how you might handle a successful GET request
(fetching posts) in a React Native app:

fetch

.then(response => {
if (response.status === 200) {
return response.json(); // Parse the JSON data
} else {
throw new Error('Failed to load data');
}
})
.then(data => {
console.log('Posts fetched successfully:', data);
})
.catch(error => {
console.error('Error:', error);
});
27
In this example:
If the status code is 200 OK, the app proceeds to parse and use
the response data.
If it’s anything else, an error is thrown, and the app can handle it accordingly.
Error Handling for Bad Requests, Unauthorized Access, and Server Errors
Not all API requests will be successful. When something goes wrong, the server
will return an error with an appropriate status code.
These are typically 4xx or 5xx status codes.
4xx Errors (Client Errors): These errors occur when something is wrong
with the request made by the client (your mobile app).
400 Bad Request: The request was malformed or missing required data.
401 Unauthorized: The request is missing valid authentication
(e.g., the user needs to log in or provide a valid token).
403 Forbidden: The request is valid, but the server is refusing to
fulfill it (e.g., the user doesn’t have permission to access the resource).
404 Not Found: The requested resource (like a post or page)
could not be found on the server.
5xx Errors (Server Errors): These errors happen when the server fails to
fulfill a valid request.
500 Internal Server Error: Something went wrong on the server side,
but it’s not clear what.
502 Bad Gateway: The server is acting as a gateway or proxy and
received an invalid response from the upstream server.
503 Service Unavailable: The server is temporarily unavailable,
often due to maintenance or overload.
28
To handle these errors, you can check the status code in your response and provide
appropriate feedback to the user. Here’s an example of how to handle errors:

fetch

.then(response => {
if (response.ok) {
return response.json(); // If status code is 200-299, parse the data } else {
throw new Error(`Error: ${response.status} ${response.statusText}`);
}
})
.then(data => {
console.log('Posts fetched successfully:', data);
})
.catch(error => {
console.error('API request failed:', error.message);
// Handle different error cases here
if (error.message.includes('400')) {
alert('Bad request! Please check the request and try again.'); } else if (error.message.includes('401')) {
alert('Unauthorized! Please log in to access this data.');
} else if (error.message.includes('500')) {
alert('Server error! Please try again later.');
} else {
alert('An unknown error occurred.');
}
});
In this example:
response.ok: This checks if the status code is in the range of 200-299,
which means the request was successful.
Error Handling: If the status code is outside this range (e.g., 400, 404, 500),
an error is thrown. The catch block then handles the error, and you can
provide feedback like an alert to the user, depending on the error code. 07 29
Securing the API
When your mobile app communicates with the WordPress REST API, it's essential to
make sure the data exchange is secure. Without proper security, sensitive data can
be exposed to unauthorized access. In this section, we’ll discuss best practices for
securing the communication between your mobile app and the
WordPress backend.
Best Practices to Ensure Secure Communication Between the Mobile App
and the WordPress Backend
Securing the API ensures that only authorized users and apps can access and
manipulate data. Here are some common practices to follow:
1. Using HTTPS for Secure Data Transmission
HTTPS (Hypertext Transfer Protocol Secure) ensures that the data sent between
the mobile app and the WordPress backend is encrypted, protecting it from
being intercepted or tampered with by unauthorized parties.
Why HTTPS?
Encryption: HTTPS encrypts data, ensuring it cannot be
read by attackers (e.g., hackers).
Authentication: HTTPS verifies that the server you're communicating
with is the right one, helping to prevent "man-in-the-middle" attacks.
31
How to Implement HTTPS:
Ensure your WordPress site is served over HTTPS. You can do this
by installing an SSL certificate on your server.
The URL of your API requests should start with https:// instead of
http:// to ensure that all communications are secure.
Example:

2. Handling Permissions and Roles to Restrict Access to API Endpoints

WordPress has a built-in user role system that controls who can access certain parts
of the website. You should use this system to restrict access to your API endpoints
based on the user’s role (e.g., admin, editor, subscriber).
Why Restrict API Access?
You don’t want unauthorized users to perform sensitive actions
like creating, updating, or deleting posts.
Ensuring that only users with proper roles can access certain
endpoints helps protect your site’s data.
How to Control Access:
WordPress allows you to define permissions for each user role.
For example, only administrators should have the permission to
delete posts, while contributors should only be able to read posts.
You can enforce these permissions when creating custom REST API
endpoints. Here’s an example:
32

function custom_api_get_posts() {

register_rest_route( 'custom/v1', '/posts/', array(
'methods' => 'GET',
'callback' => 'get_posts_data',
'permission_callback' => function() {
return current_user_can( 'read' ); // Only logged-in users with the 'read' capability can access },
) );
}
In this example:
The permission_callback function checks if the user has the necessary
capability (in this case, the read capability).
You can customize the permission callback to restrict access based
on roles like administrator, editor, etc.
3. Securing API Keys and Tokens
API keys and authentication tokens (like JWT tokens) are used to verify the identity
of users and apps accessing the API. Securing these tokens is crucial because
anyone with access to the token could potentially make requests on behalf
of the user or app.
Why Secure Tokens and API Keys?
Prevent misuse: If someone else gets access to the token or key,
they could perform malicious actions.
Ensure privacy: Protect sensitive data from unauthorized access.
How to Secure Tokens and API Keys:
Never hard-code tokens: Don’t hard-code your API keys or tokens
directly in your mobile app or public repositories. Instead, store them
securely (e.g., using environment variables or secure storage in the app).
33
Use environment variables: Store sensitive information like API keys
and JWT secret keys in environment variables, and make sure they
are not exposed in your code.
Use Secure Storage in Mobile Apps: Use the platform’s secure
storage options to store tokens safely:
iOS: Keychain services.
Android: Keystore system.
Example of securely storing a token in React Native using a package like
react-native-keychain:

import * as Keychain from 'react-native-keychain';

// Storing the token securely
Keychain.setGenericPassword('username', 'your-jwt-token');
// Retrieving the token securely
Keychain.getGenericPassword()
.then(credentials => {
if (credentials) {
console.log('JWT Token:', credentials.password);
}
})
.catch(error => console.error('Keychain error:', error));
In this example:
Keychain is used to securely store and retrieve sensitive data, like
authentication tokens, on the mobile device.
Use Secure Authentication Methods:
OAuth and JWT are two commonly used methods
for securing API access.
35
Always make sure the JWT token is sent over HTTPS and has a
short expiration time to limit its exposure.
Use the Refresh Token method to issue new tokens without
requiring the user to log in every time the token expires.
