Трепещущий вызов Post API

#api #rest #flutter #post

#API #rest #сбой #Публикация

Вопрос:

Я работаю над проектом flutter, в котором я вызываю POST API. Его ответ выглядит так

 {
    "_id": "5f61a39b8b7cf93550898b63",
    "buildname": "ANT PC DORYLUS RZ320G",
    "processor": "AMD Ryzen 3 3200G (4Core, 4Threads, Upto 4.0 Ghz)",
    "motherboard": "MSI B450M PRO m2 Max",
    "ram": "8GB ADATA XPG Gammix D30 DDR4 3000MHz",
    "graphiccard": "Radeon Vega Graphics",
    "ssd": "120GB ADATA/Crucial SATA SSD",
    "hdd": "1 TB WD Blue SATA HDD 7200 RPM",
    "psu": "Antec VP450P IN",
    "cpucooler": "AMD STOCK COOLER",
    "os": "30 Days Microsoft Windows 10 Home 64-Bit Trial",
    "cpucase": "Antec NX200",
    "price": "28437.00",
    "createdAt": "2020-09-16T05:33:15.383Z",
    "__v": 0
}
  

Я написал следующий код, но он показывает мне тип ошибки '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'PreBuildResponse'

Код:

   Future<List<PreBuildResponse>> _fetchProduct() async {
     final url = 'http://10.0.2.2:3000/prebuild/product';
     final response = await http.post(
        url,
        body: {
           'id' : "$productId"
        }
     );
     if (response.statusCode == 200) {
        List jsonResponse = json.decode(response.body);
        return jsonResponse
           .map((list) => new PreBuildResponse.fromJson(list))
           .toList();
     } else {
        throw Exception('Failed to load data from API');
     }
 }


  @override
  Widget build(BuildContext context) {
    return Container(
        color: Colors.white,
        child: SingleChildScrollView(
        child: FutureBuilder(
          future: _fetchProduct(),
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              PreBuildResponse data = snapshot.data;
              return Text(data.buildname);
            } else if (snapshot.hasError) {
              return Text("${snapshot.error}");
            }
            return CircularProgressIndicator();
          },
        ),
      )
    );
  }
}
  

И найдите код модели здесь https://gist.github.com/vaandhare/3aa46c71369f012514cfafe4911cd11c

Комментарии:

1. Как я могу видеть, вы просто возвращаете данные после декодирования JSON. Нет, где я вижу сопоставление с PreBuildResponse. Вы пытаетесь назначить несовместимые типы данных. Хэш-карта для типа PreBuildResponse..

Ответ №1:

 Future<PreBuildResponse> _fetchProduct() async {
    final url = 'http://10.0.2.2:3000/prebuild/product';
    final response = await http.post(
        url,
        body: {
          'id' : "$productId"
        }
    );
    if (response.statusCode == 200) {
      return PreBuildResponse.fromJson(json.decode(response.body));
    } else {
      throw Exception('Failed to load data from API');
    }
  }
  

Комментарии:

1. это приведет к ошибке, когда у вас возникнет какая-либо ошибка при вызове API, и вы вернете string .

2. таким образом, возвращаемый тип должен быть <динамическим> или возвращать пустой объект, пока есть ошибка

3. Ok изменит его.

Ответ №2:

вы должны преобразовать свой ответ JSON в свой класс модели. в классе модели должен быть fromJson метод, который вы можете использовать здесь при преобразовании JSON в ваш класс модели. У меня здесь есть Book класс модели, чтобы вы могли ссылаться на него.

 Future<List<Book>> getAllBook() async {
    http.Response response = await http.get(
      EndPoint.Book,
    );
    if (response.statusCode == 200) {
      var parsed = jsonDecode(response.body);
      var bookData = parsed['books'];
      List<Book> data = bookData.map<Book>((e) => Book.fromJson(e)).toList();
      print(data);
      return data;
    }
  }
  

Комментарии:

1. Мой метод get работает, но показывает ошибку в методе post. И метод POST, дающий ответ в postman.

2. Используйте метод FromJSON для преобразования вашего JSON в ваш класс модели, как вы можете видеть в примере.

3. Здесь вам не нужен list.map, потому что ваш ответ не типа list, а типа map. Так что попробуйте return PreBuildResponse.fromJson(response.body))

4. Спасибо, абхишек, но этот код сработал PreBuildResponse.fromJson(json.decode(response.body))

5. если этот ответ полезен для вас, пожалуйста, примите мой ответ @VaibhavA. Спасибо