Wad*_*der 35
您需要调整异常处理程序(app/Exceptions/Handler.php)以返回所需的响应.
这是可以做什么的一个非常基本的例子.
public function render($request, Exception $e)
{
$rendered = parent::render($request, $e);
return response()->json([
'error' => [
'code' => $rendered->getStatusCode(),
'message' => $e->getMessage(),
]
], $rendered->getStatusCode());
}
Run Code Online (Sandbox Code Playgroud)
基于@Wader答案的更准确的解决方案可以是:
use Illuminate\Http\JsonResponse;
public function render($request, Exception $e)
{
$parentRender = parent::render($request, $e);
// if parent returns a JsonResponse
// for example in case of a ValidationException
if ($parentRender instanceof JsonResponse)
{
return $parentRender;
}
return new JsonResponse([
'message' => $e instanceof HttpException
? $e->getMessage()
: 'Server Error',
], $parentRender->status());
}
Run Code Online (Sandbox Code Playgroud)
我建议您添加一个将Accept标头设置为application/json.
例如,您可以创建一个名为的中间件RequestsAcceptJson,并以这种方式定义它:
<?php
namespace App\Http\Middleware;
use Closure;
class RequestsAcceptJson
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$acceptHeader = strtolower($request->headers->get('accept'));
// If the accept header is not set to application/json
// We attach it and continue the request
if ($acceptHeader !== 'application/json') {
$request->headers->set('Accept', 'application/json');
}
return $next($request);
}
}
Run Code Online (Sandbox Code Playgroud)
然后你只需要将它注册为一个全局中间件,以便在对你的 api 的每个请求中运行。在流明中,您可以通过在中间件调用中添加类来做到这一点bootstrap/app.php
$app->middleware([
App\Http\Middleware\RequestsAcceptJson::class
]);
Run Code Online (Sandbox Code Playgroud)
对于 Laravel,它的过程几乎相同。现在错误处理程序将始终返回一个 json 而不是纯文本/html。
| 归档时间: |
|
| 查看次数: |
11210 次 |
| 最近记录: |