How to determine where a request is coming from in a REST api
You can use
if ($request->wantsJson()) {
// enter code heree
}
Use this Way. you can simply identify URL being call form ( Web or API )
Controller code
if ( Request::capture()->expectsJson() )
{ return "API Method"; }
else
{ return "Web Method"; }
Route Code
For api.php Route::post("category","CategoryController@index");
For Web.php Route::get("category","CategoryController@index");
You can use Request::wantsJson()
like this:
if (Request::wantsJson()) {
// return JSON-formatted response
} else {
// return HTML response
}
Basically what Request::wantsJson()
does is that it checks whether the accept
header in the request is application/json
and return true or false based on that. That means you'll need to make sure your client sends an "accept: application/json" header too.
Note that my answer here does not determine whether "a request is coming from a REST API", but rather detects if the client requests for a JSON response. My answer should still be the way to do it though, because using REST API does not necessary means requiring JSON response. REST API may return XML, HTML, etc.
Reference to Laravel's 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';
}
Note::This is for future viewers
The approach I found convenient using a prefix api
for api calls. In the route file use
Route::group('prefix'=>'api',function(){
//handle requests by assigning controller methods here for example
Route::get('posts', 'Api\Post\PostController@index');
}
In the above approach, I separate controllers for api call and web users. But if you want to use the same controller then Laravel Request
has a convenient way. You can identify the prefix within your controller.
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();
}
}
The is
method allows you to verify that the incoming request URI matches a given pattern. You may use the *
character as a wildcard when utilizing this method.