在 laravel 中使用错误的 http 请求类型(例如 get 而不是 post)时返回 404

Posted

技术标签:

【中文标题】在 laravel 中使用错误的 http 请求类型(例如 get 而不是 post)时返回 404【英文标题】:Return a 404 when wrong ttp request type used(e.g. get instead of post) in laravel 【发布时间】:2020-03-20 11:29:30 【问题描述】:

我正在开发一个 REST API,有时前端调用一个带有错误 HTTP 请求类型的端点。例如,我有一条路线 (/users/unassigned),路线的类型是“GET”。想象一下我的前端使用“POST”请求调用此路由。出现以下错误。The POST method is not supported for this route. Supported methods: GET, HEAD, PUT, DELETE. 我想要的是 API 在这些情况下响应 JSON,我可以处理异常。我使用了 Route::fallback,但此方法捕获路由的每个异常。我需要一个只处理被告知的问题的函数。

【问题讨论】:

使用处理程序。 App\Exceptions\Handler::class,在你的情况下,即使响应不是 JSON?响应码明确:404 在这些情况下,您会收到 405 错误。这应该足以处理响应。内容应该无关紧要。 【参考方案1】:

检查您在 $request 变量中收到的请求类型,然后有条件地处理它。

【讨论】:

【参考方案2】:

一种方法是用app/Exceptions/Handler.php处理它:

public function render($request, Exception $e)

    if ($request->ajax() || $request->wantsJson()) 
        return response()->json([
            'error' => $e->getMessage(),
        ], 400);
    

    return parent::render($request, $e);

当请求由 ajax 发出或请求期望 json 时,这会将所有异常的错误消息输出为 json。

您还可以像这样添加对异常类型的检查:

if ($exception instanceof MethodNotAllowedHttpException) 
    // Code...

【讨论】:

【参考方案3】:

您可以在异常处理程序中进行一些调整。

app/Exceptions/Handler.php文件的渲染函数中

public function render($request, Exception $exception)

    if ($exception instanceof MethodNotAllowedHttpException) 
        if ($request->ajax()) 
            return response()->json(['error' => 'Route Not Found'], 404);
        
        else 
            //something else
        
    

    return parent::render($request, $exception);

并在顶部使用部分添加use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;

【讨论】:

【参考方案4】:

非常感谢。 我在 handler.php 中使用以下代码。

    
        if ($this->isHttpException($exception)) 
            switch ($exception->getStatusCode()) 

                // not authorized
                case '403':
                    return Response()->json(["error" => "not authorized."],403);
                    break;

                // not found
                case '404':
                    return Response()->json(["error" => "Route not found."],404);
                    break;

                // internal error
                case '500':
                    return Response()->json(["error" => "internal error."],500);
                    break;

                case '405':
                    return Response()->json(["error" => "request type not match."],405);
                    break;

                default:
                    return $this->renderHttpException($exception);
                    break;
            
        
        else 
            return parent::render($request, $exception);
        
    

重点是不允许的方法的 http 代码 405。特别感谢@apokryfos。

【讨论】:

【参考方案5】:

更改 Handler.php

喜欢

protected $dontReport = [
             \Illuminate\Auth\AuthenticationException::class,
            \Illuminate\Auth\Access\AuthorizationException::class,
            \Symfony\Component\HttpKernel\Exception\HttpException::class,
            \Illuminate\Database\Eloquent\ModelNotFoundException::class,
            \Illuminate\Session\TokenMismatchException::class,
            \Illuminate\Validation\ValidationException::class,
            //
];

protected function unauthenticated($request, AuthenticationException $exception)
    
        if ($request->expectsJson()) 
         $arr = array("status" => 400, "message" =>"Unauthorized access", "data" => array());
             return \Response::json($arr);
        
        return redirect()->guest('login');
     

【讨论】:

如果您的答案正确,请标记为有帮助。谢谢。

以上是关于在 laravel 中使用错误的 http 请求类型(例如 get 而不是 post)时返回 404的主要内容,如果未能解决你的问题,请参考以下文章

Vuejs Axios POST 请求从 Laravel 后端获取 HTTP422 错误

Laravel 错误“ReflectionException”-“类 App\Http\Kernel 不存在”

仅在 HTTPS 中执行 ajax POST 请求时,Laravel 403 错误(生产)

在 Laravel 中找不到类“App\Http\Controllers\Response”错误

如何在 Laravel 5.5 中为选定的请求类设置自定义响应

Laravel之控制器