RESTful API 回复 Laravel 5
RESTful API response in Laravel 5
我正在用 Laravel 构建 RESTful API。我的API总是returnsJSON。我想做的是将响应逻辑放在一个地方。下面是我现在在 API 控制器中的做法,它由 Route::controller()
指出。有趣且非常有用的例子来了:
public function getDouble($number) {
try {
if (!is_numeric($number)) {
throw new HttpException(400, 'Invalid number.');
}
$response = $number * 2;
$status = 200;
}
catch (HttpException $exception) {
$response = $exception->getMessage();
$status = $exception->getStatusCode();
}
return response()->json($response, $status);
}
在这个例子中,我的 API 路由将是例如 /double/13
通过 GET 方法访问。问题是我在每个方法中重复这个 try ... catch 块。我希望我的 API 方法是这样的:
public function getDouble($number) {
if (!is_numeric($number)) {
throw new HttpException(400, 'Invalid number.');
}
return $number;
}
然后,捕获这些异常并在另一个地方形成 JSON。就良好的应用程序架构而言,这里的最佳方法是什么?
异常响应
您可以通过处理 App\Exceptions\Handler
中的异常来做到这一点。
你可以在 render 方法中完成,像这样:
/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Exception $e
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $e)
{
if($e instanceof HttpException) {
return response()->json($e->getMessage(), $e->getStatusCode());
}
return parent::render($request, $e);
}
成功响应
有几种方法可以做到这一点,但我想中间件是最适合的一种。
- 创建一个中间件(例如,ApiResponseFormatterMiddleware)
- 在您的 'App\Http\Kernel' 中,将其添加到
$routeMiddleware
数组。
- 将其应用于 api 路由,您要解析的响应。
你可以按照以下方式做一些事情:
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$response = $next($request);
return response()->json($response->getOriginalContent());
}
当然,您需要更改一些逻辑以按照您想要的方式解析内容,但框架保持不变。
我正在用 Laravel 构建 RESTful API。我的API总是returnsJSON。我想做的是将响应逻辑放在一个地方。下面是我现在在 API 控制器中的做法,它由 Route::controller()
指出。有趣且非常有用的例子来了:
public function getDouble($number) {
try {
if (!is_numeric($number)) {
throw new HttpException(400, 'Invalid number.');
}
$response = $number * 2;
$status = 200;
}
catch (HttpException $exception) {
$response = $exception->getMessage();
$status = $exception->getStatusCode();
}
return response()->json($response, $status);
}
在这个例子中,我的 API 路由将是例如 /double/13
通过 GET 方法访问。问题是我在每个方法中重复这个 try ... catch 块。我希望我的 API 方法是这样的:
public function getDouble($number) {
if (!is_numeric($number)) {
throw new HttpException(400, 'Invalid number.');
}
return $number;
}
然后,捕获这些异常并在另一个地方形成 JSON。就良好的应用程序架构而言,这里的最佳方法是什么?
异常响应
您可以通过处理 App\Exceptions\Handler
中的异常来做到这一点。
你可以在 render 方法中完成,像这样:
/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Exception $e
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $e)
{
if($e instanceof HttpException) {
return response()->json($e->getMessage(), $e->getStatusCode());
}
return parent::render($request, $e);
}
成功响应
有几种方法可以做到这一点,但我想中间件是最适合的一种。
- 创建一个中间件(例如,ApiResponseFormatterMiddleware)
- 在您的 'App\Http\Kernel' 中,将其添加到
$routeMiddleware
数组。 - 将其应用于 api 路由,您要解析的响应。
你可以按照以下方式做一些事情:
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$response = $next($request);
return response()->json($response->getOriginalContent());
}
当然,您需要更改一些逻辑以按照您想要的方式解析内容,但框架保持不变。