Flutter网络请求简化插件rest_simplified的使用

Flutter网络请求简化插件rest_simplified的使用

Rest Simplified 是一个帮助访问 RESTful 后端的简单库。当前版本处于实验阶段,不建议在生产环境中使用。

示例

以下是一个用于测试的示例:

RestSimplified rs = RestSimplified.build('https://catfact.ninja');
rs.addFromJsonMapParser<CatFact>(CatFactJsonMapper());
rs.addPath<CatFact>(Method.get, '/fact');

ServiceResult result = await rs.getRestAccessor().get<CatFact>();
expect(result.httpCode, 200);

CatFact catFact = result.entity;

expect(catFact.fact!.length, catFact.length);
print(catFact.fact);

简单的REST GET示例

void getExampleCall() async {
  // 初始化 RestSimplified 实例并设置基础URL
  RestSimplified rs = RestSimplified.build('https://catfact.ninja');
  
  // 添加从JSON映射解析器
  rs.addFromJsonMapParser<CatFact>(CatFactJsonMapper());
  
  // 添加路径和HTTP方法
  rs.addPath<CatFact>(Method.get, '/fact');

  // 发起GET请求并获取结果
  ServiceResult result = await rs.getRestAccessor().get<CatFact>();

  // 解析返回的对象
  CatFact catFact = result.entity;
  print(catFact.fact); // 打印事实内容
  print(catFact.length); // 打印事实长度
}

// 定义 CatFact 类
class CatFact {
  String? fact;
  int? length;
}

// 定义 CatFactJsonMapper 类实现 FromJsonParser 接口
class CatFactJsonMapper implements FromJsonParser {
  [@override](/user/override)
  List toList(json) {
    // 不处理列表
    throw UnimplementedError();
  }

  [@override](/user/override)
  toObject(Map<String, dynamic> json) {
    CatFact fact = CatFact();
    fact.fact = json['fact']; // 设置事实内容
    fact.length = json['length']; // 设置事实长度
    return fact;
  }
}

使用POST请求进行登录然后GET请求以显示一些信息

// 定义 JSONContentHeader 类实现 HeaderBuilder 接口
class JSONContentHeader implements HeaderBuilder {
  [@override](/user/override)
  Map<String, String> get() {
    Map<String, String> header = {};
    header['Content-Type'] = 'application/json'; // 根据服务器需求添加 Content-Type 头
    return header;
  }
}

// 定义 RestFactory 类
class RestFactory {
  static final RestSimplified rest = RestSimplified.build(
      'http://localhost:3000',
      defaultHeaderBuilder: JSONContentHeader());

  // 初始化方法,在 main.dart 中调用
  static void init() {
    rest.addFromJsonMapParser<UserDTO>(UserJsonToUser());
    rest.addToJsonMapParser<SigninDTO>(SigninToJson());
    
    // 添加路径和HTTP方法
    rest.addPath<SigninDTO>(Method.post, '/users/signin');
    rest.addPath<UserDTO>(Method.get, '/users/whoami/');
  }
}

// 定义 SigninDTO 类
class SigninDTO {
  String email;
  String password;
  SigninDTO(this.email, this.password);
}

// 定义 UserDTO 类
class UserDTO {
  String? email;
  String? recoveryEmail;
  String? publicKey;
}

// 定义 SigninToJson 类实现 ToJsonMapParser 接口
class SigninToJson extends ToJsonMapParser<SigninDTO> {
  [@override](/user/override)
  Map<String, String> toMap(SigninDTO dto) {
    Map<String, String> map = {};
    map['email'] = dto.email;
    map['password'] = dto.password;
    return map;
  }
}

// 定义 UserJsonToUser 类实现 FromJsonParser 接口
class UserJsonToUser extends FromJsonParser<UserDTO> {
  [@override](/user/override)
  UserDTO toObject(Map<String, dynamic> json) {
    UserDTO user = UserDTO();
    user.email = json['email'];
    user.recoveryEmail = json['recoveryEmail'];
    user.publicKey = json['publicKey'];
    return user;
  }
}

// 在登录小部件中调用登录方法
void _call(Map<String, dynamic> form) {
  SigninDTO signin = SigninDTO(form['email'], form['password']);
  Future<ServiceResult> result = RestFactory.rest
      .getRestAccessor()
      .post<SigninDTO, UserDTO>(signin, headerBuilder: JSONHeader());
  result.then((value) => _handleResponse(value.entity, value.headers));
}

void _handleResponse(UserDTO entity, Map<String, String> headers) {
  // 进行额外的检查
  SimpleRouter.forwardAndRemoveAll(const WhoAmIPage()); // 示例使用 SimpleRouter
}

// 在显示用户信息的小部件中
[@override](/user/override)
void initState() {
  // 发起GET请求获取用户信息
  Future<ServiceResult> whoami =
  RestFactory.rest.getRestAccessor().get<UserDTO>();
  whoami.then((value) => _handleResult(value.entity));
  super.initState();
}

void _handleResult(UserDTO user) {
  // 更新屏幕上的字段值
  setState(() {
    _email = user.email ?? '';
    _recoveryEmail = user.recoveryEmail ?? '';
    _publicKey = user.publicKey ?? '';
    _loading = false;
  });
}

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

1 回复

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


rest_simplified 是一个用于简化 Flutter 网络请求的插件。它旨在让开发者能够更轻松地进行 HTTP 请求,而无需处理复杂的配置和回调。以下是如何使用 rest_simplified 进行网络请求的基本步骤。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 rest_simplified 依赖:

dependencies:
  flutter:
    sdk: flutter
  rest_simplified: ^1.0.0  # 请使用最新版本

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

2. 导入包

在需要使用 rest_simplified 的 Dart 文件中导入包:

import 'package:rest_simplified/rest_simplified.dart';

3. 发起 GET 请求

使用 RestSimplified 发起一个简单的 GET 请求:

void fetchData() async {
  try {
    var response = await RestSimplified.get('https://jsonplaceholder.typicode.com/posts');
    print('Response data: ${response.body}');
  } catch (e) {
    print('Error: $e');
  }
}

4. 发起 POST 请求

使用 RestSimplified 发起一个 POST 请求:

void postData() async {
  var data = {
    'title': 'foo',
    'body': 'bar',
    'userId': 1,
  };

  try {
    var response = await RestSimplified.post(
      'https://jsonplaceholder.typicode.com/posts',
      body: data,
    );
    print('Response data: ${response.body}');
  } catch (e) {
    print('Error: $e');
  }
}

5. 发起 PUT 请求

使用 RestSimplified 发起一个 PUT 请求:

void updateData() async {
  var data = {
    'id': 1,
    'title': 'foo',
    'body': 'bar',
    'userId': 1,
  };

  try {
    var response = await RestSimplified.put(
      'https://jsonplaceholder.typicode.com/posts/1',
      body: data,
    );
    print('Response data: ${response.body}');
  } catch (e) {
    print('Error: $e');
  }
}

6. 发起 DELETE 请求

使用 RestSimplified 发起一个 DELETE 请求:

void deleteData() async {
  try {
    var response = await RestSimplified.delete('https://jsonplaceholder.typicode.com/posts/1');
    print('Response status: ${response.statusCode}');
  } catch (e) {
    print('Error: $e');
  }
}

7. 处理响应

RestSimplified 返回的响应对象包含以下属性:

  • statusCode: 响应的状态码。
  • body: 响应的主体内容(通常是 JSON 字符串)。
  • headers: 响应的头部信息。

你可以根据需要对响应进行处理,例如解析 JSON 数据:

void fetchAndParseData() async {
  try {
    var response = await RestSimplified.get('https://jsonplaceholder.typicode.com/posts');
    var jsonData = jsonDecode(response.body);
    print('Parsed data: $jsonData');
  } catch (e) {
    print('Error: $e');
  }
}

8. 设置请求头

你可以在请求时设置自定义的请求头:

void fetchWithHeaders() async {
  var headers = {
    'Authorization': 'Bearer your_token_here',
  };

  try {
    var response = await RestSimplified.get(
      'https://jsonplaceholder.typicode.com/posts',
      headers: headers,
    );
    print('Response data: ${response.body}');
  } catch (e) {
    print('Error: $e');
  }
}

9. 处理错误

RestSimplified 会抛出异常来处理网络请求中的错误。你可以使用 try-catch 来捕获并处理这些错误:

void fetchDataWithErrorHandling() async {
  try {
    var response = await RestSimplified.get('https://jsonplaceholder.typicode.com/invalid-url');
    print('Response data: ${response.body}');
  } on RestSimplifiedException catch (e) {
    print('Error: ${e.message}');
  } catch (e) {
    print('Unexpected error: $e');
  }
}

10. 配置全局设置(可选)

你可以配置全局的 RestSimplified 设置,例如设置全局的请求头或超时时间:

void configureGlobalSettings() {
  RestSimplified.configure(
    baseUrl: 'https://jsonplaceholder.typicode.com',
    headers: {
      'Authorization': 'Bearer your_token_here',
    },
    timeout: Duration(seconds: 30),
  );
}
回到顶部