Flutter-dio

620 阅读2分钟

通过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主页

示例:

  1. 请求阶段弹出loading
  2. 请求结束后,如果请求失败,显示错误信息;如果成功,将名称展示出来。
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();
          },
        ),
      ),
    );
  }
}