Ale*_*lex 6 laravel laravel-5.4
每当我拨打电话时/api/v1/posts/1,呼叫都会转发给该show方法
public function show(Post $post) {
return $post;
}
Run Code Online (Sandbox Code Playgroud)
在PostController.php资源丰富的控制器.如果帖子确实存在,则服务器返回JSON响应.但是,如果后期不不存在,服务器尽管回报显然期待JSON请求返回纯HTML.这是Postman的演示.
问题是API应该返回application/json,而不是text/html.所以,这是我的问题:
1.如果在使用隐式路由模型绑定时发生异常,Laravel是否内置支持自动返回JSON(如show上面的方法,当我们有404时)?
2.如果是,我该如何启用它?(默认情况下,我得到纯HTML,而不是JSON)
如果它不是在每个 API控制器上复制以下内容的替代方法
public function show($id) {
$post = Post::find($id); // findOrFail() won't return JSON, only plain HTML
if (!$post)
return response()->json([ ... ], 404);
return $post;
}
Run Code Online (Sandbox Code Playgroud)
3.是否有一般用法app\Exceptions\Handler?
4.标准错误/异常响应包含什么?我搜索了这个,但发现了许多自定义变体.
5.为什么JSON响应仍然没有构建到隐式路由模型绑定中?为什么不简化开发人员生活并自动处理这种低级别的烦恼?
在Laravel IRC的人们建议我单独留下错误响应之后,我留下了一个难题,认为默认情况下标准的HTTP异常会呈现为HTML,而使用API的系统应该处理404而不需要查看正文.我希望更多的人加入讨论,我想知道你们会如何回应.
我使用此代码app/Exceptions/Handler.php,可能您需要进行一些更改
public function render($request, Exception $exception)
{
$exception = $this->prepareException($exception);
if ($exception instanceof \Illuminate\Http\Exception\HttpResponseException) {
return $exception->getResponse();
}
if ($exception instanceof \Illuminate\Auth\AuthenticationException) {
return $this->unauthenticated($request, $exception);
}
if ($exception instanceof \Illuminate\Validation\ValidationException) {
return $this->convertValidationExceptionToResponse($exception, $request);
}
$response = [];
$statusCode = 500;
if (method_exists($exception, 'getStatusCode')) {
$statusCode = $exception->getStatusCode();
}
switch ($statusCode) {
case 404:
$response['error'] = 'Not Found';
break;
case 403:
$response['error'] = 'Forbidden';
break;
default:
$response['error'] = $exception->getMessage();
break;
}
if (config('app.debug')) {
$response['trace'] = $exception->getTrace();
$response['code'] = $exception->getCode();
}
return response()->json($response, $statusCode);
}
Run Code Online (Sandbox Code Playgroud)
此外,如果您将使用formRequest验证,您需要覆盖该方法response,否则您将被重定向,它可能会导致一些错误.
use Illuminate\Http\JsonResponse;
...
public function response(array $errors)
{
// This will always return JSON object error messages
return new JsonResponse($errors, 422);
}
Run Code Online (Sandbox Code Playgroud)
小智 4
- app\Exceptions\Handler 中是否有通用的方法可以使用?
您可以检查通用异常处理程序中是否需要 json。
// app/Exceptions/Handler.php
public function render($request, Exception $exception) {
if ($request->expectsJson()) {
return response()->json(["message" => $exception->getMessage()]);
}
return parent::render($request, $exception);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11005 次 |
| 最近记录: |