我正在使用laravel 5.2中的网站建立web api,当用户在我的网络上访问不可用的网址如http://stage.dev/unavailable/link
然后它会在错误视图资源上抛出404页面,然后我想要抓住不同的如果用户尝试使用http//stage.dev/api/v1/unavailable/link
之类的不可用网址访问我的API,那么我想返回json/xml
响应
{
'status' : 'not found',
'code' : 404,
'data' : []
}
不是视图,是否有办法通过url前缀'api / *'或如何检测它...,也许是另一种具有相似结果的方法,因此访问它的设备/客户端可以按标准格式进行(我有所有json响应中的简单格式)
{
'status' : 'success|failed|restrict|...',
'api_id' : '...',
'token' : '...',
'data' : [
{'...' : '...'},
{'...' : '...'},
...
]
}
解决
我在阅读Chris和Alexey的答案后找出了一些内容。这种方法对我有效,我在handler.php
render()
方法中添加了一对行,
if($e instanceof ModelNotFoundException || $this->isHttpException($e)) {
if($request->segment(1) == 'api' || $request->ajax()){
$e = new NotFoundHttpException($e->getMessage(), $e);
$result = collect([
'request_id' => uniqid(),
'status' => $e->getStatusCode(),
'timestamp' => Carbon::now(),
]);
return response($result, $e->getStatusCode());
}
}
我的标头请求响应404错误代码并返回json数据,就像我想要的那样..
答案 0 :(得分:1)
也许有更好的方法,但你可以创建自定义错误404处理程序。关注this tutorial,但将case 404
部分更改为以下内容:
if(str_contains(Request::url(), 'api/v1/')){
return response()->json(your_json_data_here);
}else{
return \Response::view('custom.404',array(),404);
}
答案 1 :(得分:1)
在App\Exception\Handler.php
内,您有一个render
方法,可以方便地进行常规错误捕获和处理。
在这种情况下,您还可以使用request()->ajax()
方法确定它是否为ajax。它通过检查某些标题是否存在来实现,特别是:
'XMLHttpRequest' == $this->headers->get('X-Requested-With')
无论如何,回到Handler.php
中的render方法。
您可以执行以下操作:
public function render($request, Exception $e)
{
if($e instanceof HttpException && $e->getStatusCode() == 404) {
if (request()->ajax()) {
return response()->json(['bla' => 'foo']);
} else {
return response()->view('le-404');
}
}
return parent::render($request, $e);
}
答案 2 :(得分:0)
我在读完 Chris 和 Alexey 的答案后发现了一些东西。这种方法对我有效,我在handler()方法中添加了几个行处理器。 / p>
if($e instanceof ModelNotFoundException || $this->isHttpException($e)) {
if($request->segment(1) == 'api' || $request->ajax()){
$e = new NotFoundHttpException($e->getMessage(), $e);
$result = collect([
'request_id' => uniqid(),
'status' => $e->getStatusCode(),
'timestamp' => Carbon::now(),
]);
return response($result, $e->getStatusCode());
}
}