Flutter进行HTTP请求并保存登陆状态(dio)

hello, I'm Shendi
记录一下

文章目录

引入库 使用 指定超时时间 设置请求头 保留登录凭证(Session) 响应


引入库

使用到了 dio 于是要在 pubspec.yaml 中引入

dependencies:
	# 我这里使用的版本是 4.0.1,可根据自己需求选择
	dio: ^4.0.1

在需要使用的地方导入

import 'package:dio/dio.dart';

使用

dio的github: https://github.com/flutterchina/dio

官方简单的案例

import 'package:dio/dio.dart';
void getHttp() async {
  try {
    var response = await Dio().get('http://www.google.com');
    print(response);
  } catch (e) {
    print(e);
  }
}

所有 http 操作都需要在 async 修饰的函数内执行(异步)
// 首先可以定义一个 dio 对象
var dio = Dio();

// 取消重定向
dio.options.followRedirects = false;
// 当响应状态不为200时,会拿不到响应数据,于是要先进行设置
dio.options.validateStatus = (status) {
  return status! < 500;
};

// 发送http请求,首先需要确保函数是 async 的
login() async {
	// 发送 get 请求, get请求的参数接在url后面, 返回一个响应对象
	Response resp = await dio.get("url?参数1=值&参数2=值");
	
	// 发送 post 请求,post 请求的参数需要格外设置
	resp = await dio.post("url", data: {"参数1":"值", "参数2", "值"});
	// 或
	var data = FormData.fromMap({
      "参数1": "值",
      "参数2": "值",
    });
	resp = await dio.post("url", data: data);
}

指定超时时间

一般都需要设置请求的超时时间

// 其中seconds是秒
await dio.post("").timeout(const Duration(seconds: 3))

设置请求头

var dio = Dio();
dio.options.headers["请求头键名称"] = "值";

更多请求设置可以直接看文档 https://github.com/flutterchina/dio#request-options


保留登录凭证(Session)

当使用到了 Session ,例如登录后才可执行其他操作,则需要手动设置 session

Session 在 http 请求的 cookie 中,根据不同服务器, Session的名称不同,例如Tomcat的为 (JSESSIONID)

一般首先需要登录,当我们第一次请求服务器时,此时没有session则,响应头会携带 set-cookie,set-cookie中的内容需要保存下来,在下次请求的时候带上此Cookie则可以保存状态了

例如请求登录接口

var cookie;
var dio = Dio();
login() async {
	dio.options.followRedirects = false;
    dio.options.validateStatus = (status) {
      return status! < 500;
    };
	
	// 在其他请求加上这一行就可以
	if (cookie != null) dio.options.headers["Cookie"] = loginData.cookie;
	
    Response resp = await dio.get('接口地址').timeout(const Duration(seconds: 3));
    // 如果有 set-cookie 则保存下来
    if (resp.headers["set-cookie"] != null) {
      cookie = resp.headers["set-cookie"].toString();
      cookie = cookie.substring(1, cookie.length - 1);
    }
}

响应

{
  /// Response body. may have been transformed, please refer to [ResponseType].
  // 响应数据
  T? data;
  /// Response headers. 响应头
  Headers headers;
  /// The corresponding request info.
  Options request;
  /// Http status code. 响应状态码
  int? statusCode;
  String? statusMessage;
  /// Whether redirect 
  bool? isRedirect;  
  /// redirect info    
  List<RedirectInfo> redirects ;
  /// Returns the final real request uri (maybe redirect). 
  Uri realUri;    
  /// Custom field that you can retrieve it later in `then`.
  Map<String, dynamic> extra;
}
来源url
栏目