如何改变Laravel的回应?

时间:2017-02-19 10:03:44

标签: laravel laravel-5 laravel-5.4 laravel-response

我有端点可用的RESTful服务。

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

对于我使用的响应:

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

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

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

3 个答案:

答案 0 :(得分:3)

您可以使用此Response macros。例如,在AppServiceProviderboot方法中,您可以添加:

\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响应。但是,根据您的需要,您可能需要更多地自定义它以处理例如重定向。

答案 1 :(得分:1)

一种选择是使用Middleware。以下示例假定您将始终返回view('...', [/* some data */])

以下内容将检查格式是否应为json,如果是,请从响应中获取粘贴到视图的数据,然后返回。然后,您只需将此中间件应用于可以返回jsonhtml的路由。

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

    if ($request->input('format') == 'json') {

        $response->setContent(
            $this->getDataFromResponse($response)
        );

    }

    return $response;
}

/**
 * Get the data that was pasted to the view
 *
 * @param \Illuminate\Http\Response $response
 */
protected function getDataFromResponse($response)
{
    $content = $response->getOriginalContent();

    return $content->getData();
}

希望这有帮助!

答案 2 :(得分: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' NSAttributedString * attrString = [[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUTF8StringEncoding] options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)} documentAttributes:nil error:nil]; NSString *finalString = [attrString string];

检查传入请求是否为AJAX通话