热门标签 | 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,小弟在这里谢过啦


推荐阅读
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
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社区 版权所有