Laravel 5.8用数组访问$request->all()参数时Axios请求报错问题
Laravel 5.8 中Axios调用接口$request->all()无法获取参数问题
我在Laravel 5.8中开发了API,需要从$request->all()中获取数据。目前遇到问题:通过Postman调用该接口运行正常,但通过Axios调用同一接口时会抛出Undefined index: user错误。
我的Laravel代码如下:
$userdata = $request->all(); // var_dump array(2) { ["user"]=> string(4) "demo" [ "id" ]=> int(3) 999} return $userdata["user"];
我的Axios请求代码如下:
data = {user : 'demo', id : 999}; const headers = { 'x-token': token, 'Content-Type': 'application/json' }; axios.post(`MY_URL`, data, { headers: headers}) .then(function (response) { console.log('response',response) }) .catch(function (error) { console.log('ERO',error); });
我的Laravel应用使用Nginx部署,已经添加了CORS中间件。测试发现使用$request->get('user')可以正常取值,但由于前序开发者在所有参数获取位置都使用了$userdata["user"]的写法,我必须沿用该方式不能修改。
Postman调用接口可正常拿到返回结果
原因说明
Laravel 5.8对application/json类型的POST请求,解析后的JSON参数虽然可以通过$request->get()方法读取,但默认不会自动合并到$request->all()返回的数组中,导致直接用数组索引取值时报错。而Postman默认发送x-www-form-urlencoded格式的请求,这类请求的参数会被直接解析到all()返回的数组里,所以运行正常。
解决方案
- 方案1:新增全局请求参数合并中间件(无需修改原有业务代码,适配性最高)
- 创建中间件文件
app/Http/Middleware/MergeJsonInput.php,写入以下代码:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; class MergeJsonInput { public function handle(Request $request, Closure $next) { // 仅处理JSON类型的POST请求 if ($request->isJson() && $request->isMethod('post')) { $jsonData = $request->json()->all(); // 合并JSON参数到请求参数数组中 $request->merge($jsonData); } return $next($request); } }- 注册中间件,打开
app/Http/Kernel.php,在$middleware全局中间件数组中添加:
配置完成后所有JSON请求的参数都会被合并到\App\Http\Middleware\MergeJsonInput::class,$request->all()的返回结果中,原有业务代码完全不需要修改。 - 创建中间件文件
- 方案2:修改Axios请求格式,和Postman保持一致
将Axios请求的Content-Type改为application/x-www-form-urlencoded,并序列化参数:import qs from 'qs'; const data = {user : 'demo', id : 999}; const headers = { 'x-token': token, 'Content-Type': 'application/x-www-form-urlencoded' }; axios.post(`MY_URL`, qs.stringify(data), { headers: headers}) .then(function (response) { console.log('response',response) }) .catch(function (error) { console.log('ERO',error); }); - 方案3:检查Nginx配置,确保没有限制JSON请求体
打开Nginx站点配置文件,在server块中确认以下配置:
配置完成后执行client_max_body_size 10M; underscores_in_headers on;nginx -s reload重启Nginx生效。
内容的提问来源于stack exchange,提问作者Kaushik Makwana
相关产品推荐
相关产品推荐

