Code Monkey home page Code Monkey logo

cfug / dio Goto Github PK

View Code? Open in Web Editor NEW
12.2K 167.0 1.5K 4.51 MB

A powerful HTTP client for Dart and Flutter, which supports global settings, Interceptors, FormData, aborting and canceling a request, files uploading and downloading, requests timeout, custom adapters, etc.

Home Page: https://dio.pub

License: MIT License

Dart 90.50% Java 0.03% Objective-C 0.16% Shell 0.09% Kotlin 0.02% Ruby 0.53% Swift 0.23% CMake 3.68% C++ 4.12% C 0.28% HTML 0.36%
flutter dart adapter http network timeout transformer cancellable dio interceptor

dio's Introduction

dio

Language: English | 简体中文

This is the base repo of the dio project. Please move specific paths for project instructions.

Don't forget to add #dio topic to your published dio related packages! See more: https://dart.dev/tools/pub/pubspec#topics

Versioning

Before you upgrade: Breaking changes might happen in major and minor versions of packages.
See the Migration Guide for the complete breaking changes list.

To know about our compatibility policy, see the Compatibility Policy doc.

All Packages

dio

Plugins

  • cookie_manager: link Pub
  • compatibility_layer: link Pub
  • http2_adapter: link Pub
  • native_dio_adapter: link Pub

Examples

  • example: link
  • example_flutter_app: link

Copyright & License

The project and its underlying projects are originally authored by @wendux with the organization @flutterchina, started being maintained by Chinese Flutter User Group (@cfug) since 2023.

The project consents the MIT license.

Star History

Star History Chart

dio's People

Contributors

alexv525 avatar amondnet avatar cfug-dev avatar cvlnomen avatar dependabot[bot] avatar feicien avatar gabrielaraujoz avatar github-actions[bot] avatar harsimranmaan avatar hgraceb avatar hongyiweiwu avatar insofan avatar ipcjs avatar jgoyvaerts avatar kuhnroyal avatar natsuk4ze avatar passer-by avatar passsy avatar riven-spell avatar rodion-m avatar skreborn avatar sunhapper avatar talisk avatar themisir avatar ueman avatar vovcharaa avatar weikx avatar wendux avatar yebgi83 avatar yfdyh000 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

dio's Issues

用FormData上传多张图片问题

FormData formData = new FormData.from({
   "name": "wendux",
   "age": 25,
   "file1": new UploadFileInfo(new File("./upload.txt"), "upload1.txt")
   "file2": new UploadFileInfo(new File("./upload.txt"), "upload2.txt")
});
response = await dio.post("/info", data: formData)

用改方法, 上传多张的时候, 发现服务端(Go/Gin写的), MultipartForm() 里面只能发现 file1

用postman 测试正常

用postman 测试, key 能用一个, 例如 files, 如果也能操作 后台开发能方便一点

@wendux

[Request Feature] Add Query param to Options

Dear author, thanks for useful package.
I think we should add Query param to Options for easily use with GET method like this:

/products?search=How to become a hero like LyNam

Or we can allow add Uri type with path param beside just String.

Currently, i make by hand like this:

var url = _buildPath(path, {
  'search': 'How to become a hero like LyNam'
});

var result = await dio.post(url,....);

String _buildPath(String path, Map<String, String> query) {
    String url = path;
    if (query != null) {
      url += "?";
      var temp = "";
      query.forEach((k, v) {
        if (v != null && v.isNotEmpty)
          temp += "&$k=$v";
      });

      url += temp.replaceFirst("&", "");
      url = url.replaceFirst("?", "", url.length - 1);
    }
    
    return url;
  }

onProgress for FormData file upload

How could I go about adding an onProgress callback for file uploads similar to what you have for downloads? This would all me to give the user feedback about the upload (progress bar).

Access the HTTP address error FormatException: Bad utf-8 encoding 0x89

dio: ^0.1.7

Access the HTTP address error FormatException: Bad utf-8 encoding 0x89, the correct return content of HTTP is binary

try {
       Response responses = await DioUtils.DioHttp().post(url, data: formData);
       print('返回:${responses.data.toString()}');
     }on DioError catch(e){
       print('错误:'+e.message);
     }

错误:FormatException: Bad UTF-8 encoding 0x89 (at offset 0)

Error with File in Form Data

The other request goes through fine, but when I reach this bit of code it throws an error.

FormData formData = new FormData.from({
        "fileData": new UploadFileInfo(
            _uploadFile, basename(_uploadFile.path))
      });

Example

  void uploadVideo(BuildContext context, File _uploadFile) async {
    final _name = "Test Video Here";
    final _description = "This is a test description";
    if (_controller == null) {
      globals.Utility
          .showAlertPopup(context, "Info", "Video Required for Upload!");
    } else {
      final _ks = await globals.Utility.getKalturaSession();
      String _token = "";
      //  Add Video
      await http
          .get(
              'https://www.kaltura.com/api_v3/service/uploadtoken/action/add?ks=$_ks&format=1')
          .then((response) {
        Map<String, dynamic> _json = json.decode(response.body);
        _token = _json['id'].toString();
        print('"Token: $_token');
      });

      //  Upload Video
      String _url =
          "https://www.kaltura.com/api_v3/service/uploadtoken/action/upload?ks=$_ks&format=1&uploadTokenId=$_token&resume=false&finalChunk=true&resumeAt=-1";
      print("Path: " + _uploadFile.uri.toString());
      
      Dio dio = new Dio();
      Response response;
      FormData formData = new FormData.from({
        "fileData": new UploadFileInfo(
            _uploadFile, basename(_uploadFile.path))
      });
      response = await dio.post(_url, data: formData);
      print("RESPONSE: " + response.data.toString());

      //  Update Video Info (Name, Desctiption, Tags)
      var _formName = Uri.encodeQueryComponent(r'mediaEntry[name]');
      var _formDesription =
          Uri.encodeQueryComponent(r'mediaEntry[description]');
      var _formTags = Uri.encodeQueryComponent(r'mediaEntry[tags]');
      var _formType = Uri.encodeQueryComponent(r'mediaEntry[mediaType]');
      await http
          .get(
              'https://www.kaltura.com/api_v3/service/media/action/addFromUploadedFile?ks=$_ks&format=1&$_formTags=${globals.userCompanyID}&$_formName=$_name&$_formDesription=$_description&uploadTokenId=$_token&$_formType=1')
          .then((response) {
        print('Updated Info...');
        Map<String, dynamic> _json = json.decode(response.body);
        //  Verify Upload
        globals.videoID = "" + _json["id"].toString();

        if (globals.videoID.length > 1) {
          globals.Utility
              .showAlertPopup(context, "Info",
                  "The video you just uploaded will be avalible in 'Videos' when it finishes processing.")
              .then((onValue) {
            Navigator.pop(context);
          });
        } else {
          globals.Utility
              .showAlertPopup(context, "Info",
                  "There was an error uploading the video, please try again later.")
              .then((onValue) {
            Navigator.pop(context);
          });
        }
      });
    }
  }

Error

E/flutter ( 2547): [ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception:
E/flutter ( 2547): type '_InternalLinkedHashMap<dynamic, dynamic>' is not a subtype of type 'Map<String, dynamic>' where
E/flutter ( 2547):   _InternalLinkedHashMap is from dart:collection
E/flutter ( 2547):   Map is from dart:core
E/flutter ( 2547):   String is from dart:core
E/flutter ( 2547):
E/flutter ( 2547): #0      new FormData.from (package:dio/src/FormData.dart:29:12)
E/flutter ( 2547): #1      _CameraPageState.uploadVideo (package:Unify_Mobile/camera.dart:167:31)
E/flutter ( 2547): <asynchronous suspension>
E/flutter ( 2547): #2      _CameraPageState.build.<anonymous closure> (package:Unify_Mobile/camera.dart:222:17)
E/flutter ( 2547): #3      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:494:14)
E/flutter ( 2547): #4      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:549:30)
E/flutter ( 2547): #5      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:102:24)
E/flutter ( 2547): #6      TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:161:9)
E/flutter ( 2547): #7      TapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:94:7)
E/flutter ( 2547): #8      PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:315:9)
E/flutter ( 2547): #9      PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:73:12)
E/flutter ( 2547): #10     PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:101:11)
E/flutter ( 2547): #11     _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:143:19)
E/flutter ( 2547): #12     _WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:121:22)
E/flutter ( 2547): #13     _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:101:7)
E/flutter ( 2547): #14     _WidgetsFlutterBinding&BindingBase&GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:64:7)
E/flutter ( 2547): #15     _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:48:7)
E/flutter ( 2547): #16     _invoke1 (dart:ui/hooks.dart:134:13)
E/flutter ( 2547): #17     _dispatchPointerDataPacket (dart:ui/hooks.dart:91:5)

Flutter Doctor

Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel beta, v0.3.2, on Mac OS X 10.13.4 17E199, locale en-US)
[✓] Android toolchain - develop for Android devices (Android SDK 27.0.3)
[✓] iOS toolchain - develop for iOS devices (Xcode 9.3)
[✓] Android Studio (version 3.1)
[✓] VS Code (version 1.23.1)
[✓] Connected devices (3 available)

• No issues found!

Get JSON response.data got error "NoSuchMethodError: The getter 'loader' was called on null.".

Problem

Access response.data got error "NoSuchMethodError: The getter 'loader' was called on null.".

compiler message: Unhandled exception:
compiler message: NoSuchMethodError: The getter 'loader' was called on null.
compiler message: Receiver: null
compiler message: Tried calling: loader
compiler message: #0      Object.noSuchMethod (dart:core-patch/dart:core/object_patch.dart:46)
compiler message: #1      IncrementalCompiler.compileExpression.<anonymous closure> (package:front_end/src/fasta/incremental_compiler.dart:429)
compiler message: <asynchronous suspension>
compiler message: #2      CompilerContext.runInContext.<anonymous closure>.<anonymous closure> (package:front_end/src/fasta/compiler_context.dart:118)
compiler message: #3      new Future.sync (dart:async/future.dart:222)
compiler message: #4      CompilerContext.runInContext.<anonymous closure> (package:front_end/src/fasta/compiler_context.dart:118)
compiler message: #5      _rootRun (dart:async/zone.dart:1126)
compiler message: #6      _CustomZone.run (dart:async/zone.dart:1023)
compiler message: #7      _runZoned (dart:async/zone.dart:1518)
compiler message: #8      runZoned (dart:async/zone.dart:1465)
compiler message: #9      CompilerContext.runInContext (package:front_end/src/fasta/compiler_context.dart:117)
compiler message: #10     IncrementalCompiler.compileExpression (package:front_end/src/fasta/incremental_compiler.dart:428)
compiler message: <asynchronous suspension>
compiler message: #11     IncrementalCompiler.compileExpression (package:vm/incremental_compiler.dart:103)
compiler message: #12     FrontendCompiler.compileExpression (package:vm/frontend_server.dart:448)
compiler message: <asynchronous suspension>
compiler message: #13     _FlutterFrontendCompiler.compileExpression (package:frontend_server/server.dart:55)
compiler message: #14     listenAndCompile.<anonymous closure> (package:vm/frontend_server.dart:650)
compiler message: <asynchronous suspension>
compiler message: #15     _RootZone.runUnaryGuarded (dart:async/zone.dart:1316)
compiler message: #16     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:336)
compiler message: #17     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:263)
compiler message: #18     _SinkTransformerStreamSubscription._add (dart:async/stream_transformers.dart:68)
compiler message: #19     _EventSinkWrapper.add (dart:async/stream_transformers.dart:15)
compiler message: #20     _StringAdapterSink.add (dart:convert/string_conversion.dart:268)
compiler message: #21     _LineSplitterSink._addLines (dart:convert/line_splitter.dart:154)
compiler message: #22     _LineSplitterSink.addSlice (dart:convert/line_splitter.dart:129)
compiler message: #23     StringConversionSinkMixin.add (dart:convert/string_conversion.dart:189)
compiler message: #24     _SinkTransformerStreamSubscription._handleData (dart:async/stream_transformers.dart:120)
compiler message: #25     _RootZone.runUnaryGuarded (dart:async/zone.dart:1316)
compiler message: #26     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:336)
compiler message: #27     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:263)
compiler message: #28     _SinkTransformerStreamSubscription._add (dart:async/stream_transformers.dart:68)
compiler message: #29     _EventSinkWrapper.add (dart:async/stream_transformers.dart:15)
compiler message: #30     _StringAdapterSink.add (dart:convert/string_conversion.dart:268)
compiler message: #31     _StringAdapterSink.addSlice (dart:convert/string_conversion.dart:273)
compiler message: #32     _Utf8ConversionSink.addSlice (dart:convert/string_conversion.dart:348)
compiler message: #33     _Utf8ConversionSink.add (dart:convert/string_conversion.dart:341)
compiler message: #34     _ConverterStreamEventSink.add (dart:convert/chunked_conversion.dart:86)
compiler message: #35     _SinkTransformerStreamSubscription._handleData (dart:async/stream_transformers.dart:120)
compiler message: #36     _RootZone.runUnaryGuarded (dart:async/zone.dart:1316)
compiler message: #37     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:336)
compiler message: #38     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:263)
compiler message: #39     _StreamController&&_SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:763)
compiler message: #40     _StreamController._add (dart:async/stream_controller.dart:639)
compiler message: #41     _StreamController.add (dart:async/stream_controller.dart:585)
compiler message: #42     _Socket._onData (dart:io-patch/socket_patch.dart:1672)
compiler message: #43     _RootZone.runUnaryGuarded (dart:async/zone.dart:1316)
compiler message: #44     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:336)
compiler message: #45     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:263)
compiler message: #46     _StreamController&&_SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:763)
compiler message: #47     _StreamController._add (dart:async/stream_controller.dart:639)
compiler message: #48     _StreamController.add (dart:async/stream_controller.dart:585)
compiler message: #49     new _RawSocket.<anonymous closure> (dart:io-patch/socket_patch.dart:1245)
compiler message: #50     _NativeSocket.issueReadEvent.issue (dart:io-patch/socket_patch.dart:797)
compiler message: #51     _microtaskLoop (dart:async/schedule_microtask.dart:41)
compiler message: #52     _startMicrotaskLoop (dart:async/schedule_microtask.dart:50)
compiler message: #53     _runPendingImmediateCallback (dart:isolate-patch/dart:isolate/isolate_patch.dart:113)
compiler message: #54     _RawReceivePortImpl._handleMessage (dart:isolate-patch/dart:isolate/isolate_patch.dart:166)
Application finished.

Code

import 'dart:io';
import 'dart:async';
import 'package:dio/dio.dart';
import 'package:logging/logging.dart';

import '../config.dart';
import '../factory.dart';

class TangboleService {
  final Logger logger;
  final Dio client;

  TangboleService()
      : this.logger = TangboleFactory().getLogger('service'),
        this.client = Dio() {
    this.client.options.baseUrl = TangboleConfig.tangboleApiBaseUrl;
    this.client.options.connectTimeout = 5000;
    this.client.options.receiveTimeout = 10000;

    if (TangboleConfig.isLogService) {
      this.client.interceptor.request.onSend = (Options options) {
        logger.fine(
            'TangboleService(method: ${options.method}, path: ${options.path}, data: ${options.data})');
        return options;
      };
      this.client.interceptor.response.onSuccess = (Response response) {
        logger.fine(
            'TangboleService(status: ${response.statusCode}, data: ${response.data})');
        return response;
      };
      this.client.interceptor.response.onError = (DioError e) {
        logger.fine('TangboleService(error: $e)');
        return e;
      };
    }
  }

  Future<TangboleApiResponse> request(String method, String path,
      {dynamic data, Duration timeout}) async {
    client.options.method = method;
    if (timeout != null) client.options.receiveTimeout = timeout.inMilliseconds;

    Response response;
    try {
      client.cookieJar = await TangboleFactory().getCookieJar();

      response =
          await client.request(path, data: data, options: client.options);
    } catch (e) {
      return TangboleApiResponse(
        code: TangboleApiResponseCode.request_timeout,
        message: e.toString(),
      );
    }

    if (response.statusCode == HttpStatus.ok) {
      return TangboleApiResponse.fromJson(response.data);
    } else {
      return TangboleApiResponse(
        code: TangboleApiResponseCode.response_status_not_ok,
        message: response.statusCode.toString(),
      );
    }
  }

class TangboleApiResponse {
  final int code;
  final String message;
  final dynamic data;

  TangboleApiResponse({
    this.code = TangboleApiResponseCode.ok,
    this.message = "",
    this.data,
  });

  TangboleApiResponse.fromJson(Map<String, dynamic> json)
      : this(
          code: json['code'] as int,
          message: json['message'] as String,
          data: json['data'],
        );

  Map<String, dynamic> toJson() => {
        'code': code,
        'message': message,
        'data': data,
      };

  @override
  String toString() => 'TangboleApiResponse${toJson()}';
}

class TangboleApiResponseCode {
  static const int ok = 0;
  static const int server_internal_error = -1;
  static const int request_timeout = -2;
  static const int response_status_not_ok = -3;
}

大量下载图片时部分图片损坏

频繁调用Dio.download方法时,比如有2000个下载任务,下载的部分图片是损坏的,这是什么原因呢,有什么办法可以避免这种情况呢

建议Option新增followRedirects参数

有时需要获得301的location数据,而不是自动处理跳转。
Option增加这个参数之后,在dio.dart里加入下面的代码,就能实现了
request.followRedirects = options.followRedirects;

Example of how to write binary download to disk ?

Hi,
I am trying to download a zipfile and store the resulting zip file to disk.

Options options= new Options(
    responseType: ResponseType.STREAM
);
Dio dio = new Dio(options);
Response response=await dio.get(url);
File file = new File(outputDirectory+ filename);
await file.writeAsBytes(response.data);

writeAsBytes doesnt seem to return.

Do you have an example of how to do this ?

使用FormData 调用php的表单上传文件接口不行

Steps to Reproduce

使用formData 的post请求,php服务器接口能收取到非file的其他字段属性
但是通过 $request->file() 获取 uploadFileinfo的字段 获取不到上传文件的内容

Logs

服务器试图解析上传的file内容返回500错误

Self-signed certificate?

How would I go about accepting a self signed certificate?

E/flutter ( 7824): [ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception:
E/flutter ( 7824): DioError [DioErrorType.DEFAULT]: HandshakeException: Handshake error in client (OS Error:
E/flutter ( 7824):      CERTIFICATE_VERIFY_FAILED: self signed certificate(handshake.cc:363))

post的时候FormatException: Bad UTF-8 encoding 0xc2

post 数据:
{entry: weibo, gateway: 1, from: , savestate: 7, useticket: 1, pagerefer: https://passport.weibo.com, vsnf: 1, su: MTM1NTQ5OTgyMjU=, service: miniblog, servertime: 1535992812, nonce: HCNYJ3, pwencode: rsa2, rsakv: 1330428213, sp: 505790cf67616561d46afd5ba4842540c749b7c274e0b658fd0ef417f90d82a321144dfa9206a74e71e832daa480a7e650d33ff385a5b99c1842f2144c0de75be316cdb690d69e50a9f6955d24ee765df1b1a551a0967d1f86d7d9c5d27b1fa2e609c086f6a8d30a261a16d419d827bffd907e14472ecc41a4a6b20f3181dd28, sr: 1366*768, encoding: UTF-8, prelt: 115, cdult: 38, url: http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack, returntype: TEXT, door: 333}
请求的函数。
Response response = await httpRequest.post(
loginUrl,
data: loginPostData,
options: Options(
contentType: ContentType.json,
responseType: ResponseType.JSON,
headers: headers,
),
);

是否有办法调试?

FormatException: Invalid character in cookie name, code unit: '91'

一直报DioError [DioErrorType.DEFAULT]: FormatException: Invalid character in cookie name, code unit: '91'错误。。。

使用步骤如下(基本按照官方教程):
1.定义了个全局的Dio:
static final _options = Options(
connectTimeout: 15000,
receiveTimeout: 15000,
responseType: ResponseType.PLAIN,
);
static final _dio = Dio(_options);
2.get方法
static Future get(BuildContext context, url) async {
try {
var response = await _dio.get(
'http://xxxxxxxxx?xxx=xxx&xxxx=xxxx',
);
return _convert(context, response);
} catch (e) {
debugPrint('get request error = $e');
_error(context, '网络错误,请稍后重试');
}
return null;
}
3.报错:
DioError [DioErrorType.DEFAULT]: FormatException: Invalid character in cookie name, code unit: '91'

一开始以为是cookie没设置,但是设置了cookie也不行,不管是用dio自带的defaultcookiejar还是那个持久化的cookiejar,抑或是自己写了一个cookie jar,始终抱着个错误……

https相关问题

因为ios要求必须使用https协议
而我们的服务器是自签名服务器,没有经过CA
dio底层使用httpclient来进行网络访问
而HttpClient又只支持构造方法创建自签名证书的相关配置
下版本能否增加httpClient的修改或者注入的相关配置

服务器返回的错误是input is null

 公司内部项目,不方便提供复现步骤,说一下问题吧;
 问题是出在Post请求,一直报错 ,返回错误信息如下:

{result: null, targetUrl: null, success: false, error: {code: 0, message: Your request is not valid!, details: The following errors were detected during validation.

  • input is null!

, validationErrors: [{message: input is null!, members: [input]}]}, unAuthorizedRequest: false, __abp: true}

但是用postman 测试是好用的,这个post请求是可以的
body->raw->JSON(application/json) 将数据的json文本填入其中,请求返回数据正常,
但是如果body中什么也不填,会得到上面同样的错误信息。

所以以为是没有给body赋值成功,故打印request.data ,发现是有数据的,而且是已经json过的

另外,用Dart Team的http 插件,post是可以成功的,不过赋值的参数名是body,很是疑惑

WHY?

How to handled error in onError ?

Dear author, i handled error in onError, so i don't want use try catch it again in my code. How to do that ?
i tried return null; in onError but not work.

 dynamic _onError(DioError e) {
    // handled..
   // ....
    return null; // <---
  }

currently i must do this to ignore exception, because it was handled as above:

try {
var response = await dio.post(....);
} catch (e) {}

使用cookiejar 报错

_dio.cookieJar = new PersistCookieJar();

[VERBOSE-2:dart_error.cc(16)] Unhandled exception:
FileSystemException: Creation failed, path = './.cookies/' (OS Error: Permission denied, errno = 13)
#0 _Directory.createSync (dart:io/directory_impl.dart:140:7)

ResponseType设置为Json不生效

ResponseType设置为JSON,返回的请求体还是String的,所以在接收请求结果时就报错DioError [DioErrorType.DEFAULT]: type 'String' is not a subtype of type 'Map<String, Object>'等

请问一下,在使用dio时,如何做https证书校验?

Code

  Future createDio() async{
    this.dio = Dio();
    String cerData = await rootBundle.loadString("assets/cc.pem");
    this.dio.onHttpClientCreate = (HttpClient client){
      SecurityContext clientContext = SecurityContext(withTrustedRoots: true)
        ..useCertificateChainBytes(utf8.encode(cerData));
      return HttpClient(context: clientContext);
    };
    this.dio.interceptor.request.onSend = (Options options){
      return options;
    };
  }

但是,这貌似不是用来做证书校验的,
所以,求解一下正确的姿势

type 'Future<dynamic>' is not a subtype of type 'Future<Response<dynamic>>'

[VERBOSE-2:dart_error.cc(16)] Unhandled exception:
type 'Future<dynamic>' is not a subtype of type 'Future<Response<dynamic>>' where
  Future is from dart:async
  Future is from dart:async
  Response is from package:dio/src/Response.dart

#0      Dio._onError (package:dio/src/Dio.dart:526:12)
#1      Dio._makeRequest.<anonymous closure> (package:dio/src/Dio.dart:420:28)
#2      Dio._checkIfNeedEnqueue (package:dio/src/Dio.dart:554:22)
#3      Dio._makeRequest (package:dio/src/Dio.dart:416:35)
<asynchronous suspension>
#4      Dio._request.<anonymous closure> (package:dio/src/Dio.dart:316:16)
#5      Dio._checkIfNeedEnqueue (package:dio/src/Dio.dart:554:22)
#6      Dio._request (package:dio/src/Dio.dart:287:31)
<asynchronous suspension>
#7      Dio.request (package:dio/src/Dio.dart:270:12)
<asynchronous suspension>
#8      Dio.get (package:dio/src/Dio.dart:62:12)
#9      UserApi.getUser (package:saytoken_flutter/api/user_api.dart:12:31)
<asynchronous suspension>
#10     _LoginPageState.login (package:<…>
[VERBOSE-2:dart_error.cc(16)] Unhandled exception:
DioError [DioErrorType.DEFAULT]: type 'Future<dynamic>' is not a subtype of type 'Future<Response<dynamic>>' where
  Future is from dart:async
  Future is from dart:async
  Response is from package:dio/src/Response.dart
#0      Dio.resolve (package:dio/src/Dio.dart:112:21)
#1      Dio._onSuccess (package:dio/src/Dio.dart:509:18)
#2      Dio._makeRequest.<anonymous closure> (package:dio/src/Dio.dart:398:57)
#3      Dio._checkIfNeedEnqueue (package:dio/src/Dio.dart:554:22)
#4      Dio._makeRequest (package:dio/src/Dio.dart:393:33)
<asynchronous suspension>
#5      Dio._request.<anonymous closure> (package:dio/src/Dio.dart:316:16)
#6      Dio._checkIfNeedEnqueue (package:dio/src/Dio.dart:554:22)
#7      Dio._request (package:dio/src/Dio.dart:287:31)
<asynchronous suspension>
#8      Dio.request (package:dio/src/Dio.dart:270:12)
<asynchronous suspension>
#9      Dio.get (package:dio/src/Dio.dart:62:12)
#10     UserApi.getUser (package:saytoken_flutter/ap<…>

运行的时候报错。

` var dio = new Dio();
//dio.options.baseUrl = "http://www.dtworkroom.com/doris/1/2.0.0/";
dio.options.baseUrl = "http://localhost/ds/test";
// dio.onHttpClientCreate = (HttpClient client) {
// client.idleTimeout=new Duration(seconds: 0);
// client.findProxy = (uri) {
// //proxy all request to localhost:8888
// return "PROXY localhost:8888";
// };
// };
FormData formData = new FormData.from({
"name": "haha",
"file": new UploadFileInfo(new File("./example/flutter.png"), "flutter.png")
});
// Send FormData
Response response =
await dio.post("http://127.0.0.1:8123/upload", data: formData);
print(response);

`

type '_InternalLinkedHashMap<dynamic, dynamic>' is not a subtype of type 'Map<String, dynamic>'
具体原因可能最新版flutter自带的dart修改了一些MAP方法了。

flutter 添加图片到formdata出错

/**
   * 更新用户信息
   */
  Future<Stream<BaseJsonBean>> updateUserInfo(
      File file, String userName, String description) {
    print("file = $file");
    FormData formData = FormData.from({
      "userName": userName,
      "description": description,
      "file": UploadFileInfo(file, "filename.jpg")
    });

    return _dioPut("/users", formData, (json) {
      return BaseJsonBean.fromJson(json);
    });
  }

  Future<Stream<T>> _dioPut<T>(
      var path, FormData formData, T fromJson(dynamic json)) async {
    return _dio
        .put(path, data: formData)
        .then((response) => response.data)
        .then(fromJson)
        .asStream();
  } 

调用方法后报错

I/flutter (16289): file = File: '/storage/emulated/0/Pictures/Screenshots/S80424-171652.jpg'
V/SettingsInterface(16289):  from settings cache , name = sound_effects_enabled , value = 1
E/flutter (16289): [ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception:
E/flutter (16289): DioError [DioErrorType.DEFAULT]: Converting object to an encodable object failed: Instance of 'UploadFileInfo'#0      _JsonStringifier.writeObject (dart:convert/json.dart:705:7)
E/flutter (16289): #1      _JsonStringifier.writeMap (dart:convert/json.dart:788:7)
E/flutter (16289): #2      _JsonStringifier.writeJsonValue (dart:convert/json.dart:743:21)
E/flutter (16289): #3      _JsonStringifier.writeObject (dart:convert/json.dart:695:9)
E/flutter (16289): #4      _JsonStringStringifier.printOn (dart:convert/json.dart:904:17)
E/flutter (16289): #5      _JsonStringStringifier.stringify (dart:convert/json.dart:886:5)
E/flutter (16289): #6      JsonEncoder.convert (dart:convert/json.dart:287:30)
E/flutter (16289): #7      JsonCodec.encode (dart:convert/json.dart:186:45)
E/flutter (16289): #8      DefaultTransformer.transformRequest (package:dio/src/TransFormer.dart:72:21)
E/flutter (16289): <asynchronous suspension>
E/flutter (16289): #9      Dio._transformData (package:dio/src/Dio.dart:473:32)
E/flutter (16289): <asynchronous suspension>
E/flutter (16289): #10     Dio._makeRequest (package:dio/src/Dio.dart:375:28)
E/flutter (16289): <asynchronous suspension>
E/flutter (16289): #11     Dio._request.<anonymous closure>.<anonymous closure> (package:dio/src/Dio.dart:308:20)
E/flutter (16289): #12     _RootZone.runUnary (dart:async/zone.dart:1381:54)
E/flutter (16289): #13     _FutureListener.handleValue (dart:async/future_impl.dart:129:18)
E/flutter (16289): #14     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:633:45)
E/flutter (16289): #15     Future._propagateToListeners (dart:async/future_impl.dart:662:32)
E/flutter (16289): #16     Future._completeWithValue (dart:async/future_impl.dart:477:5)
E/flutter (16289): #17     Future._asyncComplete.<anonymous closure> (dart:async/future_impl.dart:507:7)
E/flutter (16289): #18     _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
E/flutter (16289): #19     _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
E/flutter (16289): 
E/flutter (16289): #0      _rootHandleUncaughtError.<anonymous closure> (dart:async/zone.dart:1114:29)
E/flutter (16289): #1      _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
E/flutter (16289): #2      _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)

是调用的方式不对吗

Error: Getter not found: 'UTF8'.

今天更新flutter到最新版本(master分支)之后,出现Error: Getter not found: 'UTF8'.可能是dart去除了这些deprecated的类

Logs

compiler message: file:///Users/***/Library/Flutter/flutter/.pub-cache/hosted/pub.flutter-io.cn/dio-0.1.7/lib/src/FormData.dart:103:20: Error: Getter not found: 'UTF8'.
compiler message:       bytes.addAll(UTF8.encode(data.toString()));
compiler message:                    ^^^^
compiler message: file:///Users/***/Library/Flutter/flutter/.pub-cache/hosted/pub.flutter-io.cn/dio-0.1.7/lib/src/FormData.dart:103:20: Error: The getter 'UTF8' isn't defined for the class '#lib1::FormData'.
compiler message: Try correcting the name to the name of an existing getter, or defining a getter or field named 'UTF8'.
compiler message:       bytes.addAll(UTF8.encode(data.toString()));
compiler message:                    ^
compiler message: file:///Users/***/Library/Flutter/flutter/.pub-cache/hosted/pub.flutter-io.cn/dio-0.1.7/lib/src/FormData.dart:134:18: Error: Getter not found: 'UTF8'.
compiler message:     bytes.addAll(UTF8.encode(data.toString()));
compiler message:                  ^^^^
compiler message: file:///Users/***/Library/Flutter/flutter/.pub-cache/hosted/pub.flutter-io.cn/dio-0.1.7/lib/src/FormData.dart:134:18: Error: The getter 'UTF8' isn't defined for the class '#lib1::FormData'.
compiler message: Try correcting the name to the name of an existing getter, or defining a getter or field named 'UTF8'.
compiler message:     bytes.addAll(UTF8.encode(data.toString()));

dio delete 服务器返回204报错

error = DioError [DioErrorType.DEFAULT]: FormatException: Unexpected end of input (at character 1)
rest delete成功,服务器返回内容为空,dio报错。

Missing content-type boundary on asp.net core server

Steps to Reproduce

Try to post FormData to server, but not work,
i tried to override Content-type with both boudary, and without boundary too:

options: Options(
        contentType: ContentType.parse("multipart/form-data;boundary=----WebKitFormBoundaryyrV7KO0BoCBuDbTL")
      )

Logs on server

Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/1.1 POST http://localhost:5000/api/profile/update multipart/form-data; --dioBoundary&Happycoding-3794901476 650
Lotus.Startup:Information: [POST] -> /api/profile/update [multipart/form-data; --dioBoundary&Happycoding-3794901476]
The thread 0x31c8 has exited with code 0 (0x0).
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Route matched with {action = "UpdateProfile", controller = "Account"}. Executing action Lotus.Controllers.AccountController.UpdateProfile (Lotus)
Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler:Information: Successfully validated the token.
Microsoft.AspNetCore.Authorization.DefaultAuthorizationService:Information: Authorization was successful.
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executed action Lotus.Controllers.AccountController.UpdateProfile (Lotus) in 13.1288ms
Exception thrown: 'System.IO.InvalidDataException' in System.Private.CoreLib.dll
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware:Error: An unhandled exception has occurred while executing the request.

System.IO.InvalidDataException: Missing content-type boundary.
   at Microsoft.AspNetCore.Http.Features.FormFeature.GetBoundary(MediaTypeHeaderValue contentType, Int32 lengthLimit)
   at Microsoft.AspNetCore.Http.Features.FormFeature.InnerReadFormAsync(CancellationToken cancellationToken)
   at Microsoft.AspNetCore.Mvc.ModelBinding.FormValueProviderFactory.AddValueProviderAsync(ValueProviderFactoryContext context)
   at Microsoft.AspNetCore.Mvc.ModelBinding.CompositeValueProvider.CreateAsync(ActionContext actionContext, IList`1 factories)
   at Microsoft.AspNetCore.Mvc.ModelBinding.CompositeValueProvider.CreateAsync(ControllerContext controllerContext)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerBinderDelegateProvider.<>c__DisplayClass0_0.<<CreateBinderDelegate>g__Bind|0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---

cookie_jar ^0.0.4 is forbidden

Steps to Reproduce

Logs

the current Dart SDK version is 2.1.0-dev.0.0.flutter-be6309690f.

Because cookie_jar 0.0.4 requires SDK version >=1.20.1 <2.0.0 and no versions of cookie_jar match >0.0.4 <0.1.0, cookie_jar ^0.0.4 is forbidden.
So, because idota depends on dio ^1.0.0 which depends on cookie_jar ^0.0.4, version solving failed.
pub get failed (1)

Invalid character in cookie value

Invalid character in cookie value, code unit: '34'

Dio dio = new Dio();
  dio.options = new Options(
      baseUrl: Endpoint.BASE_URL,
      connectTimeout: 5000,
      receiveTimeout: 10000,
      // 5s
      headers: {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
        "Accept-Encoding": "gzip"
      }
  );
Future basePage() async {
    Response response = await client.get("https://www.instagram.com");
    print(response.data);
  }

Preserve File Name

Is there currently any way to keep the name of the file prior to download rather than saving it to a new file name (possibly using a content-disposition header)?

request error with path

StackTrace


[VERBOSE-2:dart_error.cc(16)] Unhandled exception:
DioError [DioErrorType.DEFAULT]: RangeError (index): Invalid value: Only valid value is 0: 1#0      List.[] (dart:core/runtime/libgrowable_array.dart:141:60)
#1      Dio._makeRequest (package:dio/src/Dio.dart:341:30)
<asynchronous suspension>
#2      Dio._request.<anonymous closure> (package:dio/src/Dio.dart:320:16)
#3      Dio._checkIfNeedEnqueue (package:dio/src/Dio.dart:556:22)
#4      Dio._request (package:dio/src/Dio.dart:291:21)
<asynchronous suspension>
#5      Dio.request (package:dio/src/Dio.dart:274:12)
<asynchronous suspension>
#6      Dio.post (package:dio/src/Dio.dart:75:12)
#7      __LoginPageState&State&SizeUtils&HttpHelper.fetchWithDio (package:my_app/util/utils.dart:98:30)
<asynchronous suspension>
#8      _LoginPageState._login (package:my_app/pages/LoginPage.dart:366:32)
<asynchronous suspension>
#9      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:494:14)
#10     _InkResponseState.build.<anonymous <…>

my code

Dio dio = new Dio()
  ..options.baseUrl = new HttpUrl.get().host + "/"
  ..options.connectTimeout = 5000
  ..options.receiveTimeout = 5000;
var data = new FormData.from(params);
    data.add("a", httpUrl);
    data.add("m", url.m);
    var response = await dio.post("rest.php", data: data);
    return response.data;

describe

My base url is http://www.xxx.com/rest.php.

Using the parameters of the form to distinguish the business logic.

If URL does not apply to restful, can you not use your plugin?

https over self-signed certificate

'CERTIFICATE_VERIFY_FAILED' exception is thrown, when connection to server with self-signed certificate.

var url = 'https://jsonplaceholder.typicode.com/posts/1';
Dio dio = new Dio();
await dio.get(url).then((response){
  print(response.data);
}).catchError((err){
   print(err);
});

validateStatus不起作用

void init() async {
    Options options = new Options(
        baseUrl: BASE_URL, connectTimeout: 30000, receiveTimeout: 30000);
    _dio = Dio(options);
    _dio.options.contentType =
        ContentType.parse("application/x-www-form-urlencoded");
    Directory tempDir = await getTemporaryDirectory();
    String tempPath = tempDir.path;
    _dio.cookieJar = new PersistCookieJar(tempPath);


    _dio.options.validateStatus = (int status) {
      print("status code = $status");
      return true;
    };


    _dio.interceptor.request.onSend = (options) {
      if (options.path != "/sessions") {
        options.headers["Authorization"] = "Bearer ${getToken()}";
      }

      print("request====== path = ${options.path} method = ${options.method}");
      options.headers.forEach((s, list) {
        print("key = $s, value = $list");
      });
      print("request====== end");

      return options;
    };
  }
```

```
flutter: before init
flutter: after init
flutter: build
flutter: init Instance of 'SharedPreferences'
flutter:  welcome dispose
flutter: account = 13428934452, password = 123456
flutter: request====== path = /sessions method = POST
flutter: request====== end
flutter: error = DioError [DioErrorType.RESPONSE]: Http status error [422]
```

Repeat a request after getting a fresh JWT token on 401

I'm considering to switch my app repositories to use dio for all http requests, it looks really promising!

What is the best approach to refresh a JWT token with dio? Is there an easy way to get a fresh token and repeat the request with the fresh token after it got a 401?

restful api 非200状态码问题

我们的服务端用的是标准的restful api,就是有些响应不一定是200,比方说创建用户成功返回201,但是我发现dio会认为非200的状态码都是错误的,这个问题可以解决一下吗?

'_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'String'

So I am getting this Error on my data which is a Map. The request still completes (data changes on the server but can't get rid of this error) my code:

 Dio dio = new Dio();
  try {
    Response response = await dio.put(
      Uri.encodeFull(api+"/api/v1/auth/me/"), 
      options: new Options(headers: {
        "Authorization": "Token $token",
        "Content-Type": "application/json",
      }, 
      data: {
        "last_name": user.firstName,
        "first_name": user.lastName,
        "telephone": telephone,
        "send_notices": reminders.toString(),
      },
    ));

    if (response.statusCode != 400) {
      var data = json.decode(response.data);
      print(data);
      return true;
    }
  } catch (e) {
    print("Error updating UserInfo: $e");
  }

  return false;
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.