Laravel 5.5处理application/x-www-form-urlencoded请求体异常求助
嘿,我知道你现在在开发适配iOS的API,碰到注册接口拿不到请求数据的问题,这事儿我之前也遇到过,给你几个靠谱的排查方向:
先检查Postman的请求体设置!
你设置了Content-type: application/x-www-form-urlencoded,那在Postman里一定要选x-www-form-urlencoded这个标签页来填参数,别选form-data或者raw——很多人在这里搞混,导致参数根本没被正确编码发送,Laravel自然拿不到数据。看看注册接口是不是误加了授权中间件
注册接口本来就不该要求用户带Authorization头啊!如果你的路由里给注册接口套了auth:api中间件,Laravel会先去验证这个Bearer token,而注册阶段用户哪来有效token?这直接就把请求拦截了,后面的参数肯定拿不到。去routes/api.php里检查下:// 错的!别给注册接口加auth中间件 Route::group(['middleware' => 'auth:api'], function () { Route::post('register', 'Auth\RegisterController@register'); }); // 才对!注册接口单独放外面 Route::post('register', 'Auth\RegisterController@register');换个方式拿参数试试
有时候$request->all()可能因为全局中间件的影响抽风,你可以直接指定参数名来拿:// 别用dd($request->all())了,换成这个试试 dd($request->input('你的参数名1'), $request->input('你的参数名2'));确认CSRF验证没搞乱API请求
Laravel 5.5的api路由组默认是跳过CSRF验证的,但如果有人改了app/Http/Middleware/VerifyCsrfToken.php里的$except数组,把api/*删掉了,那CSRF验证失败也会导致参数解析异常。去看看这个数组:protected $except = [ 'api/*', // 必须有这行! ];如果非得用原始请求内容解析
之前你试的json_decode不对,因为x-www-form-urlencoded不是JSON格式,要用parse_str来解析:$raw = file_get_contents('php://input'); parse_str($raw, $params); dd($params);
按这几步排查下来,应该就能解决问题啦!
内容的提问来源于stack exchange,提问作者Hiren Gohel

