【问题标题】:Api Call With Nested Map Flutter使用嵌套地图颤振的 API 调用
【发布时间】:2021-05-30 11:07:20
【问题描述】:

我正在尝试对我的服务器进行 POST 调用,要求我的数据形状如下:

{
    "dispensary": 1,
    "order_detail": [
        {"product_size": 1,
        "quantity": 1}
    ]
}

但是当我进行 api 调用时,我在后端收到 500 错误,说数据看起来像这样:

{'{"dispensary":1,"order_detail":{"product_size":1,"quantity":1}}': ['']}

我是这样打电话的:

   Future getdata(dispensary, order) async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  var token = prefs.getString('token');

  var url = '$server/api/customer/order/getdata/?access_token=$token';

  Map<String, dynamic> orderRating = {
    'dispensary': dispensary,
    'order_detail': order
  };

  await http.post(url, body: orderRating, headers: {
    "Content-Type": "application/x-www-form-urlencoded"
  }).then((http.Response response) {
    switch (response.statusCode) {
      case (200):
        var responseData = json.decode(response.body);
        Rate rateData =
            Rate.fromJson((responseData[1]['rate_response']['rates']));

        print('uploaded successfully');
        print(rateData.carrierId);

        break;

      case (400):
        print('Bad Data');

        break;
      case (500):
        print('Failed Upload');
        isUploaded = false;

        break;
      default:
        print('Unable to get rates');
    }
  });

  print('uploaded successfully');
}

order_detail 是 {"product_size": 1 的映射, “数量”:1}。

我无法完成对我的服务器的调用。你能告诉我我做错了什么吗

【问题讨论】:

  • 您好,我认为服务器中存在错误。尝试不编码发送数据
  • 我没有成功
  • 你能提供 url + token 在我这边测试吗

标签: json rest flutter dart


【解决方案1】:

我不知道你在做什么,因为它不是未来的全部功能......但我可以猜测你正在尝试发出一个发布请求,其中正文有一些动态数据。 据我所知,您现在在做什么是您将地图放入地图中,这不是您想要的。

我的建议是这样的:

Future<http.Response> postSomething(int dispensary, List<Map<String,dynamic>> order) async {
  final String url = 'yoururl';
  final Map<String, dynamic> body = {
    'dispensary': dispensary,
    'order_detail': order
  };
  final request = await http.post(url: url, body: convert.jsonEncode(body));
  if(request.statusCode == 200) {
    return something
  } else {
    throw Exception('Failed to send the request!!!')
  }
}

希望我的回答对您有所帮助并给出更清晰的想法。 :)

【讨论】:

  • 我试过 List> 方法没有成功。为了更清晰,我更新了我的代码
  • Dart 有特定的语法,所以你应该使用更具体的函数,比如给未来一个类型和你函数中的参数一个类型,以便更具体地使用你的代码并知道什么函数应该返回。希望你会明白。 :)
【解决方案2】:

toJson 方法添加到您的对象。生成请求时调用toJsonbody

body: orderRating.toJson 应该返回在这个 sn-p 中看到的 json 结构

{
    "dispensary": 1,
    "order_detail": [
        {"product_size": 1,
        "quantity": 1}
    ]
}
class OrderRating{
  int dispensary;
  List<OrderDetail> orderDetail;

  OrderRating({this.dispensary, this.orderDetail});

  OrderRating.fromJson(Map<String, dynamic> json) {
    dispensary = json['dispensary'];
    if (json['order_detail'] != null) {
      orderDetail = new List<OrderDetail>();
      json['order_detail'].forEach((v) {
        orderDetail.add(new OrderDetail.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['dispensary'] = this.dispensary;
    if (this.orderDetail != null) {
      data['order_detail'] = this.orderDetail.map((v) => v.toJson()).toList();
    }
    return data;
  }
}

class OrderDetail {
  int productSize;
  int quantity;

  OrderDetail({this.productSize, this.quantity});

  OrderDetail.fromJson(Map<String, dynamic> json) {
    productSize = json['product_size'];
    quantity = json['quantity'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['product_size'] = this.productSize;
    data['quantity'] = this.quantity;
    return data;
  }
}

以上代码是使用Here找到的工具生成的

【讨论】:

    猜你喜欢
    • 2021-01-26
    • 2021-07-03
    • 2018-06-14
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 2019-12-10
    • 2021-05-02
    • 1970-01-01
    相关资源
    最近更新 更多