Flutter PrestaShop API交互插件prestashop_api的使用

Flutter PrestaShop API交互插件prestashop_api的使用

动机

这个包的故事始于一个简单的需要:在Flutter应用与PrestaShop网站之间无缝桥接。我发现现有的包不足以满足需求,因为即使集成它们后,我仍然需要:

  • 创建模型类以镜像API实体。
  • 处理数据的序列化和反序列化。
  • 手动构建API请求。
  • 解决API中的分页功能限制。
  • 理解API错误并创建定制异常。

实现所有这些任务可能会导致数百行代码,并增加出错的可能性。这些主要因素促使我从头开始创建了prestashop_api包。

prestashop_api包通过实现大部分这些功能来减轻这些负担,使你能够更专注于应用的功能。

让我们一起探索这个包的功能吧!

目录

特性

  • 本地化字段显示:以指定的语言显示本地化字段。
  • 字段显示选项:选择显示特定字段或所有字段。
  • 过滤数据:使用各种方法过滤数据。
  • 排序数据:根据指定字段和顺序对数据进行排序。
  • 限制结果和分页:限制返回的结果数量,作为总数量和从特定页面开始的数量。
  • 更多功能…

快速入门

与冗长的抽象解释相比,一个例子更能说明问题,因此这里是一个典型的请求以获取产品:

1. 添加到pubspec.yaml

dependencies:
  prestashop_api: ^0.1.1

2. 导入包

import 'package:prestashop_api/prestashop_api.dart';

3. 设置基本配置

final baseConfig = BaseConfig(
  baseUrl: 'www.your-website.com',
  apiKey: 'YOUR-API-KEY-XXXXXXXXX',
  protocol: Protocol.https,
);

4. 初始化PrestashopApi

final prestashop = PrestashopApi(baseConfig);

可选地,你可以配置PrestashopApi实例的Dio属性:

// 例如,设置自定义的 `connectTimeout` 的Dio
final customDio = Dio();
prestashop.dio = customDio..options.connectTimeout = const Duration(seconds: 5);

5. 调用PrestaShop API

try {
  // 例如,获取所有产品(主语言)
  final receivedProducts = await prestashop.getProducts(languageId: 1);

  // 打印以结构化的JSON格式的产品负载
  prettyPrint<Product>(
    tagText: 'Print all products',
    data: receivedProducts.entity,
    toJsonMap: productToJsonMap,
  );
} catch (e) {
  print('Exception caught: $e');
}

选项

当调用PrestaShop API时,你可以传递各种选项:

1. 显示字段

你可以选择显示特定字段或所有字段。如果不指定字段,则API将返回其定义的默认字段。

// 显示产品的 `id` 和 `name` 字段
const display = Display(
  displayFieldList: [
    ProductDisplayField.id,
    ProductDisplayField.name,
  ],
);

//
// 或者
//

// 显示产品的所有可用字段
const display = Display(
  displayFieldList: [
    ProductDisplayField.all,
  ],
);

2. 过滤数据

使用“filter”参数细化预期结果。以下是每种过滤方法的详细示例:

// 按匹配任何指定值过滤产品
final filter = Filter.anyOf(
  ProductFilterField.id,
  values: ['1', '5'],
);

// 按指定值区间过滤产品
final filter = Filter.between(
  ProductFilterField.id,
  begin: '1',
  end: '10',
);

// 按精确值过滤产品(不区分大小写)
final filter = Filter.equals(
  ProductFilterField.name,
  value: 'Wheels',
);

// 按前缀值过滤产品(不区分大小写)
final filter = Filter.beginsWith(
  ProductFilterField.name,
  value: 'Whe',
);

// 按后缀值过滤产品(不区分大小写)
final filter = Filter.endsWith(
  ProductFilterField.name,
  value: 'els',
);

// 按包含值过滤产品(不区分大小写)
final filter = Filter.contains(
  ProductFilterField.name,
  value: 'eel',
);

3. 排序数据

使用“sort”参数按你的偏好组织预期结果。

// 按 `id` 降序排列产品
final sort = Sort(
  sortFieldOrderList: [
    SortField.descending(ProductSortField.id),
  ],
);

//
// 或者
//

// 按 `id` 升序排列产品
final sort = Sort([
  SortField.ascending(ProductSortField.id),
]);

更多功能

但还有更多!prestashop_api 仍然有许多额外的功能。

1. 预定义模型

prestashop_api 提供预构建的模型类,这些类与PrestaShop API实体相匹配。你可以立即使用这些模型,无需手动创建它们。

2. 隐式序列化/反序列化

轻松检索和管理来自PrestaShop API的数据。prestashop_api 处理序列化和反序列化,使得数据在Dart对象和JSON表示之间无缝转换。

3. 增强查询精度

挑战

传统方式编写查询存在两个主要挑战:

  • 有限的字段支持 不是PrestaShop API中的所有字段都支持显示、过滤和排序功能。这增加了选择不支持字段的风险,导致API错误响应。

  • 复杂的语法 在URL查询中实现显示、过滤和排序功能需要遵循特定的结构规则。未能遵守这些约定可能导致API错误响应。

解决方案

为了解决这些挑战,prestashop_api 提供:

  • 内置功能字段 为每个受支持资源预定义用于显示、过滤和排序的字段,确保精确的查询构造,避免选择不受支持的字段的风险。

  • 标准化语法 预定义实现功能的语法简化了查询构造,减少了语法错误,并提高了查询的整体精度和可靠性。

4. 解决分页限制

PrestaShop v1.7 API中的分页功能在响应头中缺乏最大页码的信息,这使得难以确定分页数据请求中的下一页是否可用。为了解决这一限制,prestashop_api 提供了一个简单的解决方案。在fetch方法的响应中,你可以简单地检查布尔值isNextPageAvailable以确定是否有下一页。要查看此功能在代码中的简便集成,请参阅以下示例。

5. 预定义定制异常

prestashop_api 提供广泛的预定义异常,专门针对PrestaShop API。准备好处理常见错误和独特场景的异常,让你可以有信心地构建健壮的应用程序。

使用PrestashopApi示例

// 此文件为 "main.dart"
import 'package:prestashop_api/prestashop_api.dart';

Future<void> main() async {
  // 配置您的 `BaseConfig`
  final baseConfig = BaseConfig(
    baseUrl: 'www.your-website.com',
    apiKey: 'YOUR-API-KEY-XXXXXXXXX',
    protocol: Protocol.https,
  );

  // 使用基本配置初始化 `PrestashopApi`
  final prestashop = PrestashopApi(baseConfig);

  // 指定要显示的产品字段,如 `id` 和 `name`。如果为空,则默认只显示ID
  const display = Display(
    displayFieldList: [
      ProductDisplayField.id,
      ProductDisplayField.name,
    ],
  );

  // 设置过滤条件以获取ID在1到20之间的产品
  final filter = Filter.between(
    ProductFilterField.id,
    begin: '1',
    end: '20',
  );

  // 按名称降序排列产品
  final sort = Sort(
    sortFieldOrderList: [
      SortFieldOrder.descending(ProductSortField.name),
    ],
  );

  try {
    // 使用分页获取具有指定参数的产品
    final receivedProducts = await prestashop.getProductsPage(
      // 必需属性:设置用于产品数据检索的语言ID
      languageId: 1,
      // 必需属性:页码
      page: 2,
      // 必需属性:每页的产品数量
      perPage: 10,
      // 可选属性:过滤、显示和排序功能
      filter: filter,
      display: display,
      sort: sort,
    );
    
    print('A next page is available: ${receivedProducts.isNextPageAvailable}');

    // 以良好的格式打印检索到的产品数据
    prettyPrint<Product>(
      tagText: 'Products with IDs ranging from 11 to 20',
      data: receivedProducts.entity,
      toJsonMap: productToJsonMap,
    );
  } catch (e) {
    // 处理错误
    print('Error caught: $e');
  }
}

更多关于Flutter PrestaShop API交互插件prestashop_api的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter PrestaShop API交互插件prestashop_api的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用prestashop_api插件与PrestaShop API进行交互的代码示例。这个示例展示了如何初始化插件、认证用户以及获取一些基本数据(如产品列表)。

首先,确保你已经在pubspec.yaml文件中添加了prestashop_api依赖:

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

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

接下来是示例代码:

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  PrestaShopAPI? _prestashopAPI;
  bool _isAuthenticated = false;
  List<dynamic>? _products;

  @override
  void initState() {
    super.initState();
    // 初始化PrestaShop API客户端
    _prestashopAPI = PrestaShopAPI(
      baseUrl: 'https://your-prestashop-store.com/api/', // 替换为你的PrestaShop商店API URL
      key: 'YOUR_API_KEY', // 替换为你的API密钥
    );

    // 认证用户(假设你使用的是基本认证)
    _authenticateUser();
  }

  Future<void> _authenticateUser() async {
    try {
      // 这里假设使用用户名和密码进行基本认证
      // 如果你的API使用其他认证机制,请相应调整
      await _prestashopAPI!.authenticate(
        username: 'your-username', // 替换为你的用户名
        password: 'your-password', // 替换为你的密码
      );
      setState(() {
        _isAuthenticated = true;
      });

      // 认证成功后获取产品列表
      _getProducts();
    } catch (e) {
      print('Authentication failed: $e');
    }
  }

  Future<void> _getProducts() async {
    if (!_isAuthenticated) return;

    try {
      var response = await _prestashopAPI!.get(
        endpoint: 'products',
        params: {'display': 'full'}, // 根据需要调整参数
      );

      setState(() {
        _products = response['products'];
      });
    } catch (e) {
      print('Failed to fetch products: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('PrestaShop API Demo'),
        ),
        body: Center(
          child: _isAuthenticated
              ? _buildProductList()
              : CircularProgressIndicator(),
        ),
      ),
    );
  }

  Widget _buildProductList() {
    if (_products == null || _products!.isEmpty) {
      return Text('No products found.');
    }

    return ListView.builder(
      itemCount: _products!.length,
      itemBuilder: (context, index) {
        var product = _products![index];
        return ListTile(
          title: Text(product['name']['language'][${product['name']['language'].keys.first}] as String),
          subtitle: Text('ID: ${product['id']}'),
        );
      },
    );
  }
}

代码说明:

  1. 依赖安装:在pubspec.yaml文件中添加prestashop_api依赖。
  2. 初始化API客户端:在initState方法中初始化PrestaShopAPI实例,并设置API的基础URL和密钥。
  3. 用户认证:使用authenticate方法进行用户认证(这里假设使用基本认证)。认证成功后,将_isAuthenticated设置为true
  4. 获取产品列表:在认证成功后,调用get方法获取产品列表,并将结果存储在_products列表中。
  5. UI展示:在UI中显示一个加载指示器或产品列表,具体取决于认证状态和产品数据。

请注意,实际使用中你可能需要根据API的具体要求调整认证方式和请求参数。此外,确保你的API密钥、用户名和密码等敏感信息不会被泄露。

回到顶部