Flutter客户端通信插件drf_client的使用

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

Flutter客户端通信插件drf_client的使用

帮助您自动认证并存储令牌,并在需要时刷新它们,同时使用这些令牌进行API请求。

该项目仍在开发中。查看GitHub代码并贡献 👉 https://github.com/Otajonov/drf_client

特性

  • ✅ 自动使用Flutter安全存储存储令牌
  • ✅ 自动刷新令牌
  • ✅ 支持Django Oauth Toolkit的Oauth2
  • ✅ 使用身份验证凭据轻松调用REST API
  • ✅ 更多功能即将推出 …

开始使用

要开始使用此包,请将其添加到您的依赖项中,运行以下命令:

flutter pub add drf_client

或者,在您的pubspec.yaml文件下的dependencies部分添加以下行:

dependencies:  
  flutter:  
    sdk: flutter
  # your other dependencies ...
  
  drf_client: <latest_version>

然后在所需文件中导入该包:

import 'package:drf_client/drf_client.dart'; 

享受编码!

使用方法

首先,初始化配置:

void main() {
  // 现有代码

  DrfClient client = DrfClient();
  client.addConfig('your-app', DrfConfig(
    authType: AuthType.drfBuiltInAuth,
    baseUrl: 'https://your-app.com/api',
    tokenUrl: 'https://your-app.com/api/token',
    refreshTokenUrl: 'https://your-app.com/api/token/refresh',

    usernameField: 'username', // 默认用户名,如果您使用自定义用户模型,请更改此值
    passwordField: 'password', // 默认密码,如果您更改了用户模型中的密码字段,请更改此值
    refreshField: 'refresh_token', // 如果使用JWT,请根据您的令牌刷新逻辑更改此值

    // 如果使用Django-oauth-toolkit的授权码,请设置以下内容
    // oauthConfig: OauthConfig(
    //   clientId: "",
    //   clientSecret: "",
    //   authorizationEndpointUrl: "https://ilmchat.com/auth/authorize/",
    //   redirectScheme: 'you-app-shceme'
    // )
  ));
}

您可以设置多个配置,以便在同一代码中通过给定的应用名称对多个Django服务器进行请求和认证。

用户认证

通过drfBuiltInAuth进行认证:

DrfClient client = DrfClient();

client.loginDrfBuiltIn()

发起请求

DrfClient client = DrfClient();

client.get() // post() put() patch() delete()

如果已登录,它将使用存储的用户令牌进行请求。如果您不想在身份验证头中包含令牌,可以设置includeToken: false

完整示例Demo

以下是一个完整的示例,展示了如何使用drf_client插件进行用户认证和API请求:

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

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  DrfClient client = DrfClient();

  [@override](/user/override)
  void initState() {
    super.initState();
    // 初始化配置
    client.addConfig('your-app', DrfConfig(
      authType: AuthType.drfBuiltInAuth,
      baseUrl: 'https://your-app.com/api',
      tokenUrl: 'https://your-app.com/api/token',
      refreshTokenUrl: 'https://your-app.com/api/token/refresh',
      usernameField: 'username',
      passwordField: 'password',
      refreshField: 'refresh_token',
    ));

    // 登录
    client.loginDrfBuiltIn();
  }

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter应用中使用drf_client插件进行客户端通信的示例代码。drf_client通常用于与基于Django REST Framework (DRF) 后端进行通信。虽然具体的drf_client库可能并不广泛存在,但我们可以假设它类似于其他HTTP客户端库,比如diohttp,但具有一些特定于DRF的功能。以下是一个通用的示例,展示如何在Flutter中与DRF后端进行通信。

1. 添加依赖

首先,确保你的pubspec.yaml文件中包含了必要的HTTP客户端依赖,比如dio,因为drf_client可能是一个假想的库,这里我们使用dio作为替代:

dependencies:
  flutter:
    sdk: flutter
  dio: ^4.0.4  # 请检查最新版本

2. 导入库并配置Dio实例

在你的Dart文件中,导入dio库并配置一个Dio实例:

import 'package:dio/dio.dart';
import 'dart:convert';

class ApiService {
  final Dio _dio;

  ApiService({BaseOptions options})
      : _dio = Dio(options ?? BaseOptions(
            baseUrl: 'https://your-drf-backend.com/api/', // 替换为你的DRF后端URL
            connectTimeout: 5000,
            receiveTimeout: 3000,
          ));

  // 添加请求拦截器(可选)
  _dio.interceptors.add(
    InterceptorsWrapper(
      onRequest: (RequestOptions options) async {
        // 在发送请求之前做些什么,比如添加token
        options.headers['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN';
        return options;
      },
      onResponse: (Response response) async {
        // 对响应数据做点什么
        return response;
      },
      onError: (DioError err) async {
        // 对错误响应做点什么
        return err;
      },
    ),
  );

  // 示例:获取用户列表
  Future<List<Map<String, dynamic>>> getUsers() async {
    try {
      Response response = await _dio.get('/users/');
      if (response.statusCode == 200) {
        List<dynamic> body = response.data;
        return body.map((e) => Map<String, dynamic>.from(e)).toList();
      } else {
        throw Exception('Failed to load users');
      }
    } catch (e) {
      throw e;
    }
  }

  // 示例:创建新用户
  Future<Map<String, dynamic>> createUser(Map<String, dynamic> userData) async {
    try {
      Response response = await _dio.post('/users/', data: userData);
      if (response.statusCode == 201) {
        return Map<String, dynamic>.from(response.data);
      } else {
        throw Exception('Failed to create user');
      }
    } catch (e) {
      throw e;
    }
  }
}

3. 使用ApiService

在你的Flutter组件或页面中,使用ApiService类来与后端进行通信:

import 'package:flutter/material.dart';
import 'api_service.dart'; // 假设上面的代码保存在api_service.dart文件中

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter DRF Client'),
        ),
        body: UserListScreen(),
      ),
    );
  }
}

class UserListScreen extends StatefulWidget {
  @override
  _UserListScreenState createState() => _UserListScreenState();
}

class _UserListScreenState extends State<UserListScreen> {
  List<Map<String, dynamic>> users = [];

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

  Future<void> _loadUsers() async {
    ApiService apiService = ApiService();
    try {
      users = await apiService.getUsers();
      setState(() {});
    } catch (e) {
      print(e);
    }
  }

  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      itemCount: users.length,
      itemBuilder: (context, index) {
        Map<String, dynamic> user = users[index];
        return ListTile(
          title: Text(user['username'] ?? 'Unknown'),
          subtitle: Text(user['email'] ?? 'Unknown'),
        );
      },
    );
  }
}

注意

  • 上面的代码使用了dio库作为HTTP客户端,并展示了如何配置它以及如何发送GET和POST请求。
  • drf_client可能具有一些特定的功能或简化API,但基本的HTTP请求模式通常相似。
  • 确保你的DRF后端正确配置了CORS(跨源资源共享),以便Flutter前端可以与之通信。
  • 在实际项目中,你可能需要处理更多的错误情况、添加更多的API端点,以及实现更复杂的数据处理逻辑。

希望这个示例能帮助你理解如何在Flutter中与DRF后端进行通信!

回到顶部