前言

在使用这些请求之前,我们需要知道它所使用的都是Flutter的网络编程模块,对此,我们就需要用到异步编程的技术,尽管我没分享这方面的编程知识,但是网上有很多资源可以借鉴。
在写这篇文章的时候,我遇到了很多新东西,在学校并没有老师教这门课,而是通过自己的白嫖现在都学的差不多了,但是有些方面还是有很大的问题。
对此,我就想到了写博客的方式记录自己的学习过程,让自己多多的积累起来,日后打开该页,我也会自动的浮现当时的郁闷心情…但收获到的东西还是占多数部分。下面将是我对网络编程这块的总结,如有不正确的地方,望指出,看到了我也懒得改…嘿嘿。

友情提示

在这之前说明一下,对于网络地址请求错误出现下面这样的错误,应该在地址前面加上http://https://进行请求。

E/flutter ( 8218): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: Invalid argument(s): No host specified in URI fy.webxml.com.cn/webservices/EnglishChinese.asmx/TranslatorStringE/flutter ( 8218): #0      _HttpClient._openUrl (dart:_http/http_impl.dart:2662:9)
E/flutter ( 8218): #1      _HttpClient.openUrl (dart:_http/http_impl.dart:2568:7)

HttpClient

请求步骤

String url =
“http://ws.webxml.com.cn/WebServices/WeatherWS.asmx/getRegionCountry?”;

1.创建对象

var httpClient = HttpClient(); // 创建对象

2.发送请求

var request = await httpClient.getUrl(Uri.parse(url)); // 发送请求
  1. 得到响应内容
var response = await request.close(); // 得到响应

4.转码

var responseBody = await response.transform(utf8.decoder).join(); // 转码

结果:

<?xml version="1.0" encoding="utf-8"?>
I/flutter ( 2845): <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://WebXml.com.cn/">
I/flutter ( 2845):   <string>阿尔及利亚,3320</string>
I/flutter ( 2845):   <string>阿根廷,3522</string>
I/flutter ( 2845):   <string>阿曼,3170</string>
I/flutter ( 2845):   <string>阿塞拜疆,3176</string>
I/flutter ( 2845):   <string>埃及,3317</string>
I/flutter ( 2845):   <string>埃塞俄比亚,3314</string>
I/flutter ( 2845):   <string>爱尔兰,3246</string>
I/flutter ( 2845):   <string>奥地利,3237</string>
I/flutter ( 2845):   <string>澳大利亚,368</string>
I/flutter ( 2845):   <string>巴基斯坦,3169</string>
I/flutter ( 2845):   <string>巴西,3580</string>.........

Http请求

需要导入依赖

dependencies:http: ^0.13.4

url地址

// url地址
String url = "http://ws.webxml.com.cn/WebServices/WeatherWS.asmx/getRegionCountry?";
// 存放响应内容
String info = "响应内容";

Get请求

1.发送请求

var result = await http.get(Uri.parse(url)); // 发送请求

2.得到响应内容

info = result.body;

打印结果如下:

I/flutter ( 3444): <?xml version="1.0" encoding="utf-8"?>
I/flutter ( 3444): <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://WebXml.com.cn/">
I/flutter ( 3444):   <string>阿尔及利亚,3320</string>
I/flutter ( 3444):   <string>阿根廷,3522</string>
I/flutter ( 3444):   <string>阿曼,3170</string>
I/flutter ( 3444):   <string>阿塞拜疆,3176</string>
I/flutter ( 3444):   <string>埃及,3317</string>
I/flutter ( 3444):   <string>埃塞俄比亚,3314</string>
I/flutter ( 3444):   <string>爱尔兰,3246</string>..........

Post请求

准备数据

String fyUrl = "http://fy.webxml.com.cn/webservices/EnglishChinese.asmx/TranslatorString";
  1. 根据API准备参数:
var body = {"wordKey":"中国"};
  1. 提交请求
var result = await http.post(Uri.parse(url),body: body);
  1. 得到结果,需要使用.body才能得到内容。
info = result.body;

打印如下:

I/flutter ( 7242): <?xml version="1.0" encoding="utf-8"?>
I/flutter ( 7242): <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://WebXml.com.cn/">
I/flutter ( 7242):   <string>中国</string>
I/flutter ( 7242):   <string>zhōng guó</string>
I/flutter ( 7242):   <string />
I/flutter ( 7242):   <string>China;Chinese</string>
I/flutter ( 7242):   <string />
I/flutter ( 7242): </ArrayOfString>

Dio请求

官方文档链接:

https://github.com/flutterchina/dio/blob/develop/README-ZH.md#cookie%E7%AE%A1%E7%90%86

添加依赖

dart dependencies: dio: ^4.0.4

url地址

String name = "宜宾"; String weather= "http://ws.webxml.com.cn//WebServices/WeatherWS.asmx/getWeather?theCityCode=${name}&theUserID=";

Get请求

准备url地址

// 第一种方式
String name = "宜宾";
var url1 = "http://ws.webxml.com.cn/WebServices/WeatherWS.asmx/getWeather?theCityCode=${name}&theUserID=";// 第二种方式
var url2 = "http://ws.webxml.com.cn/WebServices/WeatherWS.asmx/getWeather";
  1. 创建对象
Dio dio = Dio();
  1. 发送请求
var response = await dio.get(weather);

另一种写法,将需要的参数使用Map格式传进去。

var response = await dio.get(url,queryParameters:{"theCityCode":"宜宾","theUserID":""});
  1. 得到数据,使用data才能得到结果
var info = response.data;
  1. 打印
I/flutter ( 8218): <?xml version="1.0" encoding="utf-8"?>
I/flutter ( 8218): <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://WebXml.com.cn/">
I/flutter ( 8218):   <string>四川 宜宾</string>
I/flutter ( 8218):   <string>宜宾</string>
I/flutter ( 8218):   <string>1167</string>
I/flutter ( 8218):   <string>2022/03/01 14:30:04</string>
I/flutter ( 8218):   <string>今日天气实况:气温:19℃;风向/风力:东南风 2级;湿度:35%</string>
I/flutter ( 8218):   <string>紫外线强度:很强。</string>
I/flutter ( 8218):   <string>感冒指数:少发,无明显降温,感冒机率较低。
I/flutter ( 8218): 运动指数:适宜,天气较好,尽情感受运动的快乐吧。
I/flutter ( 8218): 过敏指数:较易发,外出需远离过敏源,适当采取防护措施。
I/flutter ( 8218): 穿衣指数:较冷,建议着厚外套加毛衣等服装。
I/flutter ( 8218): 洗车指数:适宜,天气较好,适合擦洗汽车。
I/flutter ( 8218): 紫外线指数:很强,涂擦SPF20以上,PA++护肤品,避强光。.........

Post请求

注:由于Dio的post请求有点复杂,我百度了很久才发现这样请求才不会报400~500的网络错误。

制作 post url地址:

String url = "http://fy.webxml.com.cn/webservices/EnglishChinese.asmx/Translator";// 所需参数
wordKey=string
  1. 创建对象
var dio = await Dio();
  1. 设置Post请求参数,dataMap类型的参数,可以放在外面,其他的就把他当做固定写法吧…
var response = await dio.post(url,data: {"wordKey": "熊猫"},options: Options(contentType: Headers.formUrlEncodedContentType));
  1. 接收结果,Dio使用的是.data接收数据
var result = await response.data;
  1. 打印结果如下
I/flutter ( 2270): <?xml version="1.0" encoding="utf-8"?>
I/flutter ( 2270): <DataSet xmlns="http://WebXml.com.cn/">
I/flutter ( 2270):   <xs:schema id="Dictionary" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
I/flutter ( 2270):     <xs:element name="Dictionary" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
I/flutter ( 2270):       <xs:complexType>
I/flutter ( 2270):         <xs:choice minOccurs="0" maxOccurs="unbounded">
I/flutter ( 2270):           <xs:element name="Trans">
I/flutter ( 2270):             <xs:complexType>
I/flutter ( 2270):               <xs:sequence>
I/flutter ( 2270):                 <xs:element name="WordKey" type="xs:string" minOccurs="0" />..............

使用 xml 解析数据

注:只能解析带有下面这种格式开头的数据,并且在得到查找到的数据时使用.text 获取它。

<?xml version="1.0" encoding="utf-8"?>

先添加依赖,因为没有内置xml包。

dart dependencies: xml: ^5.3.1

导入包

dart import 'package:xml/xml.dart' as xml;

请求网站 "http://ws.webxml.com.cn/WebServices/WeatherWS.asmx/getRegionCountry?"

// 创建 xml 对象,responseBody是上面我们请求得到的数据!!
xml.XmlDocument docement = xml.parse(responseBody);
// 放置xml中找到的元素值
List list = []; // 找到“string”标签,并获取到每一个标签
docement.findAllElements("string").map((e) {list.add(e.text);              // 获取标签中的值,使用 .text 获取找到的数据}).toList();                  // 转换为列表,列表中已经放置了xml标签中每一个“string”标签的值
// 注意一定要转换为列表// 打印列表中的每一个值
for(int i=0;i<list.length;i++){print(list[i]);}
} else {print("没有请求成功"); // 没有请求成功}
},

结果:

阿尔及利亚,3320
I/flutter ( 2144): 阿尔及利亚,3320
I/flutter ( 2144): 阿根廷,3522
I/flutter ( 2144): 阿曼,3170
I/flutter ( 2144): 阿塞拜疆,3176
I/flutter ( 2144): 埃及,3317
I/flutter ( 2144): 埃塞俄比亚,3314
I/flutter ( 2144): 爱尔兰,3246
I/flutter ( 2144): 奥地利,3237
I/flutter ( 2144): 澳大利亚,368
I/flutter ( 2144): 巴基斯坦,3169
I/flutter ( 2144): 巴西,3580
I/flutter ( 2144): 保加利亚,3232.........

解析Json数据

准备数据,可以使用上面介绍的三种方式进行请求保存下来的数据。

导入模块:

import 'dart:convert';
  1. 准备url地址
在这里插入代码片
  1. 解析数据
 // Json数据来源需要自己准备String url = "http://blog.qingsmile.com:9000/data";// 创建对象var httpclient = await HttpClient();var request = await httpclient.getUrl(Uri.parse(url));var response = await request.close();var result = await response.transform(utf8.decoder).join();setState(() {info = result;});// 调用 json.decode()方法进行解析,解析出的结果需用 Map 放置Map body = json.decode(result);// print(body);for(int i=0;i<body['data'].length;i++){print(body['data'][i]['name']);}
  1. 打印
I/flutter ( 2270): 王二
I/flutter ( 2270): 张三
I/flutter ( 2270): 李四
I/flutter ( 2270): 黄五
I/flutter ( 2270): 赵六
I/flutter ( 2270): 马七
I/flutter ( 2270): 刘八
I/flutter ( 2270): 蔡九

源码部分

class HttpDemoPage extends StatefulWidget {const HttpDemoPage({Key? key}) : super(key: key);@override_HttpDemoPageState createState() => _HttpDemoPageState();
}class _HttpDemoPageState extends State<HttpDemoPage> {// 显示内容String info = "显示内容";// 存放解析出的xml数据List lists = [];@overrideWidget build(BuildContext context) {return SingleChildScrollView(child: Align(alignment: Alignment.center,child: Column(children: [ElevatedButton(onPressed: () async {// Json数据来源需要自己准备String url = "http://blog.qingsmile.com:9000/data";// 创建对象var httpclient = await HttpClient();var request = await httpclient.getUrl(Uri.parse(url));var response = await request.close();var result = await response.transform(utf8.decoder).join();setState(() {info = result;});// 调用 json.decode()方法进行解析,解析出的结果需用 Map 放置Map body = json.decode(result);// print(body);for (int i = 0; i < body['data'].length; i++) {info = body['data'][i]['name'];print(info);}},child: Text("HttpClient请求")),ElevatedButton(onPressed: () async {String name = "中国";var url_01 ="http://fy.webxml.com.cn/webservices/EnglishChinese.asmx/Translator?wordKey=${name}";var response = await http.get(Uri.parse(url_01));if (response.statusCode == 200) {setState(() {info = response.body;});print(info);}},child: Text("HttpGet请求")),ElevatedButton(onPressed: () async {var url ="http://fy.webxml.com.cn/webservices/EnglishChinese.asmx/Translator";var response =await http.post(Uri.parse(url), body: {"wordKey": "老虎"});if (response.statusCode == 200) {setState(() {info = response.body;});print(info);}},child: Text("HttpPost请求")),ElevatedButton(onPressed: () async {var url2 ="http://ws.webxml.com.cn/WebServices/WeatherWS.asmx/getWeather";// 创建对象var dio = await Dio();var response = await dio.get(url2,queryParameters: {"theCityCode": "宜宾", "theUserID": ""});var body = await response.data;setState(() {info = body;});print(body);},child: Text("DioGet请求")),ElevatedButton(onPressed: () async {String url ="http://fy.webxml.com.cn/webservices/EnglishChinese.asmx/Translator";// 创建对象var dio = await Dio();var response = await dio.post(url,data: {"wordKey": "熊猫"},options: Options(contentType: Headers.formUrlEncodedContentType));var result = await response.data;setState(() {info = result;});print(result.toString());},child: Text("DioPost请求")),Container(child: Card(child: Column(children: [Text(info)])),margin: EdgeInsets.all(10),width: MediaQuery.of(context).size.width,)],),),);}
}

Flutter网络请求相关推荐

  1. Flutter 网络请求框架dio使用详解

    前言 dio是一款Flutter 网络请求框架,在GitHub上目前有超过5.9k个star.由国人(Flutter中文网)开发,所以中文文档非常完善. 这里copy了dio官方的文档,便于自己开发时 ...

  2. Flutter 网络请求库http

    http 集成http库 https://pub.dartlang.org/packages/http 添加依赖 dependencies:http: ^0.12.0 安装 flutter packa ...

  3. flutter网络请求dio的get、post、上传文件、下载文件总结

    题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天. 重要消息 flutter中网络请求dio使用分析 视频教程在这里 Flutter 从入门实践到开发一个APP之UI基础 ...

  4. Flutter网络请求方式总结

    转载于:https://www.jianshu.com/p/59fc5ed37453 前言 编写一个 App,最离不开的就是网络请求了.在Android 原生中,网络请求库一直在更新,网络请求库甚多: ...

  5. Flutter网络请求库DIO入门文档(1),android开发网

    }); response = await dio.post("http/test/upload", data: formData); //上传多个文件 formData = For ...

  6. Flutter网络请求Dio库的使用及封装

    Dart语言内置的HttpClient实现了基本的网络请求相关的操作.但HttpClient本身功能较弱,很多网络请求常用功能都不支持,因此在实际项目中,我们更多是使用dio库实现网络请求. 注:Fl ...

  7. Flutter网络请求库DIO入门文档,实战案例

    var request = await httpClient.getUrl(Uri.parse(url)); var response = await request.close(); if (res ...

  8. Flutter网络请求关闭Loading对话框

    使用场景 在使用Flutter中,无论是异步任务执行成功与否,都要进行网络请求前的对话框加载,在请求结束后进行对话框的关闭. 面对这种场景,有两种方法, 一种是在then或catch中关闭一下对话框, ...

  9. Flutter网络请求Dio使用

    import 'package:dio/dio.dart';//我的 class MyMy extends StatefulWidget {List<Widget> gedans = ne ...

最新文章

  1. 中国大学生创业报告发布
  2. ui产品小结 - 包含小程序 前端等
  3. mysql 优化版_MySQL优化(超完整版)(一)
  4. 阿里1582.73亿营收背后的持续交付如何玩?
  5. c++中宏定义的妙用
  6. 【字符串操作之】返回指定长度的字符串→→substr方法
  7. maven项目动态替换配置中的值
  8. ASP.NET MVC 对于视图引擎的优化
  9. python基本数据类型——整型,浮点型,复数,字符串
  10. 安卓java模拟器按键精灵,安卓按键精灵实现后台
  11. 7.2.5 dps 测试软件,7.2.5冰DK萨墓六大DPS饰品测试:属性机制及分析
  12. 如何使用Arduino开发板和ADXL345加速度计跟踪方向
  13. 二维码图片处理换logo,加文字
  14. 使用代理ccproxy设置outlook2013 收QQ邮箱(IMAP-SMTP方式)
  15. html怎么禁止图片拖动,javascript,html5_div在拖动时出现禁止图标,javascript,html5 - phpStudy...
  16. 电商品牌私域流量社群运营推广裂变sop搭建营销计划表格方案
  17. 《Kotin 极简教程》第9章 轻量级线程:协程(2)
  18. 【数据结构】单链表(增、删、查、改)的实现 [初阶篇_ 复习专用]
  19. android 常用的代码
  20. 震动效果调研 - iOS

热门文章

  1. 【Leetcode】5 longestPalindrome python解法
  2. exit和return的区别
  3. linux 进程rt,RTLinux进程调度策略总结
  4. 微观经济学: 鳄梨(Avocado)价格弹性分析
  5. 2019HDU多校第七场 HDU6656 Kejin Player H 【期望递归】
  6. 【转】关于提示can't load package 'xxx.bpl.' 错误问题的解决方法
  7. Linux内核系统论文写作虚拟机方案
  8. 掌静脉身份识别仪的硬件设计
  9. 密码学历史及近40年人物技术里程碑(公号回复“密码学”下载PDF资料,欢迎转发、赞赏、支持科普)
  10. android studio高考倒计时,2019高考倒计时锁屏app-高考倒计时锁屏软件预约v1.0.5-乐游网安卓...