有一个 dart 包为 http 请求提供了一些帮助类,还有一个包可以帮助进行 json 序列化。
BasicUtils:https://github.com/Ephenodrom/Dart-Basic-Utils
JsonSerializable : https://flutter.dev/docs/development/data-and-backend/json
安装它:
dependencies:
basic_utils: ^1.4.0
json_annotation: ^2.0.0
dev_dependencies:
test: '>=0.12.42 <2.0.0'
build_runner: ^1.0.0
json_serializable: ^2.0.0
用法
像这样更新你的课程:
import 'package:json_annotation/json_annotation.dart';
part 'CreateListingRequest.g.dart';
@JsonSerializable()
class CreateListingRequest {
String title;
List<ListingImage> images;
List<int> categoryIds;
factory CreateListingRequest.fromJson(Map<String, dynamic> json) =>
_$CreateListingRequestFromJson(json);
Map<String, dynamic> toJson() => _$CreateListingRequestToJson(this);
}
import 'package:json_annotation/json_annotation.dart';
part 'ListingImage.g.dart';
@JsonSerializable()
class ListingImage {
String url;
int position;
factory ListingImage.fromJson(Map<String, dynamic> json) =>
_$ListingImageFromJson(json);
Map<String, dynamic> toJson() => _$ListingImageToJson(this);
}
使用以下命令创建 *.g.dart 文件:
pub run build_runner build
现在您的工作区中有一些 *.g.dart 文件。之后,您可以将您的类用于您的 http 请求。
//Convert class to string
String body = json.encode(payload.toJson());
// Convert response to class
MyResponseClass responseAsClass = MyResponseClass.fromJson(responseData);
完整示例
// Define some headers and query parameters
Map<String, String> headers = {
"Accept": "application/json"
};
Map<String, String> queryParameters = {
"foo": "bar"
};
// Create instance of the class
CreateListingRequest payload = CreateListingRequest();
// Convert class to String
String body = json.encode(payload.toJson()); // that does the magic :)
// Send request
Map<String, dynamic> responseData = await HttpUtils.postForJson("api.com/dosomething", body,
headers: headers, queryParameters: queryParameters);
// Convert response to class
MyResponseClass responseAsClass = MyResponseClass.fromJson(responseData);
附加信息:
这些都是来自 HttpUtils 类的方法。
Future<Map<Response> getForFullResponse(String url,{Map<String, dynamic> queryParameters,Map<String, String> headers});
Future<Map<String, dynamic>> getForJson(String url,{Map<String, dynamic> queryParameters,Map<String, String> headers});
Future<String> getForString(String url,{Map<String, dynamic> queryParameters,Map<String, String> headers});
Future<Map<Response> postForFullResponse(String url, String body,{Map<String, String> queryParameters,Map<String, String> headers});
Future<Map<String, dynamic>> postForJson(String url, String body,{Map<String, String> queryParameters,Map<String, String> headers});
Future<String> postForString(String url, String body,{Map<String, String> queryParameters,Map<String, String> headers});
Future<Response> putForFullResponse(String url, String body,{Map<String, String> queryParameters,Map<String, String> headers});
Future<Map<String, dynamic>> putForJson(String url, String body,{Map<String, String> queryParameters,Map<String, String> headers});
Future<String> putForString(String url, String body,{Map<String, String> queryParameters,Map<String, String> headers});
Future<Response deleteForFullResponse(String url,{Map<String, String> queryParameters,Map<String, String> headers});
Future<Map<String, dynamic>> deleteForJson(String url,{Map<String, String> queryParameters,Map<String, String> headers});
Future<String> deleteForString(String url,{Map<String, String> queryParameters,Map<String, String> headers});
Map<String, dynamic> getQueryParameterFromUrl(String url);
String addQueryParameterToUrl(String url, Map<String, dynamic> queryParameters);