flutter dio 源码解析2

Future<Response<T>> _dispatchRequest<T>(RequestOptions reqOpt) async {
  var cancelToken = reqOpt.cancelToken;
  ResponseBody responseBody;
  try {
    //data 转流
    var stream = await _transformData(reqOpt);
    //返回数据(下个代码块分析) 数据是以流的形式保存, 后面会转换格式
    responseBody = await httpClientAdapter.fetch(
    ...省略
    );

    responseBody.headers = responseBody.headers;
    var headers = Headers.fromMap(responseBody.headers);
    //创建Response  responseBody 给值
    var ret = Response<T>(
      headers: headers,
      requestOptions: reqOpt,
      redirects: responseBody.redirects ?? [],
      isRedirect: responseBody.isRedirect,
      statusCode: responseBody.statusCode,
      statusMessage: responseBody.statusMessage,
      extra: responseBody.extra,
    );
    //判断状态
    var statusOk = reqOpt.validateStatus(responseBody.statusCode);
    if (statusOk || reqOpt.receiveDataWhenStatusError == true) {
      //是否需要转换
      var forceConvert = !(T == dynamic || T == String) &&
          !(reqOpt.responseType == ResponseType.bytes ||
              reqOpt.responseType == ResponseType.stream);
      String? contentType;
      if (forceConvert) {
        //设置头
        contentType = headers.value(Headers.contentTypeHeader);
        headers.set(Headers.contentTypeHeader, Headers.jsonContentType);
      }
      //实际处理者 DefaultTransformer.transformResponse 根据返回数据类型转换为具体的数据格式
      ret.data =
      (await transformer.transformResponse(reqOpt, responseBody)) as T?;
      if (forceConvert) {
        headers.set(Headers.contentTypeHeader, contentType);
      }
    } else {
      await responseBody.stream.listen(null).cancel();
    }
    //继续是否取消请求
    checkCancelled(cancelToken);
    if (statusOk) {
      //返回ret
      return checkIfNeedEnqueue(interceptors.responseLock, () => ret);
    } else {
      throw DioError(
        requestOptions: reqOpt,
        response: ret,
        error: 'Http status error [${responseBody.statusCode}]',
        type: DioErrorType.response,
      );
    }
  } catch (e) {
    throw assureDioError(e, reqOpt);
  }

分析请求

@override
Future<ResponseBody> fetch(
    RequestOptions options,
    Stream<Uint8List>? requestStream,
    Future? cancelFuture,
    ) async {
  //创建httpClient
  var _httpClient = _configHttpClient(cancelFuture, options.connectTimeout);
  //打开链接
  var reqFuture = _httpClient.openUrl(options.method, options.uri);


  late HttpClientRequest request;
  try {
    request = await reqFuture;
    if (options.connectTimeout > 0) {
      request = await reqFuture
          .timeout(Duration(milliseconds: options.connectTimeout));
    } else {
      request = await reqFuture;
    }

    //设置 Headers
    options.headers.forEach((k, v) {
      if (v != null) request.headers.set(k, '$v');
    });
  }
  if (requestStream != null) {
    // 添加data流
    var future = request.addStream(requestStream);
    if (options.sendTimeout > 0) {
      future = future.timeout(Duration(milliseconds: options.sendTimeout));
    }
    try {
      //开始发送
      await future;
    } 
  }
  //关闭接收
  var future = request.close();
  if (options.receiveTimeout > 0) {
    future = future.timeout(Duration(milliseconds: options.receiveTimeout));
  }
  late HttpClientResponse responseStream;
  try {
    responseStream = await future;
  }
  //返回流换转
  var stream =
  responseStream.transform<Uint8List>(StreamTransformer.fromHandlers(
...省略
  ));
return ResponseBody(
  stream,
  responseStream.statusCode,
  headers: headers,
  isRedirect:
      responseStream.isRedirect || responseStream.redirects.isNotEmpty,
  redirects: responseStream.redirects
      .map((e) => RedirectRecord(e.statusCode, e.method, e.location))
      .toList(),
  statusMessage: responseStream.reasonPhrase,
);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值