在 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”错误