简介

dart:html包为dart提供了构建浏览器客户端的一些必须的组件,之前我们提到了HTML和DOM的操作,除了这些之外,我们在浏览器端另一个常用的操作就是使用XMLHttpRequest去做异步HTTP资源的请求,也就是AJAX请求。

dart同样提供了类似JS中XMLHttpRequest的封装,其对应的类叫做HttpRequest,一起来看看在dart中怎么使用HttpRequest吧。

发送GET请求

虽然现代的web APP被各种框架所封装,但是归根结底他还是一个AJAX的富客户端应用。我们通过各种异步的HTTP请求向服务器端请求数据,然后展示在页面上。一般来说数据的交互格式是JSON,当然也可以有其他的数据交互格式。

AJAX中最常用的方式就是向服务器端发送get请求,对应的HttpRequest有一个getString方法:

  1. static Future<String> getString(String url,
  2. {bool? withCredentials, void onProgress(ProgressEvent e)?}) {
  3. return request(url,
  4. withCredentials: withCredentials, onProgress: onProgress)
  5. .then((HttpRequest xhr) => xhr.responseText!);
  6. }

注意,getString方法是一个类方法,所以直接使用HttpRequest类来调用:

  1. var name = Uri.encodeQueryComponent('John');
  2. var id = Uri.encodeQueryComponent('42');
  3. HttpRequest.getString('users.json?name=$name&id=$id')
  4. .then((String resp) {
  5. // Do something with the response.
  6. });

因为getString返回的是一个Future,所以可以直接在getString后面接then语句,来获取返回的值。

当然,你也可以在async方法中使用await来获取返回值。

  1. Future<void> main() async {
  2. String pageHtml = await HttpRequest.getString(url);
  3. // Do something with pageHtml...
  4. }

或者使用try catch来捕获异常:

  1. try {
  2. var data = await HttpRequest.getString(jsonUri);
  3. // Process data...
  4. } catch (e) {
  5. // Handle exception...
  6. }

发送post请求

GET是从服务器拉取数据,相应的POST就是通用的向服务器中提交数据的方法。在HttpRequest中,对应的方法是postFormData:

  1. static Future<HttpRequest> postFormData(String url, Map<String, String> data,
  2. {bool? withCredentials,
  3. String? responseType,
  4. Map<String, String>? requestHeaders,
  5. void onProgress(ProgressEvent e)?}) {
  6. var parts = [];
  7. data.forEach((key, value) {
  8. parts.add('${Uri.encodeQueryComponent(key)}='
  9. '${Uri.encodeQueryComponent(value)}');
  10. });
  11. var formData = parts.join('&');
  12. if (requestHeaders == null) {
  13. requestHeaders = <String, String>{};
  14. }
  15. requestHeaders.putIfAbsent('Content-Type',
  16. () => 'application/x-www-form-urlencoded; charset=UTF-8');
  17. return request(url,
  18. method: 'POST',
  19. withCredentials: withCredentials,
  20. responseType: responseType,
  21. requestHeaders: requestHeaders,
  22. sendData: formData,
  23. onProgress: onProgress);
  24. }

从方法的实现上可以看到,默认情况下使用的Content-Type: application/x-www-form-urlencoded; charset=UTF-8, 也就是说默认是以form表单提交的形式进行的。

在这种情况下,对于承载数据的data来说,会首先进行Uri.encodeQueryComponent进行编码,然后再使用&进行连接。

下面是使用的例子:

  1. var data = { 'firstName' : 'John', 'lastName' : 'Doe' };
  2. HttpRequest.postFormData('/send', data).then((HttpRequest resp) {
  3. // Do something with the response.
  4. });

注意,postFormData中返回的是一个HttpRequest,虽然它叫做Request,但是实际上可以包含response的内容。所以直接使用他获取返回内容即可。

更加通用的操作

上面我们讲解了get和form的post,从代码可以看到,他们底层实际上都调用的是request方法。request是一个更加通用的HTTP请求方法。可以支持POST, PUT, DELETE等HTTP操作。下面是request的方法定义:

  1. static Future<HttpRequest> request(String url,
  2. {String? method,
  3. bool? withCredentials,
  4. String? responseType,
  5. String? mimeType,
  6. Map<String, String>? requestHeaders,
  7. sendData,
  8. void onProgress(ProgressEvent e)?})

其中sendData可以是[ByteBuffer],[Blob], [Document], [String], 或者 [FormData] 等格式。

responseType表示的是HttpRequest.responseType,是返回对象的格式,默认情况下是String,也可以是'arraybuffer', 'blob', 'document', 'json', 或者 'text'。

下面是一个是直接使用request的例子:

  1. var myForm = querySelector('form#myForm');
  2. var data = new FormData(myForm);
  3. HttpRequest.request('/submit', method: 'POST', sendData: data)
  4. .then((HttpRequest resp) {
  5. // Do something with the response.
  6. });

总结

使用HttpRequest可以直接模拟浏览器中的Ajax操作,非常方便。

本文已收录于 http://www.flydean.com/21-dart-http/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

dart系列之:浏览器中的舞者,用dart发送HTTP请求的更多相关文章

  1. Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  2. Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  3. idea中使用restclient测试接口发送http请求

    转载:https://jingyan.baidu.com/article/ca41422f0bfd8e1eae99ed31.html

  4. js中使用队列发送ajax请求

    最近,项目中需要按照先后顺序发送ajax请求,并且在一次请求结束后才能发起下一次,不然就会导致逻辑错误. 解决办法是定义一个数组,保存ajax请求数据. 以下使用extjs4定义一个类 Ext.def ...

  5. 浏览器扩展系列————在WPF中定制WebBrowser快捷菜单

    原文:浏览器扩展系列----在WPF中定制WebBrowser快捷菜单 关于如何定制菜单可以参考codeproject上的这篇文章:http://www.codeproject.com/KB/book ...

  6. dart系列之:dart语言中的特殊操作符

    dart系列之:dart语言中的特殊操作符 目录 简介 普通操作符 类型测试操作符 条件运算符 级联符号 类中的自定义操作符 总结 简介 有运算就有操作符,dart中除了普通的算术运算的操作符之外,还 ...

  7. dart系列之:dart语言中的内置类型

    目录 简介 Null 数字 字符串 布尔值 列表 set和map 简介 和所有的编程语言一样,dart有他内置的语言类型,这些内置类型都继承自Object,当然这些内置类型是dart语言的基础,只有掌 ...

  8. dart系列之:dart类中的泛型

    目录 简介 为什么要用泛型 怎么使用泛型 类型擦除 泛型的继承 泛型方法 总结 简介 熟悉JAVA的朋友可能知道,JAVA在8中引入了泛型的概念.什么是泛型呢?泛型就是一种通用的类型格式,一般用在集合 ...

  9. 第十一章:WEB浏览器中的javascript

    客户端javascript涵盖在本系列的第二部分第10章,主要讲解javascript是如何在web浏览器中实现的,这些章节介绍了大量的脚本宿主对象,这些对象可以表示浏览器窗口.文档树的内容.这些章节 ...

随机推荐

  1. [noi239]count

    将每一个ai表示为$ai=ki\cdot m+ri$,即满足$m\sum ki+\sum ri=n$且$0<ri<m$枚举$S=\sum ri$(S范围是$k\le S\le k(m-1) ...

  2. [cf643G]Choosing Ads

    首先对于$p>50$,有经典的做法,即不断删去区间中不同的两数,最终剩下的即为出现次数超过一半的数(或没有),用线段树维护即可 那么对于$p\le 50$,类似的,即删去区间中不同的$\lflo ...

  3. Java生产环境JVM设置成固定堆大小深层原理

    可能很多人都知道Java程序上生产后,运维人员都会设定好JVM的堆大小,而且还是把最大最小设置成一样的值.那究竟是为什么呢?一般而言,Java程序如果你不显示设定该值得话,会自动进行初始化设定. -X ...

  4. linux 同时执行多个命令及几个基础命令

    先后不同的命令用分号:隔开即可 基础命令: 1.cd 进入目录 /代表根目录,.代表当前目录,..代表上一级目录 2.ls 显示当前目录下的所有文件和文件夹 -F区分目录和文件,文件后边是*代表可执行 ...

  5. 【NOI 2002 银河英雄传说】【带权并查集】

    题面 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集*在巴米利恩星域爆发战争.泰山压顶集 ...

  6. Dirichlet 前缀和的几种版本

    [模板]Dirichlet 前缀和 求 \[B[i] = \sum_{d|i} A[d] \] $ n \le 2\times 10^{7} $ 看代码: for( int i = 1 ; i < ...

  7. 洛谷 P7718 -「EZEC-10」Equalization(差分转化+状压 dp)

    洛谷题面传送门 一道挺有意思的题,现场切掉还是挺有成就感的. 首先看到区间操作我们可以想到差分转换,将区间操作转化为差分序列上的一个或两个单点操作,具体来说我们设 \(b_i=a_{i+1}-a_i\ ...

  8. Codeforces 685C - Optimal Point(分类讨论+乱搞)

    Codeforces 题面传送门 & 洛谷题面传送门 分类讨论神题. 首先看到最大值最小,一眼二分答案,于是问题转化为判定性问题,即是否 \(\exists x_0,y_0,z_0\) 满足 ...

  9. mysql 计算日期为当年第几季度

    select T21620.日期 as F21634, QUARTER('98-04-01')  as quarter                       #返回日期是一年的第几个季度   - ...

  10. 8.Maximum Depth of Binary Tree

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...