dio icon indicating copy to clipboard operation
dio copied to clipboard

Docs for merging between `Options` and `BaseOptions` are not clear

Open feinstein opened this issue 2 months ago • 12 comments

Request Statement

I want to reuse my dio instance, to take advantage of all the interceptors, timeouts and other things that were configured inside it. I have one HTTP GET request that needs to be done in another base URL tough, so I need to modify the base URL and the responseType. I tried this, but it doesn't work:

    final options = Options().compose(dio.options.copyWith(baseUrl: '', responseType: ResponseType.bytes), url);
    final response = await dio.get<Uint8List?>(url, options: options);

The idea was to create a new options object that has all the current options of my dio instance, just changing the baseUrl and responseType. This doesn't work because compose returns a RequestOptions and get needs an Options object.

The kinds of objects that dio creates limits the flexibility of the package and makes the API kinda confuse.

The only way I managed to get this to work was by doing:

final options = Options().compose(
      dio.options.copyWith(
        baseUrl: '',
        method: 'GET',
        responseType: ResponseType.bytes,
      ),
      url,
    );
    final response = await dio.fetch<Uint8List?>(options);

Solution Brainstorm

No response

feinstein avatar Apr 20 '24 12:04 feinstein

Pseudo:

const baseDartUrl = 'https://dart.dev';
const baseFlutterUrl = 'https://flutter.dev';

void main() async {
  final dio = Dio(BaseOptions(baseUrl: baseDartUrl));
  final requestWithDart = await dio.get('/');
  final requestWithFlutter = await dio.get('$baseFlutterUrl/');
}

AlexV525 avatar Apr 20 '24 13:04 AlexV525

I have a genetic method that makes requests to a complete url variable. I remember passing the variable to get and it would append my base url to the url and it would fail.

Also, how do you change the ResponseType?

feinstein avatar Apr 20 '24 13:04 feinstein

I have a genetic method that makes requests to a complete url variable. I remember passing the variable to get and it would append my base url to the url and it would fail.

Would be good if you could provide a reproducible case.

Also, how do you change the ResponseType?

Each request can specify ResponseType in their Options.

AlexV525 avatar Apr 20 '24 13:04 AlexV525

But that option I am proving is a new option, so wouldn't it override the values in my default option I used for constructing the dio instance?

feinstein avatar Apr 20 '24 13:04 feinstein

But that option I am proving is a new option, so wouldn't it override the values in my default option I used for constructing the dio instance?

Of course Options overrides BaseOptions, but it only happens in that request, rather than further requests.

AlexV525 avatar Apr 20 '24 13:04 AlexV525

But I want that request to carry all the options provided in the base options, only overriding the ones I need to change, not all of them.

feinstein avatar Apr 20 '24 16:04 feinstein

I'm wondering if you really tried to use Options. It works just as you want it to. :)

Given the above conversation, I think your usage might be invalid somehow. I cannot provide suggestions unless there is an actual problem with options, and please provide a reproducible example to explain your demand.

AlexV525 avatar Apr 20 '24 16:04 AlexV525

@AlexV525 I tested and indeed it worked, I think the docs got me confused, the docs say:

Each Dio instance has a base config for all requests made by itself, and we can override the base config with Options when make a single request.

The word "override" implies that all my Base Options are gone. I thought I would have to recreate all the configurations myself, from both options objects.

I would recommend some more details to ba added to this doc, explaining the options objects are merged, where the items defined inside the new options object will override the fields defined inside the base options.

feinstein avatar Apr 22 '24 02:04 feinstein

Each Dio instance has a base config for all requests made by itself, and we can override the base config with Options when make a single request.

The word "override" implies that all my Base Options are gone. I thought I would have to recreate all the configurations myself, from both options objects.

I'm not sure it implies the idea you've mentioned. No default values were given in the Options, thus nothing would be override when you are using an empty Options. https://pub.dev/documentation/dio/latest/dio/Options-class.html

AlexV525 avatar Apr 22 '24 03:04 AlexV525

I know that's how the code looks like, but reading the docs that's not clear. The internal code could be easily overriding things with nulls.

feinstein avatar Apr 22 '24 07:04 feinstein

Override means substitute, merge means combine both into one.

feinstein avatar Apr 22 '24 07:04 feinstein

Yea, I can see that this might be confusing. Feel free to create a PR to update the documentation!

kuhnroyal avatar Apr 22 '24 09:04 kuhnroyal