Laravel REST API объект запроса пуст - PullRequest
0 голосов
/ 20 декабря 2018

Среда

Я создал приложение, используя Laravel 5.7, и реализовал REST API.У меня есть маршрут в Routes / api.php, который запускает промежуточное программное обеспечение, которое проверяет, есть ли у входящего запроса параметр с именем api_token.

Это производственная среда, и вот особенности:

  • Linux Ubuntu 18.04 LTS 64-bit
  • nginx / 1.14.0
  • Laravel 5.7
  • PHP 7.2

APP_ENV в файле .env установлен на «production», а APP_DEBUG установлен на «false».

Проблема

Моя проблема заключается в том, что объект входящего запроса всегда пуст при поступлении всервер.По крайней мере, так говорит мое приложение Laravel.

Это мои маршруты в маршрутах / api.php:

Route::middleware('rest')->group(function() {
    Route::get('device-location/{deviceID}', 'PositionDataController@getDeviceLocation');
    Route::get('device-location/all', 'PositionDataController@getAllLocations');
    Route::post('device-location', 'PositionDataController@storeDeviceLocation');
    Route::put('device-location/{deviceID}', 'PositionDataController@updateDeviceLocation');
    Route::delete('device-location/{deviceID}', 'PositionDataController@deleteDeviceLocation');
});

Маршруты находятся в промежуточной группе, называемой 'Отдыхайте, как видите.Я использую Route :: get ('device-location / {deviceID}', 'PositionDataController @ getDeviceLocation');маршрут для проверки работоспособности.

Вот код из промежуточного программного обеспечения:

public function handle($request, Closure $next)
{
    if(request()->all()) {
        $deviceID = request()->device_id;
    }
    else {
        return response()->json([
            'error' => 'The request object is empty.',
            'request' => request(),
            'parameters' => request()->all(),
            'content' => request()->getContent(),
            'input' => request()->input()
        ], 500);
    }

    $device = MobileDevice::where('device_id', $deviceID)->first();

    if($device) {
        $deviceToken = $device->api_token;
        if($deviceToken == request()->api_token) {
            return $next($request);
        }
        else {
            return response()->json(['error' => 'Token does not match.'], 500);
        }
    }
    else {
        return response()->json(['error' => 'The device with the id [' . $deviceID . '] could not be found.'], 500);
    }
}

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

Я использую Почтальон (https://www.getpostman.com) для тестирования API. Вот мои настройки Почтальона:

Настройка почтальона

Screen Shot

Заголовки почтальона

Screen Shot

Этоэто ответ, который я получаю в Почтальоне:

Ответ почтальона

Screen Shot

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

Вот что я пытался сделать:

  • Не используется промежуточное программное обеспечение
  • Использование переменной $ request вместо вспомогательного запроса ()
  • Переключение между «application / json» и «application / x-www-form-urlencoded»'в заголовках моей установки Почтальон
  • Вызов этого маршрута в браузере
  • Обновление до Laravel 5.7

Странно то, что всеf это прекрасно работает в моей локальной среде и на тестовом сервере, который имеет те же характеристики, что и рабочий сервер.

UPDATE 01:

Так что, похоже, дажехуже ...

Если я добавлю такой маршрут в web.php:

Route::get('/request-return', function() {
    return request()->all();
});

и увижу этот маршрут следующим образом:

laravel.application/request-return?device_id=1&api_token=XgkQLs8G7OYTqdwsXmjJT5G9bxv20DRi

Я вернусьпустой массив [].

Похоже, параметры не попадают на сам сервер.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Хорошо, я могу решить проблему.Это не имело никакого отношения к Ларавеллу.Это была проблема конфигурации nginx:

https://serverfault.com/questions/231578/nginx-php-fpm-where-are-my-get-params

0 голосов
/ 20 декабря 2018

Вы получаете идентификатор устройства через запрос GET, поэтому используйте строку ниже вместо $request()->device_id.

Используйте это и дайте мне знать $name = $request->input('device_id')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...