【问题标题】:RESTful API response in Laravel 5Laravel 5 中的 RESTful API 响应
【发布时间】:2015-02-24 09:44:32
【问题描述】:

我正在使用 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);
}

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

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

    return $number;
}

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

【问题讨论】:

    标签: php rest http laravel laravel-5


    【解决方案1】:

    异常响应

    您可以通过处理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());
    }
    

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

    【讨论】:

    • $response 转换为字符串时将给出呈现的字符串。它的预期行为。
    • 是的,但我在中间件的 $response 上做了var_dump,它说这是一个字符串,而不是一个对象。
    • 顺便说一句,有没有比注册全局异常处理程序更好的方法?我也想为我的 API 处理普通异常,但是我处理它们的方式与外部 API 不同。
    • 你可以通过其他方式来实现(比如:使用 catch all -api-route),但是它们很麻烦并且需要你牺牲一些 laravel 的好处。最好使用$request 来确定请求是针对您的 api 还是针对应用程序的其余部分。
    猜你喜欢
    • 1970-01-01
    • 2015-05-03
    • 2020-12-01
    • 2015-07-07
    • 2017-10-30
    • 2015-06-13
    • 1970-01-01
    • 2016-06-11
    • 2015-05-17
    相关资源
    最近更新 更多