Laravel HTTP Client请求Lumen API数据未保存 Postman正常
问题原因
核心问题出在客户端请求格式和Postman不一致:
Laravel内置Http Client发送POST请求时,默认会将数组参数序列化为JSON格式,携带Content-Type: application/json头发送;而你用Postman测试时,默认是用application/x-www-form-urlencoded表单格式提交参数。
如果你的Lumen项目没有手动开启JSON请求体解析(部分Lumen版本默认不启用该中间件),$request->input()方法就无法从JSON请求体中读取到p1、p2参数,拿到的都是null值,自然无法正确写入数据库。
而你Lumen端的两个写法问题,直接导致了“返回200成功但数据没存”的现象:
- 没有判断
$req->save()的返回值:如果因为参数缺失触发模型拦截事件(比如creating/saving钩子校验参数不通过返回false),save()只会返回false不会抛出异常,代码会继续走到finally块返回成功响应。 - 异常捕获范围太窄:只捕获了
ErrorException,但数据库操作、模型相关的异常大多属于Exception子类,不过当前场景下参数为null时如果字段允许为空、或者被模型事件拦截,根本不会抛出异常,所以接口一直返回200。
修复方案
修改客户端请求代码,调用asForm()方法显式指定以表单格式提交参数,和Postman的请求行为保持一致即可:
$url = env('API_ADDRESS'); $data= [ 'p1' => $request->input('p1'), 'p2' => $request->input('p2') ]; $headers = [ 'key' => env('API_KEY') ]; // 新增asForm(),以x-www-form-urlencoded格式提交参数 $req = Http::withHeaders($headers)->asForm()->post($url, $data);
可选优化(Lumen端)
为了避免后续出现同类假成功问题,建议调整接口代码:
- 扩大异常捕获范围,捕获所有
Exception类型异常,避免未捕获错误直接返回500 - 判断
save()的返回结果,根据实际保存成功与否返回对应状态,不要无条件返回success - 如需兼容JSON请求,可以在Lumen全局中间件中启用
Illuminate\Http\Middleware\ParseJson中间件,自动解析JSON请求体到参数袋中。
内容的提问来源于stack exchange,提问作者Erikson Souza
相关产品推荐
相关产品推荐

