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());
}

当然,您需要更改一些逻辑以按照您想要的方式解析内容,但框架保持不变。