热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

flutter网络请求的几种常见方式

flutter网络请求的几种常见方式-前言各位同学大家好,有段时间没有给大家更新文章,具体多久我记不清楚了。今天有时间给大家简单讲解下flutter的里面网络编程部分也就flut

前言

各位同学大家好,有段时间没有给大家更新文章 ,具体多久我记不清楚了。今天有时间给大家简单讲解下flutter的里面网络编程部分 也就flutter里面处理网络请求的几个点 flutter里面可以使用 原生的httpclient 或者是 http的库还有dio的库 我们今天就分开讲解,那份废话不多说我们正式开始 。

准备工作 :

需要安装flutter的开发环境:大家可以去看看之前的教程: 1 win系统flutter开发环境安装教程: 

www.jianshu.com/p/152447bc8…

2 mac系统flutter开发环境安装教程:

www.jianshu.com/p/bad2c35b4…

需要用到的三方库

  http: ^0.12.0 #latest version
  dio: ^3.0.1

请在pubspec.yaml 文件中添加依赖 然后在控制台执行flutter pub get命令下载依赖即可

使用原生的httpclient请求

  _getIPAddress() async {
    var url = 'https://httpbin.org/ip';
    var testUrl="http://192.168.9.103:8090/boss/position/getpositioninfo";
    var httpClient = new HttpClient();
    String result;
    try {
      var request = await httpClient.getUrl(Uri.parse(testUrl));
      var respOnse= await request.close();
      if (response.statusCode == HttpStatus.OK) {
        var json = await response.transform(utf8.decoder).join();
        var data = jsonDecode(json);

        print(data.toString());
        result=data.toString();

        //result = data['origin'];
      //  print("result --- > "+result);

      } else {
        result =
        'Error getting IP address:\nHttp status ${response.statusCode}';
      }
    } catch (exception) {
      result = 'Failed getting IP address';
    }
    // If the widget was removed from the tree while the message was in flight,
    // we want to discard the reply rather than calling setState to update our
    // non-existent appearance.
    if (!mounted) return;
    setState(() {
      getStr = result;
    });
  }

测试效果

使用http 库请求

  • get请求

  var data;
  _fetchGet() async {
    Map newTitle;
    final respOnse=
    await http.get('https://jsonplaceholder.typicode.com/posts/1');
    final respOnseJson= json.decode(response.body);
    print("请求成功 ---------- "+responseJson.toString());
    newTitle = responseJson;

    setState(() {
      data = newTitle['title'];
      print("title====" + data);
      str=responseJson.toString();
    });
  }

http 库只需要在异步方法里面调用http.get方法然后传入url即可 然后通过json.decode讲返回数据转成map进行解析 我们这边请求是不带参数 如果有参数则只需要动态拼接在url的后面即可

测试效果

  • post请求

void _httpPost() async {
    //头部
    var headers = Map();
    headers["loginSource"] = "IOS";
    headers["useVersion"] = "3.1.0";
    headers["isEncoded"] = "1";
    headers["bundleId"] = "com.nongfadai.iospro";
    headers["loginSource"] = "IOS";
    headers["Content-Type"] = "application/json";
    //参数
    Map params = {'v': '1.0','month':'7','day':'25','key':'bd6e35a2691ae5bb8425c8631e475c2a'};
    // 嵌套两层都可以,但是具体哪个好还有待确认????
    var jsOnParams= utf8.encode(json.encode(params));
    // var jsOnParams= json.encode(params);
    var httpClient = http.Client();
    var uri = Uri.parse("http://api.juheapi.com/japi/toh");
    http.Response respOnse=
    await httpClient.post(uri, body: jsonParams, headers: headers);

    if (response.statusCode == HttpStatus.ok) {
      print('请求成功');
      print(response.headers);//打印头部信息
      print("post------${response.body}");
      setState(() {
          str=response.body.toString();
      });
    } else {
      print('请求失败 code 码${response.statusCode}');
  }
}

post请求我们实例化httpClient 对象 然后调用 httpClient.post 方法传入URL 和参数 url是调用 Uri.parse 传入 参数通过body传到服务端

测试效果

使用dio处理网络请求

  • 简单dio get 请求示例

  dioGet()async{
    var url="http://192.168.9.103:8090/boss/position/getpositioninfo" ;
     Dio  dio=new  Dio();
     Response respOnse=await dio.get(url);
     setState(() {
       str=response.data.toString();
     });
     print(response.data.toString());
    }

  • 简单dio post请求示例

dioPosy()async{
    var url="http://192.168.9.103:8090/boss/position/getpositioninfo" ;
    Dio  dio=new  Dio();
    Response respOnse=await dio.post(url);
    setState(() {
      str=response.data.toString();
    });
    print(response.data.toString());
  }
  • 发起多个并发请求:

respOnse= await Future.wait([dio.post('/info'), dio.get('/token')]);
  • 下载文件:

respOnse= await dio.download('https://www.google.com/', './xx.html');
  • 以流的方式接收响应数据:

Response rs;
rs = await Dio().get(url,
  options: Options(responseType: ResponseType.stream),  //设置接收类型为stream
);
print(rs.data.stream); //响应流
  • 以二进制数组的方式接收响应数据:

Response> rs 
rs = await Dio().get>(url,
 options: Options(responseType: ResponseType.bytes), //设置接收类型为二进制数组
);
print(rs.data); // 二进制数组
  • 发送 FormData:

var formData = FormData.fromMap({
  'name': 'wendux',
  'age': 25,
});
var respOnse= await dio.post('/info', data: formData);
  • 通过FormData上传多个文件:

var formData = FormData.fromMap({
  'name': 'wendux',
  'age': 25,
  'file': await MultipartFile.fromFile('./text.txt', filename: 'upload.txt'),
  'files': [
    await MultipartFile.fromFile('./text1.txt', filename: 'text1.txt'),
    await MultipartFile.fromFile('./text2.txt', filename: 'text2.txt'),
  ]
});
var respOnse= await dio.post('/info', data: formData);
  • 监听发送(上传)数据进度:

respOnse= await dio.post(
  'http://www.dtworkroom.com/doris/1/2.0.0/test',
  data: {'aa': 'bb' * 22},
  onSendProgress: (int sent, int total) {
    print('$sent $total');
  },
);

List postData = [...];
await dio.post(
  url,
  data: Stream.fromIterable(postData.map((e) => [e])), //创建一个Stream>
  options: Options(
    headers: {
      Headers.contentLengthHeader: postData.length, // 设置content-length
    },
  ),
);
// 二进制数据
List postData = [...];
await dio.post(
  url,
  data: Stream.fromIterable(postData.map((e) => [e])), //创建一个Stream>
  options: Options(
    headers: {
      Headers.contentLengthHeader: postData.length, // 设置content-length
    },
  ),
);

测试效果

更多详细dio使用示例 请看 github.com/flutterchin… 有详细的说明我就不展开讲了

最后总结

flutter里面的网络编程方式有很多目前主流就是使用dio库和http 但是我这边还是要附带讲一下原生httpclient 因为dio也是基于httpclient封装的 所以我们有必要了解其实现过程,然后就是dio库的各种用法 因为库本身功能很强也我这边篇幅有限就不展开讲 最后希望我的文章能帮助到各位解决问题 ,以后我还会贡献更多有用的代码分享给大家。各位同学如果觉得文章还不错 ,麻烦给关注和star,小弟在这里谢过啦


推荐阅读
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • 在优化Nginx与PHP的高效配置过程中,许多教程提供的配置方法存在诸多问题或不良实践。本文将深入探讨这些常见错误,并详细介绍如何正确配置Nginx和PHP,以实现更高的性能和稳定性。我们将从Nginx配置文件的基本指令入手,逐步解析每个关键参数的最优设置,帮助读者理解其背后的原理和实际应用效果。 ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • 如何在PHP中准确获取服务器IP地址?
    如何在PHP中准确获取服务器IP地址? ... [详细]
  • SecureCRT是一款功能强大的终端仿真软件,支持SSH1和SSH2协议,适用于在Windows环境下高效连接和管理Linux服务器。该工具不仅提供了稳定的连接性能,还具备丰富的配置选项,能够满足不同用户的需求。通过SecureCRT,用户可以轻松实现对远程Linux系统的安全访问和操作。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
author-avatar
seoer
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有