Laravel 响应:永远返回 JSON 响应
当你在编写完全为 API 服务的 Laravel 应用时,你希望所有响应都是 JSON 格式的,而不是例如说授权错误会重定向到 /home 或 /login,最终重定向会变成 InvalidArgumentException: Route [login] is not defined. 的视图。
下面这个简单的方案,可以让你的 Laravel 应用优先响应为 JSON 格式。
第一步、编写 BaseRequest
首先我们需要构建一个 BaseRequest 来重写 Illuminate\Http\Request ,修改为默认优先使用 JSON 响应:
app/Http/Requests/BaseRequest.php
<?php
namespace App\Http\Requests;
use Illuminate\Http\Request;
class BaseRequest extends Request
{
public function expectsJson()
{
return true;
}
public function wantsJson()
{
return true;
}
}
第二步、替换 BaseRequest
在 public/index.php 文件中,将 \Illumiate\Http\Request 替换为我们的 BaseRequest,如下:
$response = $kernel->handle(
$request = \App\Http\Requests\BaseRequest::capture()
);
搞定!
现在所有的响应都是 application/json ,包括错误和异常。
Laravel 社区 Wiki
关于 LearnKu
高认可度评论:
我來貢獻一下我自己的做法
新增 middleware
Kernel.php 加入
routes/api.php
打完收功
這樣的做法可以任意指定 router 的行為
還可以不用更動到 Laravel 原生的程式碼
黑科技
黑科技
66666, 又学到了
果然黑科技。
操作好骚
果然是骚操作
黑科技,学到了
666666666
:gem: 黑科技
反手就是一个赞
666
喜欢黑科技,666
我來貢獻一下我自己的做法
新增 middleware
Kernel.php 加入
routes/api.php
打完收功
這樣的做法可以任意指定 router 的行為
還可以不用更動到 Laravel 原生的程式碼
厉害
牛逼啊,省的总是要在headers中加一个xhr....
哈哈哈,为什么我想笑啊,哈哈哈哈
不错
黑色武器吧
这个在请求头中加入Accept:application/json就可以了吧
牛叉
可以的,666
如果这样,不如直接用Lumen。。。
@recca0120 我觉得你的方法更好
@recca0120 我也是用这种方法
@recca0120 同样是九年义务教育,niTM 怎么这么优秀
@recca0120 其实~你的做法好,但这个 accept 的设置应该在前端或请求段,不应该服务器自己手动设置;
@Moting 這個是單純的思路,可以快速的解決這個需求,但如你所說的不該我們設置,所以應該再多一行判斷式才對,判斷 request header accept 有無值,有值就不做任何動作,空值就補 header ,這樣就把控制權還給 client 了
好骚的操作啊,可是为啥呢,大神能不能讲讲原因啊
楼主这个太暴力啦,假设项目同时提供web和api两种服务,更通用的做法应该根据不同的路由前缀进行不同的返回。
哈哈哈哈
2020-06-13 更新: 虽然写在 api.php 路由文件中,但是污染了所有路由请求(web.php 路由也受到影响),请谨慎使用,还是推荐写在中间件中吧,可控性高一些
根据 @recca0120 的中间件方法,想到一个更简单的方法,需要返回 Json 数据的基本都是接口,所以在路由文件
api.php最上面添加一行代码(当然也可以写在web.php中)这样连中间件都不用写了,缺点是不能单独控制每个接口(既然都写到接口路由里,应该不需要返回 json 以外的数据吧),如果没有命中接口路由,返回 404 页不是 json 数据(因为跟本没进路由文件
api.php当然就无效了),但是如果命中路由后返回的 404 就是正常的 json 数据了学到了