You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 8中如何通过HTTP客户端向其他本地服务发送POST请求

解决Laravel跨应用POST请求异常问题

核心问题分析

  1. CSRF保护拦截:Laravel默认启用CSRF中间件,同IP不同端口的跨应用POST请求会被拦截,因为请求未携带目标应用的CSRF令牌。
  2. 响应格式不匹配:8000端返回return back();是重定向响应,而8001端尝试用$response->json()解析JSON格式,导致解析失败返回空白。
  3. 模型批量赋值限制:如果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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 16:50:24