mirror of
https://github.com/foss42/apidash.git
synced 2025-12-02 18:57:05 +08:00
Update README.md
This commit is contained in:
@@ -1,182 +1,3 @@
|
|||||||
# 📡 `better_networking` Package
|
# `better_networking` example
|
||||||
|
|
||||||
`better_networking` is a lightweight and extensible Dart package designed to simplify HTTP requests and streaming operations. It provides enhanced request modeling, consistent response handling, and built-in utility functions to streamline interactions with both REST and GraphQL APIs. Whether you're handling HTTP requests or streaming data (e.g., Server-Sent Events), this package makes the process more testable and developer-friendly.
|
`better_networking` package example.
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔧 Features
|
|
||||||
|
|
||||||
* **Unified request modeling** via `HttpRequestModel`
|
|
||||||
* **Consistent response handling** with `HttpResponseModel`
|
|
||||||
* **Streamed response support** (e.g., SSE)
|
|
||||||
* **Client management** with cancellation and lifecycle control
|
|
||||||
* **Built-in utilities** for parsing headers and content types
|
|
||||||
* **Support for both REST and GraphQL APIs**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📦 Installation
|
|
||||||
|
|
||||||
To install the `better_networking` package, add it to your `pubspec.yaml`:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
dependencies:
|
|
||||||
better_networking: ^<latest-version>
|
|
||||||
```
|
|
||||||
|
|
||||||
Then run the following command in your terminal to fetch the package:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
flutter pub get
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🚀 Quick Start
|
|
||||||
|
|
||||||
Here’s a basic example to get you started with the package:
|
|
||||||
|
|
||||||
```dart
|
|
||||||
final model = HttpRequestModel(
|
|
||||||
url: 'https://api.example.com/data',
|
|
||||||
method: HTTPVerb.post,
|
|
||||||
headers: [
|
|
||||||
NameValueModel(name: 'Authorization', value: 'Bearer <token>'),
|
|
||||||
],
|
|
||||||
body: '{"key": "value"}',
|
|
||||||
);
|
|
||||||
|
|
||||||
final (resp, duration, err) = await sendHttpRequest(
|
|
||||||
'unique-request-id',
|
|
||||||
APIType.rest,
|
|
||||||
model,
|
|
||||||
);
|
|
||||||
|
|
||||||
// To cancel the request
|
|
||||||
cancelHttpRequest('unique-request-id');
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🧩 API Overview
|
|
||||||
|
|
||||||
### 📥 `HttpRequestModel`
|
|
||||||
|
|
||||||
The `HttpRequestModel` defines the structure for outgoing HTTP requests, including headers, body content, parameters, and more.
|
|
||||||
|
|
||||||
#### Constructor:
|
|
||||||
|
|
||||||
```dart
|
|
||||||
const factory HttpRequestModel({
|
|
||||||
@Default(HTTPVerb.get) HTTPVerb method,
|
|
||||||
@Default("") String url,
|
|
||||||
List<NameValueModel>? headers,
|
|
||||||
List<NameValueModel>? params,
|
|
||||||
List<bool>? isHeaderEnabledList,
|
|
||||||
List<bool>? isParamEnabledList,
|
|
||||||
@Default(ContentType.json) ContentType bodyContentType,
|
|
||||||
String? body,
|
|
||||||
String? query,
|
|
||||||
List<FormDataModel>? formData,
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Fields:
|
|
||||||
|
|
||||||
* **`method`**: The HTTP verb to use (e.g., GET, POST, PUT).
|
|
||||||
* **`url`**: The target URL for the request.
|
|
||||||
* **`headers`**: A list of header key-value pairs.
|
|
||||||
* **`params`**: URL parameters as key-value pairs.
|
|
||||||
* **`isHeaderEnabledList`**: Toggles for enabling/disabling individual headers.
|
|
||||||
* **`isParamEnabledList`**: Toggles for enabling/disabling individual parameters.
|
|
||||||
* **`bodyContentType`**: The MIME type for the request body (e.g., `json`, `form`).
|
|
||||||
* **`body`**: The raw body of the request (usually a JSON or string).
|
|
||||||
* **`query`**: A custom query string to be appended to the URL.
|
|
||||||
* **`formData`**: Multipart form data (for file uploads, etc.).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 🔁 Request Sending Examples
|
|
||||||
|
|
||||||
#### ➤ Standard REST HTTP Request
|
|
||||||
|
|
||||||
This example demonstrates a simple GET request to fetch data from a REST API:
|
|
||||||
|
|
||||||
```dart
|
|
||||||
const model = HttpRequestModel(
|
|
||||||
url: 'https://jsonplaceholder.typicode.com/posts/1',
|
|
||||||
method: HTTPVerb.get,
|
|
||||||
headers: [
|
|
||||||
NameValueModel(name: 'User-Agent', value: 'Dart/3.0 (dart:io)'),
|
|
||||||
NameValueModel(name: 'Accept', value: 'application/json'),
|
|
||||||
],
|
|
||||||
);
|
|
||||||
|
|
||||||
final (resp, dur, err) = await sendHttpRequest(
|
|
||||||
'get_test',
|
|
||||||
APIType.rest,
|
|
||||||
model,
|
|
||||||
);
|
|
||||||
|
|
||||||
final output = jsonDecode(resp?.body ?? '{}');
|
|
||||||
print(output);
|
|
||||||
```
|
|
||||||
|
|
||||||
#### ➤ Standard GraphQL HTTP Request
|
|
||||||
|
|
||||||
This example demonstrates a GraphQL query:
|
|
||||||
|
|
||||||
```dart
|
|
||||||
const model = HttpRequestModel(
|
|
||||||
url: 'https://countries.trevorblades.com/',
|
|
||||||
query: kGQLquery, // Your GraphQL query string
|
|
||||||
);
|
|
||||||
|
|
||||||
final (resp, dur, err) = await sendHttpRequest(
|
|
||||||
'gql_test',
|
|
||||||
APIType.graphql,
|
|
||||||
model,
|
|
||||||
);
|
|
||||||
|
|
||||||
final output = jsonDecode(resp?.body ?? '{}');
|
|
||||||
print(output);
|
|
||||||
```
|
|
||||||
|
|
||||||
#### ➤ Streamed HTTP Request (e.g., SSE)
|
|
||||||
|
|
||||||
If you're dealing with server-sent events (SSE) or other streaming data, use the `streamHttpRequest` method:
|
|
||||||
|
|
||||||
```dart
|
|
||||||
const model = HttpRequestModel(
|
|
||||||
url: 'https://sse.dev/test',
|
|
||||||
method: HTTPVerb.get,
|
|
||||||
);
|
|
||||||
|
|
||||||
final stream = await streamHttpRequest('sse_test', APIType.rest, model);
|
|
||||||
|
|
||||||
stream.listen((data) {
|
|
||||||
if (data != null) {
|
|
||||||
final HttpResponse? resp = data.$2;
|
|
||||||
final Duration? dur = data.$3;
|
|
||||||
final String? err = data.$4;
|
|
||||||
|
|
||||||
// Handle the response here
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🤝 Contributing
|
|
||||||
|
|
||||||
We welcome contributions to the `better_networking` package! If you'd like to contribute, please fork the repository and submit a pull request. For major changes or new features, it's a good idea to open an issue first to discuss your ideas.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🪪 License
|
|
||||||
|
|
||||||
`better_networking` is licensed under the MIT License.
|
|
||||||
|
|
||||||
MIT © API Dash
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|||||||
Reference in New Issue
Block a user