有一个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请求。
String body = json.encode(payload.toJson());
MyResponseClass responseAsClass = MyResponseClass.fromJson(responseData);
完整示例
Map<String, String> headers = {
"Accept": "application/json"
};
Map<String, String> queryParameters = {
"foo": "bar"
};
CreateListingRequest payload = CreateListingRequest();
String body = json.encode(payload.toJson());
Map<String, dynamic> responseData = await HttpUtils.postForJson("api.com/dosomething", body,
headers: headers, queryParameters: queryParameters);
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);