Laravel REST API请求对象为空

时间:2018-12-20 11:02:54

标签: php laravel ubuntu nginx

环境

我使用Laravel 5.7创建了一个应用程序,并实现了REST API。我在routes / api.php中有一条路由,该路由触发了一个中间件,该中间件检查传入的请求是否具有名为api_token的参数。

这是一个生产环境,具体如下:

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

.env文件中的APP_ENV设置为“生产”,APP_DEBUG设置为“假”。

问题

我的问题是,传入请求对象到达服务器时始终为空。至少那是我的Laravel应用程序所说的。

这些是我在routes / 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');
});

如您所见,路由位于称为“ rest”的中间件组中。我正在使用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);
    }
}

中间件首先检查请求对象中是否有参数,然后执行一些逻辑以检查是否发送了正确的令牌。如果请求对象为空,它将返回一些数据以帮助我了解出了什么问题。

我使用Postman(https://www.getpostman.com)测试API。这是我的邮递员设置:

邮递员设置

Screen Shot

邮递员标题

Screen Shot

这是我在邮递员中得到的答复:

邮递员回复

Screen Shot

如果在浏览器中调用该路由,则会得到相同的结果。 不管我是否输入参数,请求似乎总是空的。

以下是我尝试做的事情:

  • 不使用中间件
  • 使用$ request变量代替帮助程序request()
  • 在邮递员设置标题中的“ application / json”和“ application / x-www-form-urlencoded”之间切换
  • 在浏览器中调用该路由
  • 更新为Laravel 5.7

奇怪的是,所有这些都可以在我的本地环境以及与生产服务器具有相同规格的测试服务器上完美地运行。

更新01:

所以似乎更糟...

如果我在web.php中添加这样的路由:

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

并按照以下方式访问该路线:

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

我得到一个空数组[]。

因此,似乎参数没有到达服务器本身。

2 个答案:

答案 0 :(得分:1)

您正在通过GET请求获取设备ID,因此请使用以下行代替$request()->device_id

使用它,让我知道 $name = $request->input('device_id')

答案 1 :(得分:0)

好的,我可以解决问题。它与Laravel没有任何关系。这是一个nginx配置问题:

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