我有端点可用的 RESTful 服务。
例如,我api/main
从服务器请求并获取 JSON 数据。
对于响应,我使用:
return response()->json(["categories" => $categories]);
如何控制 URL 中响应传递参数的格式?
作为示例,我需要这个:api/main?format=json|html
它将适用于每个response
控制器。
我有端点可用的 RESTful 服务。
例如,我api/main
从服务器请求并获取 JSON 数据。
对于响应,我使用:
return response()->json(["categories" => $categories]);
如何控制 URL 中响应传递参数的格式?
作为示例,我需要这个:api/main?format=json|html
它将适用于每个response
控制器。
您可以使用此响应宏。例如在AppServiceProvider
内部boot
方法中,您可以添加:
\Response::macro('custom', function($view, $data) {
if (\Request::input('format') == 'json') {
return response()->json($data);
}
return view($view, $data);
});
在您的控制器中,您现在可以使用:
$data = [
'key' => 'value',
];
return response()->custom('your.view', $data);
例如,如果您现在运行,GET /categories
您将获得正常的 HTML 页面,但如果您运行,GET /categories?format=json
您将获得 Json 响应。但是,根据您的需要,您可能需要对其进行更多自定义以处理例如重定向。
一种选择是为此使用Middleware
。下面的示例假定您将始终返回view('...', [/* some data */])
即带有数据的视图。
当“格式”应该是json
时,下面将返回传递给视图的数据数组,而不是编译后的视图本身。然后,您只需将此中间件应用于可以拥有json
和html
返回的路由。
public function handle($request, Closure $next)
{
$response = $next($request);
if ($request->input('format') === 'json') {
$response->setContent(
$response->getOriginalContent()->getData()
);
}
return $response;
}
使用您的format
查询参数示例,控制器代码将如下所示:
public function main(Request $request)
{
$data = [
'categories' => /* ... */
];
if ($request->input('format') === 'json') {
return response()->json(data);
}
return view('main', $data);
}
$request->input('format') === 'json'
或者,您可以通过$request->ajax()简单地检查传入请求是否是 AJAX 调用