Laravel 5中的RESTful API响应

Rob*_*bok 5 php rest http laravel laravel-5

我正在使用Laravel构建RESTful API.我的API总是返回JSON.我想做的是将响应逻辑保持在一个地方.以下是我现在在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);
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,我的API路由将由/double/13GET方法访问.问题是我在每个方法中重复这个try ... catch块.我希望我的API方法如下:

public function getDouble($number) {
    if (!is_numeric($number)) {
        throw new HttpException(400, 'Invalid number.');
    }

    return $number;
}
Run Code Online (Sandbox Code Playgroud)

然后,捕获这些异常并在另一个地方形成JSON.在良好的应用程序架构方面,这里最好的方法是什么?

ult*_*ate 12

对例外的回应

您可以通过处理异常来完成此操作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);
}
Run Code Online (Sandbox Code Playgroud)

成功回应

有几种方法可以做到这一点,但我猜中间件是最适合的.

  • 创建中间件(例如,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());
}
Run Code Online (Sandbox Code Playgroud)

当然,你需要改变一些逻辑来按照你想要的方式解析内容,但骨架保持不变.