как разместить json массив на флаттер - PullRequest
0 голосов
/ 15 марта 2020

У меня возникла проблема с отправкой массива json с флаттером.

Когда я нажимаю api почтальоном, используя json, это работает. Скриншот почтальона:

enter image description here

Поскольку я знаю по телу, просто примите карту <<strong> String , String > CMIIW

поэтому я превращаю тело таким образом

List<Map<String,String>> products = [
  {
      "product_id": "1",
      "buy_quantity": "1",
      "product_price": "1000",
      "is_voucher": "0",
  },
  {
      "product_id": "2",
      "buy_quantity": "2",
      "product_price": "2000",
      "is_voucher": "0",
  },           
];

final String jsonProduct = json.encode(products);// here im trying to

Map<String,String> _body = {        
  "buyer_id": '',
  "buyer_firstname": postCart.buyerFirstname,
  "phone_number": postCart.phoneNumber,
  "transaction_total_price": postCart.transactionTotalPrice.toString(),
  "voucher_id": 0.toString(),
  "voucher_code": 0.toString(),
  "payment_id": postCart.paymentId.toString(),
  "payment_name": postCart.paymentName,  
  "products" : jsonProduct
};

но я все еще получаю ошибку,

спасибо!

Ответы [ 2 ]

0 голосов
/ 15 марта 2020

Если вы хотите получить JSON на снимке экрана, вам нужно внести несколько изменений.

  1. Обратите внимание, что в списке продуктов отображаются целые числа без кавычек при преобразовании в JSON, поэтому должны быть сохранены как int с в вашем классе дартс. (Обратите внимание на предпочтительный синтаксис тоже.)
var products = <Map<String, int>>[
  {
    'product_id': 1,
    'buy_quantity': 1,
    'product_price': 1000,
    'is_voucher': 0,
  },
  {
    'product_id': 2,
    'buy_quantity': 2,
    'product_price': 2000,
    'is_voucher': 0,
  },
];
Тип _body необходимо изменить, поскольку теперь он содержит список, а также строки. (Оставьте то же самое - как toString s - так как ваш скриншот показывает, что даже целые числа указаны в виде строк.)
var _body = <String, dynamic>{
  'buyer_id': '',
  'buyer_firstname': postCart.buyerFirstname,
  'phone_number': postCart.phoneNumber,
  'transaction_total_price': postCart.transactionTotalPrice.toString(),
  'voucher_id': 0.toString(),
  'voucher_code': 0.toString(),
  'payment_id': postCart.paymentId.toString(),
  'payment_name': postCart.paymentName,
  'products': products
};
Наконец json и (предпочтительно) utf8 кодируют полученную карту и передают ее в качестве параметра body вашего http.post.
var bytes = utf8.encode(json.encode(_body));
await http.post(url, body: bytes, headers: someHeaders);
Один из ваших заголовков может быть content-type: application/json;encoding=utf-8, чтобы сообщить серверу, что вы отправляете кодировку UTF8 JSON.
0 голосов
/ 15 марта 2020

Я предполагаю, что вы используете http пакет .

Это пример того, как сделать запрос HTTP POST с полезной нагрузкой json в теле:

Future<Lead> createLead(String clientName, String clientEmail, String clientPhone, String eventId) async {

  // Create storage
  final storage = new FlutterSecureStorage();

  // Get API url from env
  String url = (DotEnv().env['BASE_URL'] + "/leads/create");
  String authToken = await storage.read(key: 'api-token');

  // Create some request headers
  Map<String, String> requestHeaders = {
      'Content-type': 'application/json',
      'Accept': 'application/json',
      'X-Token': authToken
    };


  final response = await http.post(
    url,
    // enconde some JSON data on the request body
    body: json.encode(
      {
        'event_id': eventId,
        'name': clientName,
        'phone': clientPhone,
        'email': clientEmail
      }
    ),
    headers: requestHeaders
  );

  if (response.statusCode == 200) {
    final leadsJson = json.decode(response.body);
    Lead lead = Lead.fromJson(leadsJson);
    return lead;
  } else {
    // If that response was not OK, throw an error.
    // throw Exception('Failed to load post');
    return null;
  }
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...