Flutter网络请求插件rhttp的使用
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标签)
快速开始
安装
- 安装Rust:确保你已经安装了Rust(至少1.80.0版本),可以通过rustup进行安装。
- 配置Android环境:对于Android平台,需要安装命令行工具并确保NDK是最新的。
- 添加依赖:在项目的
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
更多关于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
插件的具体方法和功能可能会根据版本的不同而有所变化,请参考其官方文档以获取最新信息。