Flutter网络请求插件rhttp的使用

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

Flutter网络请求插件rhttp的使用

简介

rhttp 是一个用于Flutter开发者的HTTP请求库,它利用Rust通过FFI(Foreign Function Interface)与Dart交互。这使得rhttp在性能上超越了Dart默认的HTTP客户端,并且支持更多高级特性如HTTP/2、HTTP/3、TLS 1.2和1.3等。

主要特点

  • 支持多种HTTP版本:HTTP/1, HTTP/1.1, HTTP/2, 和 HTTP/3
  • 支持TLS 1.2 和 TLS 1.3
  • 连接池和拦截器功能
  • 可选的重试机制
  • 证书固定
  • 代理支持
  • 自定义DNS解析
  • 强类型安全
  • DevTools集成(Network标签)

快速开始

安装

  1. 安装Rust:确保你已经安装了Rust(至少1.80.0版本),可以通过rustup进行安装。
  2. 配置Android环境:对于Android平台,需要安装命令行工具并确保NDK是最新的。
  3. 添加依赖:在项目的pubspec.yaml文件中添加rhttp依赖:
    dependencies:
      rhttp: ^0.3.0 # 请根据最新版本号调整
    

初始化

在应用启动时初始化rhttp

import 'package:rhttp/rhttp.dart';

void main() async {
  await Rhttp.init(); // 初始化rhttp
  runApp(MyApp());
}

基本用法

GET 请求示例

import 'package:rhttp/rhttp.dart';

void main() async {
  await Rhttp.init();
  
  try {
    HttpTextResponse response = await Rhttp.get('https://example.com');
    print('Status Code: ${response.statusCode}');
    print('Body: ${response.body}');
  } catch (e) {
    print('Error: $e');
  }
}

使用兼容层

如果你习惯于使用http包,可以使用RhttpCompatibleClient来保持API一致性:

import 'package:rhttp/rhttp.dart';
import 'package:http/http.dart' as http;

void main() async {
  await Rhttp.init();
  
  http.Client client = await RhttpCompatibleClient.create();
  http.Response response = await client.get(Uri.parse('https://example.com'));

  print(response.statusCode);
  print(response.body);
}

请求基础

HTTP 方法

可以使用不同的HTTP方法发起请求:

// 使用method参数指定方法
await Rhttp.requestText(method: HttpMethod.post, url: 'https://example.com');

// 或者直接调用对应的方法
await Rhttp.post('https://example.com');

查询参数

向URL添加查询参数:

await Rhttp.get('https://example.com', query: {'key': 'value'});

请求头

为请求添加头部信息:

await Rhttp.post(
  'https://example.com',
  headers: const HttpHeaders.map({
    HttpHeaderName.contentType: 'application/json',
  }),
);

请求体

支持多种形式的请求体:

  • 文本
    await Rhttp.post(
      'https://example.com',
      body: HttpBody.text('raw body'),
    );
    
  • JSON
    await Rhttp.post(
      'https://example.com',
      body: HttpBody.json({'key': 'value'}),
    );
    
  • 二进制数据
    await Rhttp.post(
      'https://example.com',
      body: HttpBody.bytes(Uint8List.fromList([0, 1, 2])),
    );
    
  • 流式传输
    await Rhttp.post(
      'https://example.com',
      body: HttpBody.stream(
        Stream.fromIterable([[1, 2, 3]]),
        length: 3,
      ),
    );
    
  • 表单数据
    await Rhttp.post(
      'https://example.com',
      body: HttpBody.form({'key': 'value'}),
    );
    
  • 多部分表单
    await Rhttp.post(
      'https://example.com',
      body: HttpBody.multipart({
        'name': const MultipartItem.text(text: 'Tom'),
        'profile_image': MultipartItem.bytes(
          bytes: Uint8List.fromList(bytes),
          fileName: 'image.jpeg',
        ),
      }),
    )
    

### 响应处理
根据预期响应类型选择合适的方法:
```dart
HttpTextResponse textResponse = await Rhttp.getText('https://example.com');
String responseBody = textResponse.body;

HttpBytesResponse bytesResponse = await Rhttp.getBytes('https://example.com');
Uint8List byteBody = bytesResponse.body;

HttpStreamResponse streamResponse = await Rhttp.getStream('https://example.com');
Stream<Uint8List> streamBody = streamResponse.body;

请求生命周期管理

取消请求

通过提供CancelToken可以在任何时候取消正在进行中的请求:

final cancelToken = CancelToken();
final request = Rhttp.get(
   'https://example.com',
   cancelToken: cancelToken,
);

// 取消请求
cancelToken.cancel();

try {
  await request; // 将抛出RhttpCancelException异常
} catch (e) {
  print(e);
}

监控进度

可以监听发送和接收过程中的进度:

final request = Rhttp.post(
  'https://example.com',
  body: HttpBody.bytes(bytes),
  onSendProgress: (sent, total) {
    print('Sent: $sent, Total: $total');
  },
  onReceiveProgress: (received, total) {
    print('Received: $received, Total: $total');
  },
);

高级设置

连接复用

创建并复用同一个客户端以提高性能:

final client = await RhttpClient.create();

await client.get('https://example.com');

client.dispose(); // 使用完毕后释放资源

超时设置

设置请求超时时间:

await Rhttp.get(
  'https://example.com',
  settings: const ClientSettings(
    timeoutSettings: TimeoutSettings(
      timeout: Duration(seconds: 10),
      connectTimeout: Duration(seconds: 5),
    ),
  ),
);

其他设置项

还包括但不限于:

  • Base URL: 设置基础URL以便简化请求路径。
  • HTTP/TLS版本: 指定使用的协议版本。
  • 证书固定: 提高安全性。
  • 代理配置: 控制是否使用系统代理或自定义代理规则。
  • 重定向控制: 限制重定向次数。
  • DNS解析: 自定义域名解析逻辑。

示例项目代码

下面是一个完整的Flutter应用示例,展示了如何结合UI组件使用rhttp进行网络请求:

// ignore_for_file: avoid_print

import 'package:flutter/material.dart';
import 'package:rhttp/rhttp.dart';
import 'package:rhttp_example/widgets/response_card.dart';

Future<void> main() async {
  await Rhttp.init();
  runApp(const MyApp());
}

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  HttpTextResponse? response;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Test Page'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () async {
                  try {
                    final res = await Rhttp.get(
                      'https://reqres.in/api/users',
                      query: {'page': '5'},
                      settings: const ClientSettings(
                        httpVersionPref: HttpVersionPref.http3,
                      ),
                    );
                    setState(() {
                      response = res;
                    });
                  } catch (e, st) {
                    print(e);
                    print(st);
                  }
                },
                child: const Text('Test'),
              ),
              if (response != null) ResponseCard(response: response!),
            ],
          ),
        ),
      ),
    );
  }
}

此示例展示了如何在一个简单的Flutter界面中集成rhttp,并通过按钮触发网络请求,然后将结果展示给用户。希望这些内容能帮助你在Flutter项目中更好地利用rhttp插件!


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

1 回复

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


当然,下面是一个关于如何在Flutter中使用rhttp插件进行网络请求的示例代码。rhttp是一个轻量级的HTTP客户端库,适用于Flutter应用中的网络请求。

首先,你需要在你的pubspec.yaml文件中添加rhttp依赖项:

dependencies:
  flutter:
    sdk: flutter
  rhttp: ^1.0.0  # 请检查最新版本号

然后,运行flutter pub get来获取依赖项。

以下是一个完整的Flutter应用示例,展示了如何使用rhttp进行GET和POST请求:

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  String responseData = '';

  void fetchData() async {
    // 创建一个RHttpClient实例
    final client = RHttpClient();

    // 发起GET请求
    try {
      final response = await client.get('https://jsonplaceholder.typicode.com/posts/1');
      
      // 检查响应状态码
      if (response.statusCode == 200) {
        setState(() {
          responseData = response.data.toString();
        });
      } else {
        setState(() {
          responseData = 'Failed to fetch data: ${response.statusCode}';
        });
      }
    } catch (e) {
      setState(() {
        responseData = 'Error: $e';
      });
    }
  }

  void postData() async {
    // 创建一个RHttpClient实例
    final client = RHttpClient();

    // 发起POST请求
    try {
      final response = await client.post(
        'https://jsonplaceholder.typicode.com/posts',
        data: {
          'title': 'foo',
          'body': 'bar',
          'userId': 1,
        },
      );

      // 检查响应状态码
      if (response.statusCode == 201) {
        setState(() {
          responseData = response.data.toString();
        });
      } else {
        setState(() {
          responseData = 'Failed to post data: ${response.statusCode}';
        });
      }
    } catch (e) {
      setState(() {
        responseData = 'Error: $e';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter rhttp Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text(
              'Response Data:',
              style: TextStyle(fontSize: 18),
            ),
            SizedBox(height: 8),
            Flexible(
              child: Text(responseData, style: TextStyle(fontSize: 16)),
            ),
            SizedBox(height: 24),
            ElevatedButton(
              onPressed: fetchData,
              child: Text('Fetch Data (GET)'),
            ),
            SizedBox(height: 12),
            ElevatedButton(
              onPressed: postData,
              child: Text('Post Data (POST)'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们定义了一个简单的Flutter应用,包含一个按钮用于发起GET请求,另一个按钮用于发起POST请求。我们使用RHttpClient实例来发起这些请求,并处理响应数据。

注意:

  • 在实际使用中,请确保你处理了所有可能的错误和异常情况。
  • 在生产环境中,不要将API密钥或其他敏感信息硬编码到客户端代码中。
  • rhttp插件的具体方法和功能可能会根据版本的不同而有所变化,请参考其官方文档以获取最新信息。
回到顶部