Различайте вызов API и GUI в Laravel

#laravel #api

Вопрос:

Я новичок в Ларавеле и все еще изучаю его.

Есть ли способ отличить, поступают ли вызовы в API от клиента REST, такого как Postman, или от графического интерфейса?

Я раньше делал что-то подобное, и это сработало —

 if ($request->is('api/*'))
 

но позже мне пришлось удалить префикс «api» из URL-адреса, и теперь у меня нет возможности различать вызовы.

URL — адрес для вызова моего api- http://localhost/myprojectname/someAPI

Чего я пытаюсь добиться, так это вернуть пользовательскую ошибку в Authenticate.php промежуточное программное обеспечение, если вызов выполняется из API.

Мой более ранний код

 protected function redirectTo($request)
{
    if ($request->is('api/*')) {
       //return custom message
    }
    
    if (! $request->expectsJson()) {
        return route('login');
    }
}
 

но теперь, когда префикс «api» удален из URL-адреса, я не уверен, как его отличить.

Комментарии:

1. Вы можете рассмотреть возможность использования $request->expectsJson() , в зависимости от того, что влечет за собой «из графического интерфейса».

2. Непонятно, чего вы здесь пытаетесь достичь

3. @ceejayoz, дело в том, что API может возвращать любой тип приема, такой как xml, csv, json и т. Д., И поэтому я не смогу полагаться на expectsJson (). Из графического интерфейса означает, если запрос сделан из приложения пользовательского интерфейса или API. Например, в Authenticate.php промежуточное программное обеспечение, есть код по умолчанию, если (! $request->expectsJson()) { обратный маршрут(‘вход’); } Я хочу вернуть пользовательское сообщение, если вызов сделан из API, поэтому я сделал это, если ($request->>is(‘api/*’)) { //сделайте что-нибудь}, но теперь префикс «api» удален из URL, и поэтому я не могу использовать свой старый код

4. @apokryfos, я пытаюсь понять, есть ли способ отличить, выполняется ли вызов API из клиента API RESTful, такого как запрос Postman/cmd, С помощью curl и т. Д. Или Из приложения с графическим интерфейсом. Я отредактировал вопрос, чтобы лучше его объяснить.

5. Обычно агент пользователя сообщает вам, кто его запросил. Конечно, это может быть подделано, но если вам нужна эта информация для улучшения пользовательского интерфейса, то кто-то, кто ее подделывает, на самом деле не проблема. Вероятно, вы можете использовать github.com/jenssegers/agent или что-то подобное, чтобы определить, исходит ли запрос от графического интерфейса или нет

Ответ №1:

Вы можете различать их, вызывая request()->header() метод. Он определяет user-agent , что отправил запрос именно почтальон или любой другой браузер. Еще одна полезная вещь, что он возвращает accept параметр, определяющий способ, которым отправитель хочет получить результат, например, когда вы отправляете этот запрос от HTTP-клиента, как axios он возвращает application/json , что означает, что это клиент REST, который ожидает получить результат в виде ответа json. В то время как браузер с графическим интерфейсом возвращается */* , что означает, что он готов получить любой ответ.

Примечание: по умолчанию клиент почтальона возвращает */*

Комментарии:

1. Спасибо тебе, Ратеб. Заголовок $ request->() — хорошее предложение. Я попробую это сделать. Однако я не смогу полагаться на параметр accept, потому что мой API принимает любой формат возврата, такой как xml, csv, json и т. Д.