HTTP издержки в API-ориентированном PHP-приложении

Я реорганизую существующее приложение PHP, чтобы отделить доступ к данным (вызовы частного API) от самого приложения.

Цель этого состоит в том, чтобы предоставить другому приложению в интрасети доступ к тем же данным без дублирования кода для выполнения запросов и тому подобного. Я также планирую облегчить разработчикам написание кода для текущего веб-приложения, в то время как только несколько членов команды будут добавлять функции в API.

В настоящее время приложение имеет такую ​​структуру (это только одна из многих страниц):

  • ПОЛУЧИТЬ /notes.php — получает страницу для просмотра заметок (главная страница пользовательского интерфейса)
  • ПОЛУЧИТЬ /notes.php?page=view&id=6 — получить содержание примечания 6
  • СООБЩЕНИЕ /notes.php?page=create — создать заметку
  • СООБЩЕНИЕ /notes.php?page=delete — удалить заметку
  • СООБЩЕНИЕ /notes.php?page=append — добавить к заметке

Реорганизованное приложение будет иметь такую ​​структуру:

  • ПОЛУЧИТЬ /notes.php
  • Внутренний GET /api/notes/6
  • Внутренний пост /api/notes
  • Внутреннее УДАЛЕНИЕ /api/notes/6
  • Внутренний PUT /api/notes (или, возможно, PATCH, в зависимости от того, будет ли отправлено полное представление)

В веб-приложении я думал о выполнении HTTP-запросов к URL-адресам на https://localhost/api/ но это кажется действительно дорогим. Вот код для уточнения того, что я имею в виду:

// GET notes.php

switch ($_GET['page']) {
case 'view':
$data = \Requests::get(
"https://localhost/api/notes/{$_GET['id']}",
array(),
array('auth' => ... )
);
// do things with $data if necessary and send back to browser
break;
case 'create':
$response = \Requests::post( ... );
if ($response->status_code === 201) {
// things
}
break;
// etc...
}

Я читаю это обсуждение и один из участников опубликовал:

Слишком много накладных расходов, не используйте сеть для внутренних коммуникаций. Вместо этого используйте гораздо более доступные средства связи между различными процессами или тем, что у вас есть. Конечно, это зависит от системы, в которой она работает … Теперь вы можете имитировать REST, если хотите, но не используете HTTP или сеть для внутренних вещей. Это как бросать кита в мини-туалет.

Может кто-нибудь объяснить, как мне этого добиться? И веб-приложение, и API находятся на одном сервере (по крайней мере, на данный момент).

Или аспект HTTP-заголовка — это просто незначительная проблема?

Отправка HTTP-запросов непосредственно из JavaScript / браузера в API в настоящее время невозможна из-за ограничений безопасности.

Я также посмотрел на два ответа в этот вопрос но было бы неплохо, чтобы кто-то подробно остановился на этом.

0

Решение

Затраты HTTP будут значительными, так как вам придется пройти полный цикл рендеринга страницы. Это будет включать издержки HTTP-сервера, выполнение отдельного процесса PHP, сетевой уровень ОС и т. Д. То, насколько оно незначительно или нет, зависит от типа вашего приложения, трафика, инфраструктуры, требований ко времени отклика и т. Д.

Чтобы предоставить вам лучшее решение, вы должны представить свои аргументы для рассмотрения этого подхода в первую очередь. Факторы, которые следует учитывать, также включают текущую архитектуру приложения, требования, используемые платформы и т. Д.

Если безопасность является вашей главной задачей, это не обязательно является хорошим способом для начала, так как вам нужно будет теперь сохранить некоторые данные, относящиеся к сеансу, в еще одном слое.

Кроме того, несмотря на дополнительные издержки, конечное приложение может потенциально работать быстрее при наличии правильных механизмов кэширования. Это действительно зависит от вашего окончательного решения.

0

Другие решения

Я делаю ту же платформу приложений. Была такая же проблема. Поэтому я решил сделать следующий дизайн:

  1. Для процессов, которые расположены удаленно (на другом компьютере), я использую crul или другие вызовы удаленного ресурса. Если я храню пользователя на другом сервере, чтобы получить статус пользователя, я делаю это API-> Выполнить (https://remote.com/user/currentStatus/getid/6) он вернет статус.
  2. Для локальных вызовов, скажем, для событий потребуются оповещения (это 2 отдельных пакета с собственной моделью данных, но на одной машине) — я делаю локальный API-вызов, как. что-то вроде этого:
    API-> Выполнить (массив («Оповещения», Param1, Param2).

API-> Execute знает, что это локальный объект. Получит объект локальный физический путь. Инициализируйте его, передайте данные и верните результаты в контекст. Нет удаленного выполнения с использованием протоколов.

Например, если вы хотите сохранить службу шифрования с ключами, а не с остальными приложениями — вы можете безопасно отправлять данные и возвращать зашифрованное значение; тогда этот сервис всегда вызывается через удаленный API (https://encryptionservice.com/encrypt/this/value)

0

По вопросам рекламы [email protected]