Среда
Я создал приложение, используя 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. Вот мои настройки Почтальона:
Настройка почтальона

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

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

Я получаю тот же результат, если я вызываю этот маршрутв браузере. Независимо от того, введу ли я параметры или нет, запрос всегда будет пустым.
Вот что я пытался сделать:
- Не используется промежуточное программное обеспечение
- Использование переменной $ 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
Я вернусьпустой массив [].
Похоже, параметры не попадают на сам сервер.