我有端点可用的RESTful服务。
例如,我请求api/main
并从服务器获取JSON数据。
对于我使用的响应:
return response()->json(["categories" => $categories]);
如何控制URL中响应传递参数的格式?
作为示例,我需要这样:api/main?format=json|html
它将适用于控制器中的每个response
。
答案 0 :(得分:3)
您可以使用此Response macros。例如,在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响应。但是,根据您的需要,您可能需要更多地自定义它以处理例如重定向。
答案 1 :(得分:1)
一种选择是使用Middleware
。以下示例假定您将始终返回view('...', [/* some data */])
。
以下内容将检查格式是否应为json
,如果是,请从响应中获取粘贴到视图的数据,然后返回。然后,您只需将此中间件应用于可以返回json
和html
的路由。
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];