【问题标题】:Multiple API calls in one controller/action laravel一个控制器/动作 laravel 中的多个 API 调用
【发布时间】:2022-01-01 01:00:30
【问题描述】:

我正在开发一个 laravel 项目,我需要在其中显示来自 API 的列表和统计信息。对于统计信息和内容列表,有单独的 URL。而且我必须将两者都显示在一个页面上。

如何在一个页面上调用多个 API URL? 假设 https://localhost/api/games 和 https://localhost/api/stats 是两个 URL。

我正在使用 Laravel 版本 7 PHP版本 7.2.3

这里是控制器:

public function index()
    {
        $collection = Http::withHeaders([
            'x-api-host' => $host,
            'x-api-key' => $key
        ])->get('https://localhost/api/games');
        return view('welcome', ['collection'=>$collection]);
    }

【问题讨论】:

  • 不确定问题到底出在哪里,只需创建第二个对 https://localhost/api/stats 的 HTTP 调用,命名它,例如$collectionStats

标签: php laravel api laravel-http-client


【解决方案1】:

同步调用

你可以在第一个 api 之后调用第二个 api

public function index()
    {
        $collection = Http::withHeaders([
            'x-api-host' => $host,
            'x-api-key' => $key
        ])->get('https://localhost/api/games');
        $stats = Http::withHeaders([
            'x-api-host' => $host,
            'x-api-key' => $key
        ])->get('https://localhost/api/stats');
        return view('welcome', ['collection'=>$collection, 'stats'=>$stats]);
    }

在这种情况下,第二个 http 请求将在您的第一个请求被解析为响应后发送

异步调用

因为您可能正在寻找异步调用(在第一个响应之前发送 http 请求调用)。

Laravel 不是这样做的好选择。 但是您可以通过以下方案实现此目的:

  1. 安装 websocket 提供程序包(如 socket.io)
  2. 为每个请求定义 Queable 作业 (gamesCallJob & statCallJob)
  3. 为每个分辨率创建事件 (gameCallREsolveEvent & statCallREsolveEvent)
  4. 省略每个作业的handle方法中的事件。
  5. 为每个侦听器定义一个侦听器:在侦听器中,您可以检查是否所有事件都已解决(您可以使用缓存服务器或数据库表来保存已解决的事件)然后将数据发送给用户
  6. 在控制器中,只需将作业分派到队列,然后启动 websocket 通道

您可能已经注意到,Laravel 不是调用的好选择 这些调用是异步的

【讨论】:

    【解决方案2】:

    正如 esel 所说,再做一次吧:

    public function index()
        {
            $collection = Http::withHeaders([
                'x-api-host' => $host,
                'x-api-key' => $key
            ])->get('https://localhost/api/games');
    
            $collection2 = Http::withHeaders([
                'x-api-host' => $host,
                'x-api-key' => $key
            ])->get('https://localhost/api/stats');
    
            return view('welcome', ['collection'=>$collection,'collection2'=>$collection2]);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-14
      • 1970-01-01
      • 2010-09-29
      • 2011-08-11
      • 1970-01-01
      • 2013-10-16
      • 1970-01-01
      相关资源
      最近更新 更多