为什么CURLOPT_POSTFIELDS设置的数据未传递到服务端,接口返回null?
问题原因与解决方法
1. 核心原因:Laravel CSRF 校验拦截
Laravel 默认对所有 POST、PUT、DELETE 等修改类请求开启 CSRF 令牌校验,你发起 CURL POST 请求时没有携带 CSRF 令牌,请求会直接被中间件拦截,返回 419 页面过期的 HTML 内容,而你用 json_decode() 解析 HTML 内容自然得到 null。
你去掉 curl_setopt($cURLConnection, CURLOPT_POSTFIELDS , $data); 后请求能正常返回,是因为无 POST 数据时部分 CURL 版本会自动将 POST 请求降级为 GET 请求,而你的路由配置是 Route::any 支持 GET 请求,GET 请求默认不需要校验 CSRF,所以能拿到正常的返回值。
2. 修复步骤
步骤1:将接口加入 CSRF 排除名单
打开 app/Http/Middleware/VerifyCsrfToken.php 文件,在 $except 属性中添加你的接口路径:
protected $except = [ '/store/cstore/receipt', // 其他需要排除CSRF校验的接口 ];
步骤2:修正返回值解析逻辑
你当前控制器返回的是纯字符串 Success,不是 JSON 格式,不需要调用 json_decode() 解析,直接输出 $apiResponse 即可拿到返回内容。如果需要返回 JSON 格式,修改控制器代码:
public function StoreCstoreReceipt(Request $request){ Log::debug($request->all()); // 返回JSON格式响应 return response()->json(['status' => 'success', 'message' => 'Success']); }
可选优化:CURL 参数调整
如果需要传递 JSON 格式的数据,可将 POST 数据转为 JSON 字符串,并指定请求头:
// 传JSON格式数据时使用 curl_setopt($cURLConnection, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($cURLConnection, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Accept: application/json' ]);
内容的提问来源于stack exchange,提问作者Hamza
相关产品推荐
相关产品推荐

