Flutter网络请求插件fnx_rest的使用

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

Flutter网络请求插件fnx_rest的使用

fnx_rest 是一组REST工具,适用于Dart 2 / Angular。该插件旨在为开发者和Angular用户提供便利,特别适用于创建具有大量相似API调用的CRUD应用。

示例

import 'package:fnx_rest/fnx_rest_io.dart';

void main() async {
  // 初始化你的REST API客户端
  RestClient apiRoot = IoRestClient.root(
      'https://jsonplaceholder.typicode.com'); // 在浏览器中使用BrowserRestClient

  // 配置全局头信息
  apiRoot.setHeader('Authorization', 'FacelessMan');

  // 按照服务器端的端点结构...
  var apiUsers = apiRoot.child('/users');
  print(apiUsers.url);
  var rr = await apiUsers.get();
  if (!rr.success) rr.throwError();
  print(rr.data);

  // 按照服务器端的端点结构...
  var myApiUser = apiUsers.child('/1');
  print(myApiUser.url);
  rr = await myApiUser.get();
  if (!rr.success) rr.throwError();
  print(rr.data);

  // 自定义数据处理
  // var myApiUserPhoto = myApiUser.child("/photo");
  // myApiUserPhoto.acceptsBinary("image/png");
}

Angular支持

你可以定义一个根REST客户端,并添加API密钥和其他附加头信息。然后通过Angular的依赖注入将此根客户端注入到你的组件和服务中。

import 'package:fnx_rest/fnx_rest_io.dart';

RestClient apiRoot = IoRestClient.root(
    'https://jsonplaceholder.typicode.com'); // 在浏览器中使用BrowserRestClient

// 你的组件
class MyApp {
  RestClient restRoot;
  MyApp(this.restRoot);
}

// 添加自定义头信息,例如用户登录后
apiRoot.setHeader("Authorization", "authKey");

(参见Angular文档以获取依赖注入的详细信息)

RestClient 是分层的:

RestClient apiRoot = IoRestClient.root('/api/v1'); // /api/v1
RestClient apiUsers = apiRoot.child('/users'); // /api/v1/users
RestClient john = apiUsers.child('/123'); // /api/v1/users/123

所有子节点继承父节点的配置,但允许覆盖这些配置。

RestClient 支持查询参数:

RestClient limitedUsers = apiUsers.setParam('limit', '1000'); // /api/v1/users?limit=1000

通常你会在组件中创建一个根REST客户端的子类,如下所示:

class UserManagement {
  RestClient users;
  UserManagement(RestClient root) {
    users = root.child('/users'); // 端点 /api/v1/users
  }
}

每个RestClient 实例都有一个布尔属性 working,用于指示当前是否正在处理请求/响应。你可以使用它来向用户显示“正在处理”的状态:

<p *ngIf="users.working">发送用户数据到服务器...</p>

此属性会递归传播到客户端的父级,因此你可以在任何级别指示这种“正在处理”的状态。可以局部(例如表单)或全局(例如整个应用)进行指示。

HTTP方法

RestClient 包含以下方法:

Future<RestResult> get({dynamic data, Map<String, String> headers});
Future<RestResult> post(dynamic data, {Map<String, String> headers});
Future<RestResult> put(dynamic data, {Map<String, String> headers});
Future<RestResult> delete({dynamic data, Map<String, String> headers});
Future<RestResult> head({Map<String, String> headers});

使用可选参数 headers 来指定仅在此调用中需要的自定义头信息。这些头信息会与你的 RestClient 默认头信息及其父级头信息等合并,直到根 RestClient

不要使用此参数来指定 Content-TypeAccept 头信息,参见下方说明。

RestResult

每次调用都会返回 Future<RestResult>RestResult 包含 status(HTTP状态,整数)和已转换为你所需类型的 data(默认为Dart Map或List)。

请求/响应序列化

默认情况下,根客户端配置为生产和消费JSON,并且将Dart Maps和Lists转换为这些类型。

你可以轻松地自定义此行为,以接受或生成任何二进制数据:

RestClient img = apiRoot.child('/images'); // /api/v1/images
img.acceptsBinary("image/png");
img.producesBinary("image/png");

此类数据将以 List<int> 形式发送和接收。

你还可以注入所需的任何自定义序列化或反序列化:

/*
typedef Serializer = dynamic Function(dynamic payload, Map<String, String> requestHeaders);
typedef Deserializer = dynamic Function(Response response);
*/

client.accepts("text/csv", myCsvDeserializer);
client.produces("text/csv", myCsvSerializer);

更多关于Flutter网络请求插件fnx_rest的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网络请求插件fnx_rest的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用Flutter网络请求插件fnx_rest的代码案例。假设你已经在Flutter项目中添加了fnx_rest依赖并完成了必要的配置。

首先,确保在你的pubspec.yaml文件中添加fnx_rest依赖:

dependencies:
  flutter:
    sdk: flutter
  fnx_rest: ^最新版本号

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

接下来,让我们编写一些代码来展示如何使用fnx_rest进行网络请求。

1. 导入必要的包

在你的Dart文件中,比如main.dart,首先导入fnx_rest包:

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

2. 配置API客户端

你可以创建一个全局的API客户端实例,以便在整个应用中复用:

final apiClient = ApiClient(
  baseUrl: 'https://api.example.com', // 替换为你的API基础URL
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer YOUR_ACCESS_TOKEN', // 如果需要身份验证,请添加令牌
  },
);

3. 发送GET请求

下面是一个发送GET请求并处理响应的例子:

void fetchData() async {
  try {
    var response = await apiClient.get('/endpoint'); // 替换为你的API端点
    if (response.statusCode == 200) {
      var data = response.data; // 解析响应数据
      print(data); // 打印到控制台,或者更新UI
    } else {
      print('Error: ${response.statusCode}');
    }
  } catch (e) {
    print('An error occurred: $e');
  }
}

4. 发送POST请求

下面是一个发送POST请求并附带JSON数据的例子:

void postData() async {
  var body = {
    'key1': 'value1',
    'key2': 'value2',
  };

  try {
    var response = await apiClient.post('/endpoint', body: body); // 替换为你的API端点
    if (response.statusCode == 201) {
      var data = response.data; // 解析响应数据
      print(data); // 打印到控制台,或者更新UI
    } else {
      print('Error: ${response.statusCode}');
    }
  } catch (e) {
    print('An error occurred: $e');
  }
}

5. 在Flutter组件中使用

你可以将上述网络请求函数放在Flutter组件的某个事件处理函数中,比如按钮点击事件:

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter fnx_rest Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: fetchData,
                child: Text('Fetch Data'),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: postData,
                child: Text('Post Data'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

在这个例子中,我们创建了两个按钮,分别用于触发GET和POST请求。你可以根据实际需求调整这些请求的细节,比如URL、请求头和请求体。

注意事项

  • 确保你的API端点和请求数据格式正确。
  • 处理网络错误和异常,以提升用户体验。
  • 遵循API文档和最佳实践进行请求和响应处理。

这样,你就可以在Flutter应用中使用fnx_rest插件进行网络请求了。

回到顶部