Я реорганизую существующее приложение 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
/api/notes/6
/api/notes
/api/notes/6
/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 в настоящее время невозможна из-за ограничений безопасности.
Я также посмотрел на два ответа в этот вопрос но было бы неплохо, чтобы кто-то подробно остановился на этом.
Затраты HTTP будут значительными, так как вам придется пройти полный цикл рендеринга страницы. Это будет включать издержки HTTP-сервера, выполнение отдельного процесса PHP, сетевой уровень ОС и т. Д. То, насколько оно незначительно или нет, зависит от типа вашего приложения, трафика, инфраструктуры, требований ко времени отклика и т. Д.
Чтобы предоставить вам лучшее решение, вы должны представить свои аргументы для рассмотрения этого подхода в первую очередь. Факторы, которые следует учитывать, также включают текущую архитектуру приложения, требования, используемые платформы и т. Д.
Если безопасность является вашей главной задачей, это не обязательно является хорошим способом для начала, так как вам нужно будет теперь сохранить некоторые данные, относящиеся к сеансу, в еще одном слое.
Кроме того, несмотря на дополнительные издержки, конечное приложение может потенциально работать быстрее при наличии правильных механизмов кэширования. Это действительно зависит от вашего окончательного решения.
Я делаю ту же платформу приложений. Была такая же проблема. Поэтому я решил сделать следующий дизайн:
API-> Execute знает, что это локальный объект. Получит объект локальный физический путь. Инициализируйте его, передайте данные и верните результаты в контекст. Нет удаленного выполнения с использованием протоколов.
Например, если вы хотите сохранить службу шифрования с ключами, а не с остальными приложениями — вы можете безопасно отправлять данные и возвращать зашифрованное значение; тогда этот сервис всегда вызывается через удаленный API (https://encryptionservice.com/encrypt/this/value)