【问题标题】:Laravel 5 api routeLaravel 5 api路由
【发布时间】:2017-02-17 18:31:13
【问题描述】:

简介:

实际上,我在使用 Laravel api 路由文件时有点困惑。

问题:

如果我需要在其他使用 laravel 制作的平台(如android app)中访问我的网站的数据,那么我应该在api.php 文件中创建不同的路由吗?

如果是,那么我将为每个请求声明两个路由和控制器,第一个在 web.php 中,第二个在 api.php 中。对吗?

基本上我想问一下,我如何做一个api,以便我可以访问网站以及其他平台的数据?

我正在为此寻找一个好的教程,但我没有找到一个好的教程。

【问题讨论】:

  • 理想情况下,您的 API 路由将以 API 可使用的格式返回数据,例如 JSON。您的网络路由应该返回实际的网页。
  • 那么,我应该为api和网站设置不同的路由和控制器吗?
  • 很多人这样做的方式是首先使用 API 控制器编写 API,然后编写 Web 控制器以使用来自 API 的数据。这是假设您的前端将被设置为使用这些 API(通过 Vue 或其他一些 JS 框架)。如果您不打算让前端基于您的 API,那么您将编写完全独立于 API 的 Web 控制器。
  • 那么发布请求呢。我应该向 api 路由发送请求吗?还有一件事,如果我将使用 api 路由,将没有 csrf 保护。有关系吗??
  • 您仍然可以拥有 CSRF 保护,请参阅here

标签: php laravel


【解决方案1】:

理想情况下,API 路由和 Web 路由应该完全不同,但如果您希望它相同,那么您可以仅在 web.php 中添加路由并添加特殊的路由,而不是在不同的文件中定义路由如果您获取参数,则从客户端和控制器中获取参数,然后返回 JSON 对象,否则返回视图。

例如。

web.php

Route::get('getUsers','UserController@getUsers');

用户控制器.php

...
public function getUsers(Request $request)
{
    ...

    if ($request->has('api')) {
        return $users; //API Route (Laravel will by Default return the JSON Response no need to do json_encode)
    }

    return view('pages.user_list'); //Normal Routes hence returning View
}
...

请求 普通请求

<Yourdomain>/getUsers

API 请求

<Yourdomain>/getUsers?api=true

希望对你有所帮助...

【讨论】:

  • 2 个选项 1)禁用这些路由的 CSRF 验证(不推荐),2)您可以创建一个 API,您可以在其中返回 CSRF 令牌,并且在下一个请求中您可以简单地从您的客户端传递它.对于令牌身份验证,您可以使用 JWT Auth github.com/tymondesigns/jwt-auth
【解决方案2】:

api.php 中写入您的api 路由,在web.php 中写入网络路由。

Api 路由在路由中始终具有名称api,因此您可以区分路由。我在这里提到是因为@Akshay Khale 提到了一个带有查询参数的示例。

如果您想为 API 和 Web 使用相同的控制器,Api 请求始终具有标头 Content-Type : Json"Accept":"application/json",因此在您的控制器中您可以按如下方式进行。

public function getUsers(Request $request)
{
    ...

    if ($request->wantsJson()) {
        return response()->json($users, 200); //here why we are extending response object because using json() method you can send the status code with the response. 

    }

    return view('pages.user_list'); //Normal Routes hence returning View
}

【讨论】:

    【解决方案3】:

    对于 laravel 5.6 及以上版本,上述答案对我不起作用,所以这是我的 2 美分。

    我已将路线放在web.phpapi.php 中,正常没有任何魔术。

    public function getUsers(Request $request)
    {
        ....
    
        if( $request->is('api/*')){
            ...
            return response()->json($user_data, 200);
        }
        ...
        return view('users', ['users_data'=>$user_data]);
    }
    

    它将为

    返回json输出

    127.0.0.1:8000/api/users

    和html中的普通视图

    127.0.0.1:8000/用户

    【讨论】:

      猜你喜欢
      • 2018-02-11
      • 1970-01-01
      • 1970-01-01
      • 2019-03-06
      • 2015-07-31
      • 2017-05-22
      • 2017-10-02
      • 2016-07-01
      • 2015-09-10
      相关资源
      最近更新 更多