http 简介

http 是一个 http 网络请求框架, 由 dart team 出品

HttpClient不是一回事,至于和 dio 孰优孰劣自己见仁见智吧

通过pub下载

基础的 api

http 协议中有多种 METHOD,当然最常见的就是 GET POST,

因为最近几年 restful 协议的频繁使用,使得 PUT,DELETE,PATCH 方法也有了一定的使用率

基础使用

import 'package:http/http.dart' as http;
void get(String url) async {
    http.Response response = await http.get(url);

    // 其他的返回值都是一样的
    http.post(url);
    http.put(url);
    http.patch(url);
    http.delete(url);
    http.head(url);
}

增加请求头

  void headerDemo(String url, Map<String, String> headers) async {
    http.get(url, headers: headers);

    // 其他的方法相同
  }

post 常见的请求方式

常见的请求方式有如下几种(来自于postman) 20190219134129.png

或者使用 postman 查看也可以帮助加深理解

form-data

模拟表单上传

Future<String> postFormData(String url, Map<String, String> headers,
      Map<String, String> params, Map<String, File> files) async {
    Completer<String> completer = Completer();

    var request = http.MultipartRequest("POST", Uri.parse(url));

    request.fields.addAll(params);
    files.forEach((k, v) {
      var partFile = http.MultipartFile(
        k,
        v.readAsBytes().asStream(),
        v.lengthSync(),
      );
      request.files.add(partFile);
    });

    var ioClient = http.IOClient();
    var response = await ioClient.send(request);

    List<int> responseBody = [];

    response.stream.listen((data) {
      responseBody.addAll(data);
    }, onDone: () {
      var string = String.fromCharCodes(responseBody);
      completer.complete(string);
    }, onError: (err) {
      completer.completeError(err);
    });

    return completer.future;
  }

x-www-form-urlencoded

这个也是

  Future<http.StreamedResponse> xWwwFormUrlencoded(
      String url, Map<String, String> params) {
    var request = http.Request("POST", Uri.parse(url));
    request.bodyFields = params;
    return request.send();
  }

这里只需要简单的使用 bodyFild 设置 params 即可

参考源码可知 图片

当 contentType 为空的时候会自动设置 contentType 为x-www-form-urlencoded

raw(文本)

20190219134256.png

这里有多种选择的原因是因为:有的时候部分第三方接口可能支持xml/json/protobuf等多种交互方案

流(binary 二进制)

其实目前很多的 api 接口对于 contentType 并不敏感,单纯的接收一个数据/图片或其他的信息,然后返回值

  Future<http.StreamedResponse> streamRequest(
      String url, List<int> streamContent) {
    var request = http.StreamedRequest("POST", Uri.parse(url));
    request.sink.add(streamContent);
    return request.send();
  }

本篇讲解了 http 的库的基本用法,理论上能满足大部分的需求了, 下一篇写几个可能会遇到也可能遇不到的写法