1

我有端点可用的 RESTful 服务。

例如,我api/main从服务器请求并获取 JSON 数据。

对于响应,我使用:

return response()->json(["categories" => $categories]);

如何控制 URL 中响应传递参数的格式?

作为示例,我需要这个:api/main?format=json|html它将适用于每个response控制器。

4

3 回答 3

6

您可以使用此响应宏。例如在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 响应。但是,根据您的需要,您可能需要对其进行更多自定义以处理例如重定向。

于 2017-02-19T15:05:09.027 回答
6

一种选择是为此使用Middleware。下面的示例假定您将始终返回view('...', [/* some data */])即带有数据的视图。

当“格式”应该是json时,下面将返回传递给视图的数据数组,而不是编译后的视图本身。然后,您只需将此中间件应用于可以拥有jsonhtml返回的路由。

public function handle($request, Closure $next)
{
    $response = $next($request);

    if ($request->input('format') === 'json') {
        $response->setContent(
            $response->getOriginalContent()->getData()
        );
    }

    return $response;
}
于 2017-02-19T13:12:26.617 回答
0

使用您的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 调用

于 2017-02-19T10:46:27.083 回答