美文网首页初见
Flutter网络请求

Flutter网络请求

作者: woniu | 来源:发表于2020-06-17 17:21 被阅读0次

在Flutter中常见的网络请求方式有三种:HttpClient、http库、dio库;
注意:async 和 await必须配对使用。

一、HttpClient

HttpClient是Flutter自带的请求类,在io包中,实现了基本的网络请求相关的操作。
网络请求步骤如下:
1、创建 client.
2、构造 Uri.
3、发起请求, 等待请求,同时您也可以配置请求headers、 body。
4、关闭请求, 等待响应.
5、解码响应的内容.
请求示例如下:

void requestNetwork() async {
  // 1.创建HttpClient对象
  final httpClient = HttpClient();

  // 2.构建请求的uri
  final uri = Uri.parse("http://123.207.32.32:8000/api/v1/recommend");

  // 3.构建请求
  final request = await httpClient.getUrl(uri);

  // 4.发送请求,必须
  final response = await request.close();
  if (response.statusCode == HttpStatus.ok) {
  // 5.转码解析数据
    print(await response.transform(utf8.decoder).join());
  } else {
    print(response.statusCode);
  }
}

HttpClient虽然可以发送正常的网络请求,但是会暴露过多的细节:
比如需要主动关闭request请求,拿到数据后也需要手动的进行字符串解码,这样就比较复杂了。

二、http库

http 是 Dart 官方提供的另一个网络请求类,相比于 HttpClient,易用性提升了不少。
但是,没有默认集成到Dart的SDK中,所以我们需要先在pubspec中依赖它:

http: ^0.12.0+2

导入到项目中使用:

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

void httpNetwork() async {
  // 1.创建Client
  final client = http.Client();

  // 2.构建uri
  final url = Uri.parse("http://123.207.32.32:8000/api/v1/recommend");

  // 3.发送请求
  final response = await client.get(url);

  // 4.获取结果
  if (response.statusCode == HttpStatus.ok) {
    print(response.body);
  } else {
    print(response.statusCode);
  }
}

怎么样,这样看起来是不是比原生的用来更方便了一些。

三、dio三方库

上面的两种方式都能实现网络请求,但是如果要做比较复杂的操作,如比如拦截器、取消请求、文件上传/下载、超时设置等等;就比较难了,所以我们可以使用一个在Flutter中非常流行的三方库:dio;
dio是一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载、超时、自定义适配器等...
使用dio三方库必然也需要先在pubspec中依赖它:

dio: ^3.0.1

代码:

import 'package:dio/dio.dart';

void dioNetwork() async {
  // 1.创建Dio请求对象
  final dio = Dio();

  // 2.发送网络请求
  final response = await dio.get("http://123.207.32.32:8000/api/v1/recommend");

  // 3.打印请求结果
  if (response.statusCode == HttpStatus.ok) {
    print(response.data);
  } else {
    print("请求失败:${response.statusCode}");
  }
}

四、dio的封装

为了更方便的使用使用网络请求,我们可以对dio进行封装。

1、创建http_config.dart文件
class HTTPConfig {
  static const baseURL = "https://httpbin.org";
  static const timeout = 5000;
}
2、封装网络请求http_request.dart文件
import 'package:dio/dio.dart';
import 'package:testflutter/service/config.dart';

class HttpRequest {
  static final BaseOptions options = BaseOptions(
      baseUrl: HTTPConfig.baseURL, connectTimeout: HTTPConfig.timeout);
  static final Dio dio = Dio(options);

  static Future<T> request<T>(String url,
      {String method = 'get', Map<String, dynamic> params, Interceptor inter}) async {
    // 1.请求的单独配置
    final options = Options(method: method);

    // 2.添加第一个拦截器
    Interceptor dInter = InterceptorsWrapper(
      onRequest: (RequestOptions options) {
        // 1.在进行任何网络请求的时候, 可以添加一个loading显示

        // 2.很多页面的访问必须要求携带Token,那么就可以在这里判断是有Token

        // 3.对参数进行一些处理,比如序列化处理等
        print("拦截了请求");
        return options;
      },
      onResponse: (Response response) {
        print("拦截了响应");
        return response;
      },
      onError: (DioError error) {
        print("拦截了错误");
        return error;
      }
    );
    List<Interceptor> inters = [dInter];
    if (inter != null) {
      inters.add(inter);
    }
    dio.interceptors.addAll(inters);

    // 3.发送网络请求
    try {
      Response response = await dio.request<T>(url, queryParameters: params, options: options);
      return response.data;
    } on DioError catch(e) {
      return Future.error(e);
    }
  }
}
3、封装库的使用
HttpRequest.request("https://httpbin.org/get", params: {"name": "why", 'age': 18}).then((res) {
  print(res);
});

HttpRequest.request("https://httpbin.org/post",
                    method: "post", params: {"name": "why", 'age': 18}).then((res) {
  print(res);
});

相关文章

  • Flutter 网络请求框架封装

    Flutter 请求网络的三种方式 flutter 请求网络的方式有三种,分别是 Dart 原生的网络请求 Htt...

  • Flutter 网络请求框架封装

    Flutter 请求网络的三种方式 flutter 请求网络的方式有三种,分别是 Dart 原生的网络请求 Htt...

  • Flutter常用的Package

    Flutter搜索库 网络 dio 网络请求 http 网络请求 connectivity 网络状态改变(i...

  • flutter网络请求封装

    Flutter 网络请求框架封装

  • Flutter dio网络请求需在请求secret后的方式二:匿

    上一篇: Flutter dio网络请求需在请求secret后的方式一:请求时判断下一篇Flutter dio网络...

  • flutter抓包

    前言 老项目集成flutter以后,flutter页面网络请求使用的dio框架,发现charles无法抓取请求包 ...

  • Flutter 网络请求

    HttpClient(Dart内置API) http第三方库 Dio第三方库 1.HttpClient(Dart内...

  • Flutter网络请求

    在Flutter中常见的网络请求方式有三种:HttpClient、http库、dio库;注意:async 和 aw...

  • flutter网络请求

    在flutter中进行网络请求有多种方式,这里我使用的是dio。dio这个库被封装的很好,使用起来也很简单,但为了...

  • Flutter网络请求

    一. 网络请求的方式 在Flutter中常见的网络请求方式有三种:HttpClient、http库、dio库; 1...

网友评论

    本文标题:Flutter网络请求

    本文链接:https://www.haomeiwen.com/subject/tpbsxktx.html