Flutter通信连接插件daktela_connector的使用

发布于 1周前 作者 eggper 来自 Flutter

Daktela V6 Dart Connector

Daktela V6 Dart Connector 是一个库,使您的 Dart/Flutter 应用程序能够连接到您的 Daktela V6 REST API。此连接器要求您已经购买、安装并准备好使用 Daktela Contact Centre 应用程序。Daktela Contact Centre 是一个应用程序,允许通过各种渠道(例如电话、电子邮件、网络聊天、短信或社交媒体)处理所有客户通信。

设置

连接器需要以下先决条件:

  • 实例 URL 的形式为 https://URL/
  • 每次访问 Daktela V6 REST API 所需的访问令牌,基于所需的权限

使用方法

DaktelaConnector 是一个单例类,允许您在 Daktela 服务器上发送 CRUD 请求。 它需要一个配置类 DaktelaConnectorConfig 的实例,其中必须至少指定实例 URL,并且大多数情况下可能还需要设置用户的访问令牌。其他选项如下所示。

DaktelaConnectorConfig

DaktelaConnector 的配置选项:

  • url - 实例的 URL(必需),例如 ‘my.daktela.com’,
  • accessToken - 用户用于身份验证的访问令牌,
  • timeout - 请求超时时间(默认:10 秒),
  • longPollingTimeout - 如果实现自定义应用拉取数据工作者,可以设置长轮询请求的超时时间(默认:30 秒),
  • userAgent - 应用的用户代理,
  • cookieAuth - 允许您通过 cookie 对请求进行身份验证(默认值为 false,在这种情况下,访问令牌将添加到请求的查询参数中),
  • logger - DaktelaLogger 的实例,允许您实现自定义日志记录方法,
  • errors - DaktelaErrorMessages 的实例,用于覆盖连接器定义的默认错误消息。
var logger = DaktelaLogger(
  callback: (String message, {Object? error, DaktelaLogLevel? logLevel, StackTrace? stackTrace}) {
    print(message); // 打印消息
    if (error != null) {
      print('Error:  $error'); // 打印错误信息
    }
    if (stackTrace != null) {
      print('StackTrace:  $stackTrace'); // 打印堆栈跟踪
    }
  },
);

var config = DaktelaConnectorConfig(
  url: 'my.daktela.com', // 实例 URL
  accessToken: 'e10adc3949ba59abbe56e057f20f883e', // 访问令牌
  userAgent: 'MyDaktelaClient-1.0.0', // 用户代理
  cookieAuth: true, // 使用 cookie 身份验证
  logger: logger, // 自定义日志记录器
  errors: DaktelaErrorMessages(general: 'Ooops'), // 自定义错误消息
);
DaktelaConnector

该类允许您调用 GET、POST、PUT 或 DELETE 请求。有两个必要步骤:

  1. 通过 getter instance 获取 DaktelaConnector 的实例,
  2. 通过 setter config 设置 DaktelaConnectorConfig 的实例。

然后您可以调用 getpostputdelete 方法,这些方法使用标准的 HTTP 方法。 方法参数:

  • endpoint - 端点名称(必需),例如 ‘tickets.json’
  • query - 查询参数的映射(Map<String, dynamic>),建议使用 DaktelaQueryMap 构建请求的查询,
  • payload - POST 或 PUT 请求的有效负载映射(Map<String, dynamic>),
  • nestedDecoding - 响应解码标志(默认为 true,表示标准响应解码),
  • internalEndpoint - 标志,用于使用 /internal 端点前缀而不是标准的 /api/v6(默认:false),
  • longPollingRequest - 标志,用于使用长轮询请求超时(默认:false)。

来自服务器的标准响应是 DaktelaResponse 的实例,具有属性 statusCodeint)、resultdynamic)和 totalint?)。

请求可能会抛出异常 DaktelaException 或其子类(DaktelaUnauthorizedExceptionDaktelaNotFoundException)。

var connector = DaktelaConnector.instance..config = config;

String? accessToken;
try {
  var r = await connector.post('login.json', payload: {
    'username': 'user_1',
    'password': 'password_1',
    'only_token': '1',
  });
  accessToken = r.result as String; // 获取访问令牌
} catch (e) {
  print(e); // 打印异常
}
排序、分页和过滤

在处理较大的数据量时,可以使用分页、排序、过滤和字段投影。可以通过 DaktelaQueryMap 及其静态方法 build 创建查询参数的映射,参数包括:

  • DaktelaFilter? filter - 过滤定义类,由原子字段部分(DaktelaFilterField 的实例)组成,
  • DaktelaSort? sort - 简单的类,用于按一个或多个字段对数据进行排序。它也由原子部分组成(DaktelaSort 的实例),
  • DaktelaPagination? pagination - 当您想批量动态加载数据时很有用,
  • String? search - 对于某些端点,可以使用全文搜索,
  • List<String>? fields - 允许您指定应返回的模型字段。

请求 Tickets 模型的复杂示例,带有查询参数:

var r = await connector.get(
  'tickets.json',
  queryParameters: DaktelaQueryMap.build(
      pagination: DaktelaPagination(take: 3), // 分页
      fields: ['name', 'title', 'category', 'user'], // 返回字段
      filter: DaktelaFilter.simple(DaktelaFilterField(field: 'stage', operator: 'eq', value: ['CLOSE'])), // 过滤条件
      sort: DaktelaSort.simple(DaktelaSortField(field: 'edited', direction: 'desc')), // 排序
  ),
);
示例

请参阅 example/example.dart 中的简单使用示例。在那里您会找到:

  • 通过 DaktelaLogger 定制日志记录,
  • 获取访问令牌(登录),
  • tickets.json 端点上的请求以及 DaktelaQueryMap 的示例用法。
import 'package:daktela_connector/daktela_connector.dart';

void main() async {
  const instance = 'mydaktela.daktela.com'; // 实例 URL

  var logger = DaktelaLogger(
    callback: (String message, {Object? error, DaktelaLogLevel? logLevel, StackTrace? stackTrace}) {
      print(message); // 打印消息
      if (error != null) {
        print('Error:  $error'); // 打印错误信息
      }
      if (stackTrace != null) {
        print('StackTrace:  $stackTrace'); // 打印堆栈跟踪
      }
    },
  );

  var config = DaktelaConnectorConfig(
    url: instance, // 配置实例 URL
  );

  var connector = DaktelaConnector.instance..config = config;

  String? accessToken;
  try {
    // 获取用户的访问令牌
    var r = await connector.post('login.json', payload: {
      'username': 'user_1',
      'password': 'password_1',
      'only_token': '1',
    });
    accessToken = r.result as String;
    print(r.result); // 打印访问令牌
  } on DaktelaException catch (e) {
    print(e); // 打印异常
  }

  if (accessToken != null) {
    config = DaktelaConnectorConfig(
      url: instance,
      accessToken: accessToken, // 设置访问令牌
      logger: logger, // 设置日志记录器
      errors: DaktelaErrorMessages(general: 'Ooops'), // 设置错误消息
    );

    connector = DaktelaConnector.instance..config = config;
    try {
      // 获取用户的静态信息
      var r = await connector.get('whoim.json');
      print(r.result['user']['title']); // 打印用户标题

      // 获取最近 3 条未关闭的工单(按编辑时间降序排列)
      r = await connector.get(
        'tickets.json',
        queryParameters: DaktelaQueryMap.build(
          pagination: DaktelaPagination(take: 3), // 分页
          fields: ['name', 'title', 'category', 'user'], // 返回字段
          filter: DaktelaFilter.simple(DaktelaFilterField(field: 'stage', operator: 'eq', value: ['CLOSE'])), // 过滤条件
          sort: DaktelaSort.simple(DaktelaSortField(field: 'edited', direction: 'desc')), // 排序
        ),
      );
      print('Tickets count: ${r.total}'); // 打印工单总数
      (r.result as List).forEach((e) {
        print('Ticket(name=${e['name']}, title=${e['title']}, category=${e['category']['title']}), user=${e['user'] != null ? e['user']['title'] : 'null'}'); // 打印每个工单的信息
      });
    } on DaktelaException catch (e) {
      print(e); // 打印异常
    }
  }
}

更多关于Flutter通信连接插件daktela_connector的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter通信连接插件daktela_connector的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用daktela_connector插件进行通信连接的示例代码。请注意,实际使用时需要确保已经正确安装并配置了daktela_connector插件。

首先,确保在pubspec.yaml文件中添加了daktela_connector依赖项:

dependencies:
  flutter:
    sdk: flutter
  daktela_connector: ^latest_version  # 请替换为实际的最新版本号

然后运行flutter pub get以安装依赖。

接下来,在您的Flutter应用中,您可以使用daktela_connector插件来建立和管理与Daktela平台的通信连接。以下是一个简单的示例代码,展示了如何初始化插件并进行基本的通信操作。

import 'package:flutter/material.dart';
import 'package:daktela_connector/daktela_connector.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Daktela Connector Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  DaktelaConnector? _daktelaConnector;
  String? _connectionStatus;

  @override
  void initState() {
    super.initState();
    initDaktelaConnector();
  }

  void initDaktelaConnector() async {
    // 初始化DaktelaConnector实例
    _daktelaConnector = DaktelaConnector(
      apiKey: 'YOUR_DAKTELA_API_KEY',  // 请替换为您的Daktela API密钥
      apiSecret: 'YOUR_DAKTELA_API_SECRET',  // 请替换为您的Daktela API密钥
      serverUrl: 'YOUR_DAKTELA_SERVER_URL',  // 请替换为您的Daktela服务器URL
    );

    // 监听连接状态变化
    _daktelaConnector!.onConnectionStatusChanged.listen((status) {
      setState(() {
        _connectionStatus = status;
      });
    });

    // 尝试连接
    await _daktelaConnector!.connect();
  }

  void makeCall() async {
    if (_daktelaConnector!.isConnected) {
      try {
        // 发起呼叫的示例参数,请根据实际情况调整
        var callResult = await _daktelaConnector!.makeCall(
          phoneNumber: 'TARGET_PHONE_NUMBER',  // 请替换为目标电话号码
          callerId: 'YOUR_CALLER_ID',  // 请替换为您的呼叫者ID
        );

        // 处理呼叫结果
        print('Call result: $callResult');
      } catch (e) {
        print('Error making call: $e');
      }
    } else {
      print('Not connected to Daktela server.');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Daktela Connector Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Connection Status: $_connectionStatus',
              style: TextStyle(fontSize: 18),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: makeCall,
              child: Text('Make Call'),
            ),
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    // 断开连接并释放资源
    _daktelaConnector?.disconnect();
    super.dispose();
  }
}

在这个示例中,我们:

  1. pubspec.yaml中添加了daktela_connector依赖。
  2. 创建了一个Flutter应用,并在MyHomePage组件中初始化了DaktelaConnector实例。
  3. 监听了连接状态变化,并在UI中显示了当前连接状态。
  4. 提供了一个按钮来发起呼叫,并处理了呼叫结果。
  5. dispose方法中断开了与Daktela服务器的连接。

请根据您的实际需求调整API密钥、服务器URL、电话号码等参数。同时,确保您已经阅读并理解了daktela_connector插件的文档,以便更好地使用该插件。

回到顶部