Laravel 7 - 使用 REST API 而不是数据库

Posted

技术标签:

【中文标题】Laravel 7 - 使用 REST API 而不是数据库【英文标题】:Laravel 7 - Use REST API instead of a database 【发布时间】:2020-07-13 12:25:09 【问题描述】:

我正在使用 rest api 来存储/检索存储在 postgres 数据库中的数据。该api不是laravel,它是一个外部服务!

现在我想用 laravel(框架版本 7.3.0)创建一个网站,但我不知道如何正确实现 api 调用。

例如:我想要一个自定义用户提供程序,用户可以通过它登录网站。但是提供的凭据的验证是由 api 而不是 laravel 完成的。

我该怎么做?

【问题讨论】:

这不是“代替”的情况。您的 REST API 访问数据库。 没错。我现在应该通过删除原文的某些部分来澄清这一点。 【参考方案1】:

只需通过“php artisan make:controller ControllerName”创建一个注册控制器和一个登录控制器,并在那里编写身份验证逻辑。

在以前的 Laravel 版本中,你有一个类似“php artisan make:auth”的命令,它可以完成这些操作所需的一切。但是在 Laravel 7.0 中,你需要安装一个名为 laravel/ui 的包。

运行"composer required laravel/ui" 安装该软件包 然后运行“php artisan ui bootstrap --auth” 现在,您可以运行“php artisan make:auth”

此命令将为您完成整个注册(注册)和登录系统。

为了使用 REST,您可能需要了解 REST (Http) 动词。了解 GET、POST、PUT、PATH、DELETE 请求以及如何使用 PHP 和 Laravel 收集方法发出这些请求。了解 JSON 解析、编码和解码。然后您可以轻松地使用 REST。并且在没有来自其他包的任何模板代码的情况下工作。

非常感谢。我希望这个答案能给你一些新的信息/想法。再次感谢。

【讨论】:

感谢您的评论。 api也是我写的,所以我知道我在做什么..至少有点。正如 omar 正确提到的那样,我坚持如何用 laravel 实现它。所以我会看一下护照。【参考方案2】:

编辑:

这可能不是最好的方法。但这就是我当时所做的。我尝试 curl 和 guzzle 使用会话 cookie 和标头中的所有内容构建请求,使其看起来像来自 Web 浏览器的请求。无法让它工作。

我将 Web 套接字的通道 ID 用于我希望发生更改并将其与其他内容连接起来的浏览器,然后使用 encrypt($string) 对其进行加密。之后,我使用加密字符串生成二维码。

移动应用程序(已作为经过身份验证的用户登录)扫描它并使用该 QR 字符串和其他数据发出发布请求。 Passport 负责此请求的身份验证部分。解密 QR 字符串后,我得到了网络套接字的频道 ID。

然后我在该频道中使用适当的事件数据进行广播。在浏览器中捕获该广播并使用 javascript 重新加载该页面。

/*... processing other data ...*/     
$broadcastService = new BroadcastService();
$broadcastService->trigger($channelId, $eventName, encrypt($$data));
/*... returned response to the mobile app...*/

我的广播服务:

namespace App\Services;

use Illuminate\Support\Facades\Log;
use Pusher\Pusher;
use Pusher\PusherException;

class BroadcastService 
    public $broadcast = null;

    public function __construct() 
        $config = config('broadcasting.connections.pusher');
        try 
            $this->broadcast = new Pusher($config['key'], $config['secret'], $config['app_id'], $config['options']);
         catch (PusherException $e) 
            Log::info($e->getMessage());
        
    

    public function trigger($channel, $event, $data) 
        $this->broadcast->trigger($channel, $event, $data);
    

在我看来:

<script src="asset('assets/js/pusher.js')"></script>
<script src="asset('assets/js/app.js')" ></script>
<script>
    <?php
    use Illuminate\Support\Facades\Cookie;
    $channel = 'Channel id';
    ?>
    Echo.channel('$channel')
        .listen('.myEvent' , data => 
            // processing data
            window.location.reload();
        );
</script>

我为此使用了Laravel Echo。

同样,这不是最好的方法。这对我来说正好适用于该特定功能。

可能有很多更好的方法可以做到这一点。如果有人知道更好的方法,请告诉我。


据我了解,您希望通过 REST 实现用户创建和身份验证。然后从数据库中检索数据。如果我错了,请纠正我。

而且我猜您已经知道如何使用令牌通过 API 进行通信。你只是被如何用 laravel 实现它所困。

您可以使用 Laravel Passport 进行身份验证部分。它有很好的documentation。

另外,利用这个medium article。它将帮助您逐步完成整个过程。

【讨论】:

感谢您的回答。正如我在文档中看到的那样,护照充当服务器。但我已经有一个 api。所以我需要的是 laravel 充当客户端,例如,当用户登录时获取 jwt 令牌,然后用用户数据填充会话并存储令牌以供以后使用,直到用户注销。 那么,您只是想从 API 访问网络会话? 是的。该网站用于向用户显示信息并允许他更改其数据。但是所有这些事情都需要通过api来完成。 问题是 auth 守卫是不同的。 API 的身份验证保护是“api”,会话是“web”。前段时间我也遇到了同样的问题,在这里问了一个问题。不幸的是,我无法得到任何答案。所做的是,我再次从 API 调用 Web 以使用特定会话重新加载页面来克服这个问题。如果你愿意,我可以在单独的答案中添加。 我还使用 WebSocket 进行重新加载。

以上是关于Laravel 7 - 使用 REST API 而不是数据库的主要内容,如果未能解决你的问题,请参考以下文章

php 使用Passport进行Laravel REST API身份验证:https://www.cloudways.com/blog/rest-api-laravel-passport-authen

Laravel 5 REST API

Laravel REST API - 无限循环

使用 curl - JSON 访问 Laravel Rest API

如何使用 Laravel 5.3 创建 REST 完整 Web 服务的 Api

如何在 laravel 中使用社交名流和护照创建 REST API