如何排队并存储 API 请求以便在互联网连接恢复后执行?

问题描述 投票:0回答:1

我正在努力为我的应用程序添加离线支持。我的需求是当用户失去互联网连接时,将API请求(包括标头、请求正文和端点)排队并临时存储,以便在连接恢复后可以自动执行。

有没有办法将整个 API 请求存储在队列中,并在用户恢复连接时触发它?

对于上下文,我使用 Dio 和 Retrofit 进行 API 调用。

android ios flutter dart rest
1个回答
0
投票

对于离线支持,我使用以下逻辑。我希望它有帮助。

将数据保存到本地存储时,每个模型都有一个名为

isSynced
的布尔字段。创建新模型时,
isSynced
应设置为
false
。数据同步后,将其更改为
true
。更新时应重复此过程:更改后将
isSynced
设置为
false
,并在更新与服务器同步后将其设置为
true

这就是它的工作逻辑。但是如何将数据同步到服务器呢?这是我在生产应用程序中使用的方法,带有一些虚拟数据。

首先,创建一个遵循我提到的规范的本地数据库模型。这是我们案例的示例模型:

class ExampleModel {
  ExampleModel({
    required this.title,
    required this.createdAt,
    required this.id,
    this.isActive=true,
    this.isSynced=false,
    this.deletedAt,
    this.updatedAt,
  });


  String id;

  String title;

  DateTime createdAt;

  DateTime? deletedAt;

  bool isSynced;

  DateTime? updatedAt;

  bool isActive;

}

您还需要创建一个管理器,定期检查本地数据库中的模型并同步尚未同步的模型。

这是一个可以为您完成此操作的简单管理器。从单一类管理此类操作是一种很好的方法,因为您将来可能需要添加额外的控制,例如仅针对高级用户等。

class SyncManager {

  Timer? _syncTimer;


  Future<void> syncUnsyncedDocuments() async {
    
    ///Here is a mock variable. In your case you can use related query unsynced document logic based on which local db you use.
    final unsyncedDocuments = [
      ExampleModel(title: 'Example 1',isSynced: false,createdAt: DateTime.now(),id: '1'),
      ExampleModel(title: 'Example 2',isSynced: false,createdAt: DateTime.now(),id: '2'),
      ExampleModel(title: 'Example 3',isSynced: false,createdAt: DateTime.now(),id: '3'),
    ];

    for (final doc in unsyncedDocuments) {
      final success = await _syncDocumentToServer(doc);
      if (success) {
        // Set isSynced flag to true and update it in the local db.
      }
    }
  }


  Future<bool> _syncDocumentToServer(ExampleModel doc) async {
    try {
      // Make your API call here to sync your function to the server. Return true if call is successful and false if not.
      return true;
    } catch (e) {
      return false;
    }
  }


  void startSyncing({Duration interval = const Duration(minutes: 5)}) {
    _syncTimer = Timer.periodic(interval, (timer) {
      syncUnsyncedDocuments();
    });
  }

  void stopSyncing() {
    _syncTimer?.cancel();
  }
}

您只需要调用

startSyncing
函数即可开始同步:)
我希望它有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.