Найти в Дзене
Мистер Хорошок

RESTful API: простым языком

RESTful API (Representational State Transfer) — это архитектурный стиль для создания веб-сервисов, который использует принципы REST. Эти принципы были определены Роем Филдингом в его докторской диссертации и предоставляют набор ограничений и рекомендаций для разработки масштабируемых и простых в использовании сетевых приложений. <?php // Устанавливаем заголовок для ответа, указывая, что это JSON header("Content-Type: application/json");
// Простейшая "база данных" в виде ассоциативного массива $books = [
1 => ["title" => "Первая книга", "author" => "Первый автор", "publishedDate" => "2020-01-01"],
2 => ["title" => "Вторая книга", "author" => "Второй автор", "publishedDate" => "2021-01-01"]
];
// Получаем HTTP-метод запроса (GET, POST, DELETE и т.д.) $method = $_SERVER['REQUEST_METHOD'];
// Получаем идентификатор книги из URL, если он указан $id = isset($_GET['id']) ? intval($_GET['id']) : null;
// В зависимости от метода HTTP выполняем различные действия switch ($method) {
Оглавление
RESTful API: простым языком
RESTful API: простым языком

RESTful API (Representational State Transfer) — это архитектурный стиль для создания веб-сервисов, который использует принципы REST. Эти принципы были определены Роем Филдингом в его докторской диссертации и предоставляют набор ограничений и рекомендаций для разработки масштабируемых и простых в использовании сетевых приложений.

Основные принципы REST

  1. Клиент-серверная архитектура (Client-Server Architecture):Клиент и сервер взаимодействуют через стандартный интерфейс. Клиент управляет пользовательским интерфейсом и взаимодействует с пользователем, тогда как сервер отвечает за управление данными и обработку запросов.
  2. Без состояния (Stateless):Каждый запрос от клиента к серверу должен содержать всю необходимую информацию для его понимания и обработки. Сервер не должен сохранять состояние клиента между запросами. Это упрощает разработку и улучшает масштабируемость.
  3. Кэшируемость (Cacheable):Ответы от сервера должны быть помечены как кэшируемые или некэшируемые. Это позволяет клиентам кэшировать ответы и повторно использовать их, что снижает нагрузку на сервер и улучшает производительность.
  4. Единый интерфейс (Uniform Interface):
    Единый интерфейс между клиентом и сервером позволяет различным компонентам взаимодействовать друг с другом. Это включает:
  5. Идентификация ресурсов: Ресурсы идентифицируются с помощью URI (Uniform Resource Identifier).
    Манипуляция ресурсами через представления: Клиенты могут манипулировать ресурсами, отправляя их представления на сервер.
    Самоописывающие сообщения: Каждый запрос от клиента к серверу должен содержать всю необходимую информацию для его обработки.
    Гипермедиа как двигатель состояния приложения (HATEOAS): Клиенты взаимодействуют с приложением через гипермедиа (ссылки), предоставляемую сервером.
  6. Слои (Layered System):Архитектура должна быть организована в виде слоев. Каждый слой выполняет свою роль и взаимодействует с соседними слоями. Клиенты могут взаимодействовать только с ближайшим слоем, не зная о внутренних деталях других слоев.
  7. Код по требованию (Code on Demand, необязательно):Сервер может отправлять исполняемый код клиенту для выполнения (например, скрипты или апплеты). Это необязательное ограничение, которое позволяет расширять функциональность клиента.

Основные методы HTTP, используемые в RESTful API

  • GET: Получение ресурса.
    GET /books
  • POST: Создание нового ресурса.
    POST /books
    Content-Type: application/json


    {
    "title": "Новая книга",
    "author": "Автор книги",
    "publishedDate": "2023-01-01"
    }
  • PUT: Обновление существующего ресурса.
    PUT /books/{id}
    Content-Type: application/json

    {
    "title": "Обновленное название книги",
    "author": "Обновленный автор",
    "publishedDate": "2023-01-01"
    }
  • DELETE: Удаление ресурса.
    DELETE /books/{id}
  • PATCH: Частичное обновление ресурса.
    PATCH /books/{id}
    Content-Type: application/json

    {
    "title": "Обновленное название книги"
    }
  • OPTIONS: Запрос информации о возможностях ресурса.
    OPTIONS /books

Преимущества RESTful API

  • Простота и масштабируемость: RESTful API легко понять и использовать, а также они хорошо масштабируются.
  • Гибкость: RESTful API могут использоваться с различными форматами данных, такими как JSON, XML, HTML и т.д.
  • Интероперабельность: RESTful API можно использовать в различных средах и с различными клиентами, такими как веб-браузеры, мобильные приложения и другие серверы.
  • Легкость интеграции: RESTful API могут быть интегрированы с различными сервисами и приложениями.
  • Модульность: Разделение клиентской и серверной частей позволяет изменять их независимо друг от друга.

Пример RESTful API на PHP и JavaScript

RESTful API на PHP и JavaScript
RESTful API на PHP и JavaScript

Серверная часть: PHP (books.php)

<?php // Устанавливаем заголовок для ответа, указывая, что это JSON header("Content-Type: application/json");

// Простейшая "база данных" в виде ассоциативного массива $books = [
1 => ["title" => "Первая книга", "author" => "Первый автор", "publishedDate" => "2020-01-01"],
2 => ["title" => "Вторая книга", "author" => "Второй автор", "publishedDate" => "2021-01-01"]
];

// Получаем HTTP-метод запроса (GET, POST, DELETE и т.д.) $method = $_SERVER['REQUEST_METHOD'];
// Получаем идентификатор книги из URL, если он указан $id = isset($_GET['id']) ? intval($_GET['id']) : null;

// В зависимости от метода HTTP выполняем различные действия switch ($method) {
case 'GET':
if ($id) {
// Если указан идентификатор, возвращаем конкретную книгу if (isset($books[$id])) {
echo json_encode($books[$id]);
} else {
// Если книга не найдена, возвращаем ошибку 404 http_response_code(404);
echo json_encode(["message" => "Книга не найдена"]);
}
} else {
// Если идентификатор не указан, возвращаем все книги echo json_encode($books);
}
break;
case 'POST':
// Получаем данные из тела запроса в формате JSON $input = json_decode(file_get_contents('php://input'), true);
// Добавляем новую книгу в массив $books[] = [
"title" => $input['title'],
"author" => $input['author'],
"publishedDate" => $input['publishedDate']
];
// Возвращаем сообщение о том, что книга добавлена echo json_encode(["message" => "Книга добавлена"]);
break;
case 'DELETE':
if ($id && isset($books[$id])) {
// Если книга найдена, удаляем её из массива unset($books[$id]);
// Возвращаем сообщение о том, что книга удалена echo json_encode(["message" => "Книга удалена"]);
} else {
// Если книга не найдена, возвращаем ошибку 404 http_response_code(404);
echo json_encode(["message" => "Книга не найдена"]);
}
break;
default:
// Если метод не поддерживается, возвращаем ошибку 405 http_response_code(405);
echo json_encode(["message" => "Метод не поддерживается"]);
break;
}

Клиентская часть: JavaScript (index.html)

<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Book Library</title>
<script>
// Дождаться полной загрузки DOM document.addEventListener('DOMContentLoaded', function () {
const apiUrl = 'api/books.php';

// Функция для получения списка книг function fetchBooks() {
fetch(apiUrl)
.then(response => response.json()) // Преобразование ответа в JSON .then(data => {
const bookList = document.getElementById('bookList');
bookList.innerHTML = ''; // Очистка текущего списка книг // Проход по всем книгам и добавление их в список for (const id in data) {
const book = data[id];
const listItem = document.createElement('li');
listItem.textContent = `${book.title} by ${book.author}`;
bookList.appendChild(listItem);
}
})
.catch(error => console.error('Error:', error)); // Обработка ошибок }

// Функция для добавления новой книги function addBook(book) {
fetch(apiUrl, {
method: 'POST', // Метод HTTP POST для добавления книги headers: {
'Content-Type': 'application/json' // Установка заголовка для JSON },
body: JSON.stringify(book) // Преобразование объекта книги в JSON })
.then(response => response.json()) // Преобразование ответа в JSON .then(data => {
console.log(data.message); // Вывод сообщения о результате добавления fetchBooks(); // Обновление списка книг })
.catch(error => console.error('Error:', error)); // Обработка ошибок }

// Обработчик формы добавления книги document.getElementById('addBookForm').addEventListener('submit', function (event) {
event.preventDefault(); // Предотвращение отправки формы const title = document.getElementById('title').value; // Получение значения поля "title" const author = document.getElementById('author').value; // Получение значения поля "author" const publishedDate = document.getElementById('publishedDate').value; // Получение значения поля "publishedDate" addBook({ title, author, publishedDate }); // Вызов функции добавления книги });

// Загрузка списка книг при загрузке страницы fetchBooks();
});
</script>
</head>

<body>
<h1>Book Library</h1>
<ul id="bookList"></ul> <!-- Список книг -->
<h2>Add a new book</h2>
<form id="addBookForm"> <label for="title">Title:</label> <input type="text" id="title" name="title" required> <!-- Поле для ввода названия книги --> <br> <label for="author">Author:</label> <input type="text" id="author" name="author" required> <!-- Поле для ввода автора книги --> <br> <label for="publishedDate">Published Date:</label> <input type="date" id="publishedDate" name="publishedDate" required> <!-- Поле для ввода даты публикации книги --> <br> <button type="submit">Add Book</button> <!-- Кнопка для добавления книги -->
</form>
</body>

</html>

Заключение

RESTful API — это мощный инструмент для создания веб-сервисов, который позволяет создавать простые, масштабируемые и легко поддерживаемые приложения. Понимание принципов REST поможет вам создавать более эффективные и гибкие API, которые будут легко интегрироваться с различными клиентами и сервисами.

___________________________________________________

#Программирование, #Разработка, #Технологии, #Кодирование, #Интернет, #ИТ, #Софт, #Хардварь, #Айти, #Вебразработка, #RESTful_API

💥Понравилось/было полезно? Подпишись и поставь лайк!💥