最基本的获取数据

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

main(List<String> args) async {
var url = Uri.http('localhost:5000', '/test');
var r = await http.get(url);
print(r.body); // hello world
print(r.statusCode); // 服务器返回的状态码200
}

服务器抛出错误

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

main(List<String> args) async {
var url = Uri.http('localhost:5000', '/test');
var r = await http.get(url);
print(r.body); // {"statusCode":500,"error":"Internal Server Error","message":"服务器错误"}
print(r.statusCode); // 500
}

抓取请求错误

try {
var r = await http.get('http://closeExample.com');
print(r.statusCode);
} on SocketException catch (e) {
print(e); // SocketException: Failed host lookup: 'closeexample.com' (OS Error: No address associated with hostname, errno = 7)
}

在指定的时间中断请求

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

main(List<String> args) async {
var client = http.Client(); Future.delayed(Duration(seconds: 5)).then((_) {
print('关闭这个请求');
client.close();
}); try {
var url = Uri.http('localhost:5000', '/test');
print('请求开始');
var r = await client.get(url);
print(r.body);
print(r.statusCode);
} on http.ClientException catch(e) {
/// 捕获中断后抛出的错误
print(e);
} catch (e) {
print('Other Error: $e');
}
}
  @Get('test')
async getHello(): Promise<string> {
//延迟 10s后发出数据
return await new Promise(res => {
setTimeout(() => {
res('hello world');
}, 10000);
});
}

打印结果

$ dart ./bin/main.dart
请求开始
关闭这个请求
Connection closed before full header was received

发送文件到服务器

客服端:

import 'dart:io';
import 'package:path/path.dart' as path;
import 'package:http/http.dart'; String __filename = Platform.script.path.replaceFirst('/', '');
String __dirname = path.dirname(__filename); main(List<String> arguments) async {
var uri = Uri.parse("http://localhost:3000/upload"); MultipartRequest request = MultipartRequest("POST", uri); request.fields['user'] = 'Ajanuw'; request.files.add(
await MultipartFile.fromPath('file', path.join(__dirname, 'test.jpg')),
);
var r = await request.send();
print(r.statusCode);
print(await r.stream.bytesToString());
}

服务器端代码片段:

  @Post('upload')
@UseInterceptors(FileInterceptor('file'))
UploadedFile(@UploadedFile() file, @Body() body) {
console.log(file);
console.log(body);
const writeImage = createWriteStream(
join(__dirname, '..', 'upload', `${file.originalname}`),
);
writeImage.write(file.buffer);
return 'ok';
}

执行客服端代码:

λ dart ./bin/main.dart
201
ok

服务端打印:

[0] { fieldname: 'file',
[0] originalname: 'test.jpg',
[0] encoding: '7bit',
[0] mimetype: 'application/octet-stream',
[0] buffer:
[0] <Buffer ff d8 ff e0 00 10 4a 46 49 46 00 01 01 00 00 01 00 01 00 00 ff fe 00 3b 43 52 45 41 54 4f 52 3a 20 67 64 2d 6a 70 65 67 20 76 31 2e 30 20 28 75 73 69 ... >,
[0] size: 341398 }
[0] [Object: null prototype] { user: 'Ajanuw' }

获取文件下载进度

使用send方法发送,可以返回一个监听流

import 'dart:io';
import 'dart:typed_data'; import 'package:flutter/material.dart';
import 'package:http/http.dart' as http; Uint8List image;
ImageChunkEvent loadingProgress;
ImageNetworkError error;
var _client = http.Client(); /// request
http.Request get _req {
var req = http.Request(
'get',
Uri.parse(widget.src),
);
if (widget.headers != null) {
for (MapEntry<String, String> m in widget.headers.entries) {
req.headers[m.key] = m.value;
}
}
return req;
} @override
void initState() {
super.initState();
_init();
} Future<void> _init() async {
http.StreamedResponse r = await _client.send(_req);
print(r.statusCode);
List<int> ds = [];
r.stream.listen(
(List<int> d) {
ds.addAll(d);
setState(() {
loadingProgress = ImageChunkEvent(
cumulativeBytesLoaded: ds.length, // 当前加载
expectedTotalBytes: r.contentLength, // 总长度
);
});
},
onDone: () {
setState(() {
image = Uint8List.fromList(ds);
loadingProgress = null;
});
_client?.close();
},
);
} @override
void dispose() {
_client?.close();
super.dispose();
} @override
Widget build(BuildContext context) {
if (loadingProgress == null &&
image == null &&
widget.loadingWidget != null) {
return _loadingWidget();
}
if (widget.loadingBuilder != null) {
return _loadingBuilder();
} else {
return Image.memory(image);
}
}
}

创建自己的request

import 'dart:convert';
import 'dart:io'; import 'package:flutter/material.dart';
import 'package:http/http.dart' as http; final SkyClient skyClient = SkyClient(http.Client());
void main() => runApp(MyApp()); class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomePage(),
);
}
} class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
} class _HomePageState extends State<HomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Text('home page'),
),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.send),
onPressed: () async {
try {
var r = await skyClient.getFirstUser('januwA');
print(r);
} on SocketException catch (e) {
print(e);
}
},
),
);
}
} class SkyClient extends http.BaseClient {
final http.Client _inner; SkyClient(this._inner); @override
Future<http.StreamedResponse> send(http.BaseRequest request) {
return _inner.send(request);
} @override
Future<http.Response> get(url, {Map<String, String> headers}) {
return _inner.get(url, headers: headers);
} Future<Map<String, dynamic>> getFirstUser(String name,
{Map<String, String> headers}) async {
var r = await _inner.get("https://api.github.com/search/users?q=$name",
headers: headers);
return jsonDecode(r.body)['items'][0];
}
}

上传文件获取上传进度

import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:path/path.dart' as path;
import 'package:http/http.dart' as http; final String __filename = Platform.script.path.replaceFirst('/', '');
final String __dirname = path.dirname(__filename);
final Uri uri = Uri.parse("http://localhost:3000/upload");
final String imgPath = path.join(__dirname, 'test.jpg');
main() async {
final request = await HttpClient().postUrl(uri);
int byteCount = 0; var requestMultipart = http.MultipartRequest("POST", uri)
..files.addAll([
await http.MultipartFile.fromPath("file", imgPath),
])
..fields.addEntries([
MapEntry("name", "ajanuw"),
]); request.contentLength = requestMultipart.contentLength; var msStream = requestMultipart.finalize();
requestMultipart.headers.forEach((k, v) => request.headers.set(k, v)); await request.addStream(msStream.transform(
StreamTransformer.fromHandlers(
handleData: (data, sink) {
sink.add(data);
byteCount += data.length;
print(
"${((byteCount / requestMultipart.contentLength) * 100).toInt()}/${100}");
},
handleError: (error, stack, sink) => print('upload error'),
handleDone: (sink) => sink.close(),
),
)); final httpResponse = await request.close();
print(httpResponse.statusCode); var contents = StringBuffer();
httpResponse.transform(utf8.decoder).listen(
(String data) => contents.write(data),
onDone: () {
print(contents.toString());
},
);
}

run

> dart .\bin\main.dart
0/100
0/100
80/100
99/100
99/100
100/100
201
upload sucess

serevr

@Post('upload')
@UseInterceptors(FileInterceptor('file'))
UploadedFile(@UploadedFile() file) {
console.log(file);
return "upload sucess";
}

上传文件获取上传进度(2)

import 'dart:async';
import 'dart:io';
import 'package:path/path.dart' as path;
import 'package:http/http.dart' as http; final String __filename = Platform.script.path.replaceFirst('/', '');
final String __dirname = path.dirname(__filename);
final Uri uri = Uri.parse("http://localhost:3000/upload");
final String imgPath = path.join(__dirname, 'test.jpg'); class MultipartRequest extends http.MultipartRequest {
Function(int bytes, int total) onProgress;
MultipartRequest(String method, Uri url, {this.onProgress})
: super(method, url); /// 重写这个方法
@override
http.ByteStream finalize() {
final byteStream = super.finalize();
if (onProgress == null) return byteStream;
final total = this.contentLength;
int bytes = 0; final t = StreamTransformer.fromHandlers(
handleData: (List<int> data, EventSink<List<int>> sink) {
bytes += data.length;
onProgress(bytes, total);
sink.add(data);
},
);
final stream = byteStream.transform(t);
return http.ByteStream(stream);
}
} main() async {
var uri = Uri.parse("http://localhost:3000/upload"); http.MultipartRequest request = MultipartRequest(
"POST",
uri,
onProgress: (int bytes, int total) {
print("${((bytes / total) * 100).toInt()}/${100}");
},
);
request.files.add(
await http.MultipartFile.fromPath('file', path.join(__dirname, 'test.jpg')),
);
var r = await request.send();
print(r.statusCode);
print(await r.stream.bytesToString());
}

Dart http库的更多相关文章

  1. Dart自定义库、系统库和第三方库

    /* 前面介绍Dart基础知识的时候基本上都是在一个文件里面编写Dart代码的,但实际开发中不可能这么写,模块化很重要,所以这就需要使用到库的概念. 在Dart中,库的使用时通过import关键字引入 ...

  2. Dart: path库

    path库pub地址 安装: dependencies: path: 使用: import 'dart:io'; import 'package:path/path.dart' as path; ma ...

  3. flutter-web利用dart js 库发起http request

    初学flutter,初学前端,尝试在dart中直接使用HttpClient时,直接报出Platform not supported,查资料发现他还不支持浏览器. 通过查阅资料发现可以借助axios 与 ...

  4. Dart: puppeteer库

    和node的差不多,只有写API不一样 puppeteer 地址 安装依赖 dependencies: puppeteer: ^1.7.1 下载 chrome-win 到 <project_ro ...

  5. Angular JS | Closure | Google Web Toolkit | Dart | Polymer 概要汇集

    AngularJS | Closure | Google Web Toolkit | Dart | Polymer GWT https://code.google.com/p/google-web-t ...

  6. [dart学习]第三篇:dart变量介绍 (二)

    本篇继续介绍dart变量类型,可参考前文:第二篇:dart变量介绍 (一) (一)final和const类型 如果你不打算修改一个变量的值,那么就把它定义为final或const类型.其中:final ...

  7. 9.Libraries and visibility 库和可见性

    import和liabrary指令可以帮助你创建模块化,可复用的代码.库不仅仅提供API,也是一个私有化单元:库中已下划线(_)开头的类都是对外不可访问的.每个Dart的应用也是一个包,尽管它没有使用 ...

  8. [Dart]语法基础

    此页面向您展示如何使用每个主要Dart功能,从变量和运算符到类和库,假设您已经知道如何使用其他语言编程. 要了解有关Dart核心库的更多信息,请参阅 Dart Libraries之旅.无论何时需要有关 ...

  9. 2.Built-in types-基本数据类型(Dart中文文档)

    初次翻译,部分内容并非按字面翻译,是按本人理解进行了内容重组.如有错误望指正. Dart语言内置如下数据类型: numbers strings booleans lists (所谓的数组) maps ...

随机推荐

  1. JavaWeb——B/S,C/S结构,HTTP协议

    B/S: 开发基于B/S结构项目:目前主要采用三种服务器端语言:JSP,PHP,ASP.NET. 这三种语言构成三种常用应用开发组合:JSP+Oracle组合.PHP+MySQL体系.以及ASP.NE ...

  2. 设计模式c++(5)——工厂模式

    工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个.工厂方法让类把实例化推迟到子类. 总的来说,就是工厂方法模式封装了对象的创建,通过让子类决定该创建的对象是什么,来达到将对象创建 ...

  3. java架构《并发线程基础二》

    1.关键字 volatile            使用场景: 针对与多线程公用的数据  用volatile关键字修饰  但其不保证原子性(同步).volatile关键字不具备synchronized ...

  4. VMware vCenter 6.0 安装及群集配置介绍(转载)

    转载自http://blog.51cto.com/wzlinux/2094598 一.介绍 VMware vCenter Server 提供了一个可伸缩.可扩展的平台,为虚拟化管理奠定了基础.可集中管 ...

  5. jquery each报 Uncaught TypeError: Cannot use 'in' operator to search for错误

    用$.each()来遍历后台传过来的json数据.直接遍历传过来的数据时就发生 Uncaught TypeError: Cannot use 'in' operator to search for 这 ...

  6. UI和3D物体的堆叠响应

    一.问题:当3D物体和UI元素重叠显示时一般UI元素会遮挡物体,这时点击UI元素响应时UI后方的物体也会响应. private void OnMouseDown() { ChangeColor(); ...

  7. 90% 的 Java 程序员都说不上来的为何 Java 代码越执行越快(2)- TLAB预热

    经常听到 Java 性能不如 C/C++ 的言论,也经常听说 Java 程序需要预热,那么其中主要原因是啥呢? 面试的时候谈到 JVM,也有很多面试官喜欢问,为啥 Java 程序越执行越快呢? 一般人 ...

  8. Codeforces Round #664 (Div. 2) D. Boboniu Chats with Du

    传送门:cf1395D 题意 给定一个长度为n的数组a[i]为当天说话的有趣值,如果a[i]>m,那么在 i 之后有d天不能说话.否则可以每天都说话.找到一个排列使得n天有趣值总和最大,问有趣值 ...

  9. HDU 6852 Increasing and Decreasing 构造

    题意: 给你一个n,x,y.你需要找出来一个长度为n的序列,使得这个序列满足最长上升子序列长度为x,最长下降子序列长度为y.且这个序列中每个数字只能出现一次 且要保证最后输出的序列的字典序最小 题解: ...

  10. Codeforces Global Round 11 C. The Hard Work of Paparazzi (DP)

    题意:有\(r\)X\(r\)的网格图,有\(n\)位名人,会在\(t_i\)时出现在\((x_i,y_i)\),如果过了\(t_i\)名人就会消失,从某一点走到另外一点需要花费的时间是它们之间的曼哈 ...