在 Laravel 8 中使用 API 路由时返回错误

Posted

技术标签:

【中文标题】在 Laravel 8 中使用 API 路由时返回错误【英文标题】:return errors while using API routes in Laravel 8 【发布时间】: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() 在数据无效时执行重定向。请参阅此答案:***.com/a/52665249/3965631(和/或该页面上的其他答案) 谢谢,我刚刚意识到如果无效,它会引发异常,因为我没有任何 CATCH,它只会将我发送回主路线:'/' 谢谢 【参考方案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 异常,所以它正在重定向回“/”。

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

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

【讨论】:

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

以上是关于在 Laravel 8 中使用 API 路由时返回错误的主要内容,如果未能解决你的问题,请参考以下文章

在 PHPUnit 中调用路由时如何在 Laravel 8 中模拟 Eloquent 模型

使用虚拟主机的 Laravel API 返回 404

Laravel 路由、api 和 web 用例

Laravel 8 API 调用未正确返回验证错误

Ajax 在 Laravel 8 中返回 404 错误但路由存在

Laravel - 当 API 路由错误或找不到时如何显示 JSON?