aloisdeniel / aloisdeniel/http_extensions
Query Parameters Extension
- 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.