aloisdeniel / aloisdeniel/http_extensions

Query Parameters Extension

Aperta
#2 3 commenti 0 reazioni 0 assegnatari Vedi su GitHub
enhancement good first issue
Lingua principale
Dart
Stelle
35
Fork
15
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

I was trying to figure out the best way to append query parameters with each request and ending up creating an extension. Here is what I put together.

## Extension (`request_extension.dart`)
```dart
class RequestExtension extends Extension {
final Logger logger;

RequestExtension({RequestOptions defaultOptions = const RequestOptions(), this.logger})
: super(defaultOptions: defaultOptions);

Future _resolve(
BaseRequest original, RequestOptions options) async {
if (original is ExtensionRequest) {
return ExtensionRequest(
request: await _resolve(original.request, options),
options: original.options);
}

if (original.url.hasScheme) {
return original;
}

if (options.queryParameters == null) {
return original;
}

if (options.queryParameters.isNotEmpty) {
final url = original.url.replace(queryParameters: options.queryParameters);

logger?.fine('Appended Query Parameters');

if (original is Request) {
var result = Request(original.method, url);
if (original.headers != null) result.headers.addAll(original.headers);
if (original.encoding != null) result.encoding = original.encoding;
if (original.bodyBytes != null) result.bodyBytes = original.bodyBytes;

return result;
}

if (original is StreamedRequest) {
var result = Request(original.method, url);
if (original.headers != null) result.headers.addAll(original.headers);
result.bodyBytes = await original.finalize().toBytes();

return result;
}

throw ArgumentError(
"Failed to resolve request of type ${original.runtimeType}");
} else {
return original;
}
}

@override
Future sendWithOptions(
BaseRequest request, RequestOptions options) async {
request = await _resolve(request, options);
return await super.sendWithOptions(request, options);
}
}
```

## Options (`request_options.dart`)
```dart
class RequestOptions {
final Map queryParameters;

const RequestOptions({this.queryParameters});
}
```

## Example (`main.dart`)
```dart
Future main() async {
final client = ExtendedClient(
inner: Client(),
extensions: [
RequestExtension(),
],
);

var response = await client.getWithOptions('my-url-string',
options: [RequestOptions(queryParameters: {'option1': 'value1'}]);
}
```

Not sure if this is the best way to do this, you could I imagine add a parameter on each method call (get, put, delete, etc.) for the query params.

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Valutazione

Questa issue non è ancora stata valutata.

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.