我有一个带控制器的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);
}
}
了解答案之间的差异如何?
答案 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”);