首页 > 解决方案 > 如何在 Dart 中使用 Google Calendar API 批量插入事件列表?

问题描述

问题陈述

作为开发人员,我的要求是通过一次调用在 Google 日历中插入事件列表。

为什么是批处理?

正如这里提到的,它有助于减少网络开销并提高性能。

当前情景

使用googleapis包,我只能执行单个插入操作,如下面的片段所示:

var eventResponse = await _calendarApi.events
          .insert(event, calendarId, sendUpdates: 'all');

从开发的角度来看,多次调用此方法并不是一种有效的方法。此外,创建一个包含插入方法的数组Future并用于Future.wait()等待所有插入调用被执行,这将是一个坏主意,请参见下面的代码片段。

 Future<List<Event> insertEvents(List<Event> events) async {
    
    var _calendarApi = CalendarApi(_authClient);

    List<Future<Event>> _futureEvents = [];

    for (int i = 0; i < events.length; i++) {
      _futureEvents.add(_calendarApi.events.insert(events[i], calendarId));
    }

    var _eventResponse =
        await Future.wait(_futureEvents).catchError((e) => print(e));
    
    return _eventResponse;
  }

根据官方Google Blog,没有办法在 dart 中执行批处理操作。

有谁知道这个问题的更好的乐观解决方案?

标签: flutterdartgoogle-calendar-api

解决方案


如果您查看 Google 日历 api 文档中的events.insert,您会注意到它声明。

创建一个事件。

但是,可以选择使用批处理端点。您应该知道,批处理唯一可以为您节省的是来回的 HTTP 调用。批处理中的每个调用仍然计入您的配额,它不计入您的配额的单个请求。单个批处理请求中的调用次数限制为 50 个。

问题:根据官方谷歌博客,没有办法在 dart 中执行批处理操作。

如果您查看批处理指南,它会显示如何使用 HTTP 构建批处理请求。我会惊讶地发现你不能用颤振来做到这一点,而颤振能够发出 HTTP 请求。我也找不到任何让它工作的人。这可能只是意味着没有人愿意尝试,或者他们只是没有发布结果。

实际上,批处理博客文章指出 Dart 客户端库不支持批处理

Google API Dart 客户端库不支持这些功能。

这绝不意味着它根本不可能,它只是意味着你必须自己从头开始编写代码。

这值得么。

同样,除了 HTTP 请求发送限制之外,使用批处理几乎没有优势。您将需要决定是否值得您花时间尝试让它工作。IMO 不是,我已经使用这些 API 超过 11 年,我从未发现批处理非常稳定或值得它引起的恶化。

通过批处理,您往往会遇到更多的配额泛滥错误,因为您一次发送给许多请求的服务器内容,即使一次发送 5 个,在我的经验中也会导致泛滥错误,然后您必须返回并检查哪些是成功的再次发送。


推荐阅读