如何确定请求在 REST API 中的来源

2022-08-30 17:25:23

我有一个带有控制器的RESTful API,当被我的Android应用程序击中时,它应该返回JSON响应,当它被Web浏览器击中时,它应该返回“视图”。我甚至不确定我是否以正确的方式接近这一点。我正在使用Laravel,这就是我的控制器的样子

class TablesController extends BaseController {

    public function index()
    {
        $tables  = Table::all();

        return Response::json($tables);
    }
}

我需要这样的东西

class TablesController extends BaseController {

    public function index()
    {
        $tables  = Table::all();

        if(beingCalledFromWebBrowser){
            return View::make('table.index')->with('tables', $tables);
        }else{ //Android 
            return Response::json($tables);
        }
    }

看看这些反应彼此之间有何不同?


答案 1

注意::这是为未来的观众准备的

我发现使用前缀进行api调用的方法很方便。在路由文件中使用api

Route::group('prefix'=>'api',function(){
    //handle requests by assigning controller methods here for example
    Route::get('posts', 'Api\Post\PostController@index');
}

在上面的方法中,我将 api 调用和 Web 用户的控制器分开。但是如果你想使用相同的控制器,那么有一个方便的方法。您可以在控制器中标识前缀。Laravel Request

public function index(Request $request)
{
    if( $request->is('api/*')){
        //write your logic for api call
        $user = $this->getApiUser();
    }else{
        //write your logic for web call
        $user = $this->getWebUser();
    }
}

is 方法允许您验证传入请求 URI 是否与给定模式匹配。使用此方法时,可以使用 * 字符作为通配符。


答案 2

你可以像这样使用:Request::wantsJson()

if (Request::wantsJson()) {
    // return JSON-formatted response
} else {
    // return HTML response
}

基本上,它的作用是检查请求中的标头是否为,并基于此返回 true 或 false。这意味着您需要确保客户端也发送“accept: application/json”标头。Request::wantsJson()acceptapplication/json

请注意,我在这里的答案并不能确定“请求是否来自 REST API”,而是检测客户端是否请求 JSON 响应。我的答案应该仍然是这样做的方法,因为使用REST API并不一定意味着需要JSON响应。REST API 可能会返回 XML、HTML 等。


引用Laravel的Illuminate\Http\Request

/**
 * Determine if the current request is asking for JSON in return.
 *
 * @return bool
 */
public function wantsJson()
{
    $acceptable = $this->getAcceptableContentTypes();

    return isset($acceptable[0]) && $acceptable[0] == 'application/json';
}

推荐