как я могу использовать guzzlehttp для создания концентратора (централизованного API)?

Я создаю API для разных сайтов. но перед прямой передачей запроса на веб-сайт он будет проходить через сервер среднего уровня, то есть центральный сервер, затем центральный сервер будет передавать запрос на соответствующий веб-сайт. означает, что все запросы будут отправляться на центральный сервер, затем центральный сервер будет связываться с соответствующими сайтами, и данные запроса будут передаваться как есть. Все сайты разрабатываются на php laravel, архитектура почти одинаковая. Я нашел Guzzlehttp для обработки запросов, если есть какой-либо другой способ выполнить требование, дайте мне знать,

также для маршрутизации laravel мне нужно вызвать одну и ту же функцию для всех маршрутов, которые в настоящее время у меня есть следующие маршруты

Route::get('users', 'QuestsController@getUsers');
Route::post('lists', 'QuestsController@postLists');
Route::post('add-user', 'QuestsController@postAddUser');
Route::post('update-status', 'QuestsController@postUpdateStatus');
Route::post('delete', 'QuestsController@postDelete');

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

Route::get('users', 'QuestsController@central');
Route::get('add-user', 'QuestsController@central');
Route::post('delete', 'QuestsController@central');

пожалуйста, помогите мне для решения.

огромное спасибо.


person Vivek Chaudhari    schedule 03.01.2017    source источник
comment
Мне не совсем понятно, какие у вас проблемы. Вы указываете, что хотите использовать одни и те же методы контроллера для разных запросов, и предоставляете код, который заставит его работать. В чем проблема?   -  person Daan Meijer    schedule 03.01.2017
comment
@DaanMeijer Я думаю, он ожидает какой-то прокси-сервер, который выполняет некоторые действия и перенаправляет на разные серверы для ответа.   -  person Cerlin    schedule 03.01.2017
comment
вы можете проверить маршрутизацию поддоменов в laravel, и для этого можно использовать middlewares, если он находится внутри одного приложения   -  person Cerlin    schedule 03.01.2017
comment
@cerlin Boss, да, вы меня поняли, я разрабатываю концентратор, который будет перенаправлять запросы на соответствующие серверы.   -  person Vivek Chaudhari    schedule 03.01.2017
comment
@VivekChaudhari Я думаю, вам нужно проверить маршрутизацию поддоменов в laravel.   -  person Cerlin    schedule 03.01.2017
comment
@DaanMeijer, в коде я показал способ, да, это последнее исправление, это выглядит нормально, если у меня мало маршрутов, но у меня есть 100+ маршрутов, которые я не могу написать 100+ строк с одним и тем же контроллером, я просто ищу альтернативу если я могу сгруппировать все маршруты и указать на один метод контроллера   -  person Vivek Chaudhari    schedule 03.01.2017
comment
@CerlinBoss, да, я тоже проверил подмаршрутизацию, но мне это бесполезно, спасибо за быстрый ответ   -  person Vivek Chaudhari    schedule 03.01.2017
comment
Могу ли я узнать о необходимости центрального сервера? (потому что это звучит как балансировщик нагрузки). И если вы этого добились, какой будет идентификатор для определения того, какой запрос отправляется на какой сервер?   -  person Cerlin    schedule 03.01.2017
comment
Итак, я думаю, вы действительно просто ищете способ использовать маршруты с подстановочными знаками? придумаю ответ :)   -  person Daan Meijer    schedule 03.01.2017
comment
@CerlinBoss на самом деле все сайты имеют один и тот же продукт, но с разными торговыми марками, типом белого списка продуктов, мы хотим регистрировать все запросы, поступающие для любой белой метки, а не регистрировать на разных серверах, также будут другие функции, в каждом заголовке запроса будет иметь параметр, который может указывать на перенаправление на соответствующий сервер   -  person Vivek Chaudhari    schedule 03.01.2017
comment
Вам может понадобиться прочитать об прокси-сервере Apache.   -  person Cerlin    schedule 03.01.2017


Ответы (2)


Предполагая, что вам нужен способ «узкого места» всех запросов в один метод контроллера, вы можете сделать что-то вроде этого:

Route::get('{url}', 'QuestsController@centralGet')->where('url', '.*');
Route::post('{url}', 'QuestsController@centralPost')->where('url', '.*');

Теперь у вас есть два метода контроллера, каждый из которых принимает 1 (дополнительный) параметр, который вы можете использовать для дальнейшего определения правильного ответа. Методы контроллера будут выглядеть примерно так:

public function centralGet($url, Request $request){
    ...
}

public function centralPost($url, Request $request){
    ...
}
person Daan Meijer    schedule 03.01.2017
comment
спасибо за ответ, я тоже пробовал, но здесь я не могу применить промежуточное ПО для проверки маршрута, оно примет любой маршрут, действительный он или нет. Я хочу отклонить маршруты, которые не существуют, другой способ сделать это, например Route::any('{url}','RequestController@redirect')-›where('url', '([A-z\d-\/ _.]+)?'); - person Vivek Chaudhari; 03.01.2017
comment
Ну, вы можете выбросить Symfony\Component\HttpKernel\Exception\NotFoundHttpException, когда доступ к маршруту не дает результатов. - person Daan Meijer; 03.01.2017
comment
Кажется, я не совсем понимаю, в чем проблема. Вы хотите применить фильтрацию маршрута или нет? Вы хотите, чтобы каждый URL-адрес оказывался в вашей функции узкого места, или вы хотите указать, какой URL-адрес должен там оказаться? - person Daan Meijer; 03.01.2017
comment
да, таким образом, я могу показать исключение, но ваш ответ примет все URL-адреса, будь то /user, /user-hold или /blabla ...., он разрешит любые URL-адреса, я хочу перенаправить для определенных URL-адресов, как я имея массив действительных URL-адресов, и если запрос не принадлежит URL-адресу из массива, его следует отклонить, наконец, мне нужно написать более 100 строк в маршрутах, но я просто ищу альтернативу - person Vivek Chaudhari; 03.01.2017
comment
Итак, проверьте правильность вызываемого URL-адреса в методе контроллера. Если это так, сделайте свое волшебство. Если это не так, создайте исключение NotFoundHttpException. Как это работает не так, как вы хотите? - person Daan Meijer; 03.01.2017
comment
я пытаюсь использовать какой-то другой способ, например, я буду использовать промежуточное программное обеспечение, которое будет иметь список действительных URL-адресов, а затем я просто проверю в промежуточном программном обеспечении, дайте мне знать, если у вас есть какие-либо предложения. Большое спасибо за ответ - person Vivek Chaudhari; 03.01.2017
comment
Давайте продолжим обсуждение в чате. - person Daan Meijer; 03.01.2017

Я думаю, что, кроме того, вы могли бы использовать API-шлюз https://www.nginx.com/blog/building-microservices-using-an-api-gateway/. Как писал Даан, вам нужен один маршрут, который будет разрешать все службы через единую точку входа.

Затем вы можете создать преобразователь службы и получить данные из интересующей службы. Вы также можете кэшировать ответ здесь

person Rafał Łyczkowski    schedule 03.01.2017
comment
Нет. Речь не идет об использовании стороннего API. Речь идет о концепции шлюза. Насколько я вижу, вы строите шлюз API. Это уровень, который извлекает все запросы и собирает информацию из разных сервисов. Вы можете использовать его как дорожную карту для сервисов и как слой кэширования для всех ответов на запросы. - person Rafał Łyczkowski; 03.01.2017