如何确定REST api中请求的来源

时间:2014-07-05 21:10:01

标签: php android rest laravel

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

class TablesController extends BaseController {

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

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

我需要这样的东西

class TablesController扩展了BaseController {

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

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

了解答案之间的差异如何?

4 个答案:

答案 0 :(得分:5)

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

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

基本上Request::wantsJson()所做的是它检查请求中的accept标头是application/json并根据它返回true或false。这意味着你需要确保你的客户端也发送一个“accept:application / 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';
}

答案 1 :(得分:5)

注意::这适用于未来的观众

我发现方便的方法是使用前缀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 :(得分:2)

您可以使用

if ($request->wantsJson()) {
     // enter code heree
}

答案 3 :(得分:0)

使用这种方式。您只需确定URL是调用表单(Web或API)

控制器代码

if ( Request::capture()->expectsJson()  )
     {  return "API Method";  }
     else
     {  return "Web Method";     }

路线代码

对于api.php 路线:: post(“ category”,“ CategoryController @ index”);

对于Web.php 路线:: get(“ category”,“ CategoryController @ index”);