Laravel 8中如何通过HTTP客户端向其他本地服务发送POST请求
解决Laravel跨应用POST请求异常问题
核心问题分析
- CSRF保护拦截:Laravel默认启用CSRF中间件,同IP不同端口的跨应用POST请求会被拦截,因为请求未携带目标应用的CSRF令牌。
- 响应格式不匹配:8000端返回
return back();是重定向响应,而8001端尝试用$response->json()解析JSON格式,导致解析失败返回空白。 - 模型批量赋值限制:如果
Registration模型未设置$fillable属性,create()方法会因批量赋值规则无法写入数据。
具体修复步骤
1. 处理CSRF拦截问题
两种可选方案:
- 方案一:直接放行目标路由
在8000应用的app/Http/Middleware/VerifyCsrfToken.php中,将pre-register路由加入跳过CSRF校验的列表:
protected $except = [ 'pre-register', ];
- 方案二:携带CSRF令牌请求
先从8000获取令牌,再在请求中携带:
在8001的请求代码中添加令牌获取逻辑:
// 先获取8000的CSRF令牌 $token = Http::get('http://127.0.0.1:8000/csrf-token')->json()['token']; // 携带令牌发起POST请求 $response = Http::post('http://127.0.0.1:8000/pre-register', [ '_token' => $token, 'lname'=>$request->lname, 'fname'=>$request->fname, 'username'=>$request->username, 'password'=>$request->password, ]);
同时在8000应用中新增返回CSRF令牌的路由:
Route::get('/csrf-token', function () { return ['token' => csrf_token()]; });
2. 调整响应格式匹配API需求
8000端的preRegistration方法需返回JSON响应,而非重定向:
public function preRegistration(Request $request) { Registration::create([ 'fname'=>$request->fname, 'lname'=>$request->lname, 'uname'=>$request->username, 'password'=>Hash::make($request->password), ]); return response()->json(['status' => 'success', 'message' => '预注册完成']); }
3. 配置模型批量赋值权限
在8000应用的Registration模型中,设置允许批量赋值的字段:
protected $fillable = ['fname', 'lname', 'uname', 'password'];
4. 确认路由方法正确性
检查8000应用的路由定义,确保pre-register使用POST方法:
Route::post('/pre-register', [YourController::class, 'preRegistration']);
验证修改
重启两个Laravel应用后,在8001端发起请求,即可收到8000端返回的JSON响应,同时数据库会新增对应的预注册数据。
内容的提问来源于stack exchange,提问作者LVC
相关产品推荐
相关产品推荐

