通过dio发起请求: 发起GET请求:
Response response;
response=await dio.get("/test?id=12&name=ss")
print(response.data.toString());
对于Get请求可以将query参数通过对象传递:
response=await dio.get("/test",queryParameters:{"id":12,"name":"ss"})
print(response);
发起一个Post请求:
response=await dio.post("/test",data:{"id":12,"name":"ss"})
发起多个并发请求:
response= await Future.wait([dio.post("/info"),dio.get("/token")]);
下载文件:
response=await dio.download("https://www.google.com/",_savePath);
发送FormData
FormData formData = FormData.from({
"name": "ss",
"age": 25,
});
response = await dio.post("/info", data: formData)
如果发送的数据是FormData,则dio会将请求header的contentType设置为“multipary/formdata”。
通过FormData上传多个文件:
FormData formData = FormData.from({
"name": "ss",
"age": 25,
"file1": UploadFileInfo(File("./upload.txt"), "upload1.txt"),
"file2": UploadFileInfo(File("./upload.txt"), "upload2.txt"),
// 支持文件数组上传
"files": [
UploadFileInfo(File("./example/upload.txt"), "upload.txt"),
UploadFileInfo(File("./example/upload.txt"), "upload.txt")
]
});
response = await dio.post("/info", data: formData)
值得一提的是,dio内部仍然使用HttpClient发起的请求,所以代理、请求认证、证书校验等和HttpClient是相同的,可以在onHeepClientCreate回调中设置:
(dio.httpClientAdapter as IOHttpClientAdapter).onHttpClientCreate = (client) {
//设置代理
client.findProxy = (uri) {
return "PROXY 192.168.1.2:8888";
};
//校验证书
httpClient.badCertificateCallback=(X509Certificate cert, String host, int port){
if(cert.pem==PEM){
return true; //证书一致,则允许发送数据
}
return false;
};
};
注意:onHttpClientCreate会在当前dio实例内部需要创建HttpClietn时调用,所以通过此回调配置HttpClient会对整个dio实例生效,如果应用需要多种代理或证书校验策略,可以创建不同的dio实例来分别实现。更多API和用法参考:dio主页。
示例:
- 请求阶段弹出loading
- 请求结束后,如果请求失败,显示错误信息;如果成功,将名称展示出来。
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
class FutureBuilderRoute extends StatefulWidget{
const FutureBuilderRoute({Key? key}):super(key: key);
@override
State<StatefulWidget> createState() {
// TODO: implement createState
return FutureBuilderRouteState();
}
}
class FutureBuilderRouteState extends State<FutureBuilderRoute>{
Dio dioObject = Dio();
@override
Widget build(BuildContext context) {
// TODO: implement build
return Scaffold(
appBar: AppBar(
title: const Text("SSL Dio Test"),
),
body: Container(
alignment: Alignment.center,
child: FutureBuilder(
future: dioObject.get("https://bingjs.com:8001/Subject/GetAll"),
builder: (BuildContext context, AsyncSnapshot snapshot){
if (snapshot.connectionState == ConnectionState.done){
Response response = snapshot.data;
if (snapshot.hasError){
return Text(snapshot.error.toString());
}
return ListView(
children: response.data.map<Widget>((e){
return ListTile(title: Text(e["SubjectName"]),);
}).toList(),
);
}
return const CircularProgressIndicator();
},
),
),
);
}
}