Как извлечь данные из ответа, состоящего из нескольких частей/данных формы?

#flutter #dart #flutter-web

Вопрос:

Я загружаю изображения в хранилище, используя метод POST с типом содержимого составных/форм-данных. api возвращает ответ объекта, который выглядит следующим образом:

 { "id": "6d50c066-cf65-4748-8b9a-183c3526f49b", "name": "hotel_6.jpg", "fileKey": "lv/im/5d9feb8e-2ea8-439d-a550-1e937081e085-hotel_6.jpg", "fileExtension": ".jpg", "mimeType": "image/jpeg", "catalogueUrl": {  "mainUrl": "https://xy.abc.com/lv/im/5d9feb8e-2ea8-439d-a550-1e937081e085-hotel_6.jpg",  "thumbnailUrls": [] }, "createdAt": "2021-11-25T06:40:40.0869466 00:00"  

}

Как я могу извлечь переменную «mainUrl» из ответа, чтобы присвоить ее значение _pictureController? Вот что я сделал:

 uploadFile() async {  var accessToken = await sharedPref.read(key);  var postUrl = '$baseUrl/catalogue?thumbnail=${param.thumbnailTrueFalse}';  Map lt; String, String gt; headers = {  "Authorization": "Bearer $accessToken",  };   // multipart request object  var request = http.MultipartRequest("POST", Uri.parse(postUrl));  request.headers.addAll(headers);   // add selected file with request  request.files.add(http.MultipartFile("file", imageStream, imageSize,  filename: imageName));   // Send request  var response = await request.send();   // Read response  var result = await response.stream.bytesToString();  print('readResponse: $result');  if (response.statusCode == 200) {  var data = StorageResponse.fromJson(jsonDecode(result));  print('data: $data');  setState(() {  _pictureController.text = data.catalogueUrl!.mainUrl!;  });  return data;  } else {  throw Exception('Failed to upload photo.');  } } 

Класс «StorageResponse» выглядит следующим образом:

 @JsonSerializable() class StorageResponse {  var id;  var name;  var fileKey;  var fileExtension;  var mimeType;  Catalogue ? catalogueUrl;  var createdAt;   StorageResponse({  this.id,  this.name,  this.fileKey,  this.fileExtension,  this.mimeType,  this.catalogueUrl,  this.createdAt,  });   factory StorageResponse.fromJson(Map lt; String, dynamic gt; json) =gt;  _$StorageResponseFromJson(json);  Map lt; String, dynamic gt; toJson() =gt; _$StorageResponseToJson(this);   @override  toString() {  String output =  '{id:${this.id},name:${this.name},fileKey: ${this.fileKey},fileExtension:${this.fileExtension},mimeType: ${this.mimeType}mimeType},catalogueUrl: ${this.catalogueUrl},,createdAt: ${this.createdAt}}';  return output;  } } 

Ответ №1:

Вы можете использовать следующую структуру для преобразования файла Json в класс и наоборот.

Следующая структура работает правильно.

 import 'dart:convert';  class StorageResponse {  final String id;  final String name;  final String fileKey;  final String fileExtension;  final String mimeType;  Catalogue catalogueUrl;  final DateTime createdAt;   StorageResponse(  this.id,  this.name,  this.fileKey,  this.fileExtension,  this.mimeType,  this.catalogueUrl,  this.createdAt,  );   factory StorageResponse.fromMap(Maplt;String, dynamicgt; json) {  return StorageResponse(  json['id'],  json['name'],  json['fileKey'],  json['fileExtension'],  json['mimeType'],  Catalogue.fromMap(json['Catalogue']),  DateTime.parse(json['createdAt']));  }   Maplt;String, dynamicgt; toJson() =gt; {  'id': id,  'name': name,  'fileKey': fileKey,  'fileExtension': fileExtension,  'mimeType': mimeType,  'Catalogue': catalogueUrl.toJson(),  'createdAt': createdAt  };   @override  toString() {  String output =  '{id:${this.id},name:${this.name},fileKey: ${this.fileKey},fileExtension:${this.fileExtension},mimeType: ${this.mimeType}mimeType},catalogueUrl: ${this.catalogueUrl},,createdAt: ${this.createdAt}}';  return output;  } }  class Catalogue {  final String mainUrl;  final Listlt;Stringgt; thumbnailUrls;   Catalogue(this.mainUrl, this.thumbnailUrls);   factory Catalogue.fromMap(Maplt;String, dynamicgt; json) {  return Catalogue(json['mainUrl'], jsonDecode(json['thumbnailUrls']));  }   Maplt;String, dynamicgt; toJson() =gt;  {'mainUrl': mainUrl, 'thumbnailUrls': jsonEncode(thumbnailUrls)}; }  

для использования

 if (response.statusCode == 200) {  var data = StorageResponse.fromMap(jsonDecode(result));  print('data: $data');  setState(() {  _pictureController.text = data.catalogueUrl!.mainUrl!;  });  return data;  } else {  throw Exception('Failed to upload photo.'); }