【问题标题】:return errors while using API routes in Laravel 8在 Laravel 8 中使用 API 路由时返回错误
【发布时间】:2021-09-21 22:20:46
【问题描述】:

我正在构建一个小型应用程序来在数据库中存储联系人,我已经完成了 GET/POST 路由,并且工作正常,现在我在 API 路由上(为了使用 AJAX 调用)。如果 POST 请求中存在所有字段,我可以存储信息,但是,如果我想将消息发送回呼叫(以发送有关未存储联系人原因的反馈),则响应会将我发送到主路由www.myapp.com(没有消息)我想用“原因”发回一个 json。

此时我只验证 'nombre'、'correo'、'telefono' 是否有标准 Laravel 的请求验证方法的信息。

这是我的 LeadController

public function storeApi(Request $request)
    {
        $request -> validate([
            'nombre' => 'required',
            'correo' => 'required' ,
            'telefono' => 'required'

        ]);

        if(Lead::create($request->all())){

            $result[] = ['saved' => true];

        }else{

            $result[] = ['saved' => false,
            'reason' => 'Some data is missing'];
            return response()-> json($result);
            
        };

        return response()-> json($result);

    }

当记录被存储时,它确实会发回 Json {'saved' : true} 但失败时它只会将您发送回'/'路由:www.myapp.com

如何将消息发送回 POST 调用?

【问题讨论】:

  • $request->validate() 在数据无效时执行重定向。请参阅此答案:stackoverflow.com/a/52665249/3965631(和/或该页面上的其他答案)
  • 谢谢,我刚刚意识到如果无效,它会引发异常,因为我没有任何 CATCH,它只会将我发送回主路线:'/' 谢谢

标签: json laravel laravel-8


【解决方案1】:

经过进一步阅读,我只是更改了使用 Validator 类验证信息的方式:

    public function storeApi(Request $request)
    {
        $validator = \Validator::make($request->all(), ['nombre' => 'required', 'correo' => 'required', 'telefono' => 'required']);

        if($validator->fails()){

            return response()->json($validator->errors(), 422);

        }else {

            //ready to store 

        }
    }

这样我不会让 ValidationException 异常在发送反馈到调用之前发生。

【讨论】:

    【解决方案2】:

    因为$request->validate() 方法抛出\Illuminate\Validation\ValidationException 异常,所以它正在重定向回“/”。

    有一些方法可以处理这个请求。

    1. 在您的验证代码周围放置 try catch 块
    2. 或者在 app\Exception\Handler.php 中处理这个期望,并以 JSON 格式返回响应。

    【讨论】:

    • 发生了这种情况,感谢您为我指出正确的方向,我只是使用不同的方法回答我自己的问题,但使用您刚刚写的评论。
    • 如果您使用上述任何一种方法,您仍然可以使用您之前发布的原始代码。
    • 哦,我明白了,这样我可以发送我自己的自定义消息,我错过了。如果我添加 Catch 块,我可以发送 json 响应?
    • 是的,您可以尝试一下。基本上,当验证失败时,如果未在当前代码中处理,它将进入 Handler.php,因为这是所有未处理的异常所在。但是,如果你添加 try, catch 块,它将在当前代码中处理,不会进入 Handler.php
    • 如果您建议的答案对您有用,您也可以在接受答案后关闭此问题..
    猜你喜欢
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 2017-11-13
    • 2021-07-13
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    相关资源
    最近更新 更多