发布请求正文不正确发送

时间:2020-07-03 12:24:57

标签: flutter dart

所以我试图发出一个注册POST请求,要发送的正文应如下所示:

{
  "user": {
    "email": "omartest14@dw.coo",
    "firstname": "string",
    "lastname": "string",
    "gender": "female",
    "phone_number": "+2120694263542",
    "birthdate": "2020-06-24",
    "country": "EGY"
  }
}

所以我首先创建了一个RegisterUpsert模型,其类如下:

class RegisterUpsert {
  String email;
  String firstname;
  String lastname;
  String gender;
  String phoneNumber;
  String birthdate;
  String country;

  RegisterUpsert();

  RegisterUpsert.fromJson(Map<String, dynamic> json)
      : email = json['email'],
        firstname = json['firstname'],
        lastname = json['lastname'],
        gender = json['gender'],
        phoneNumber = json['phone_number'],
        birthdate = json['birthdate'],
        country = json['country'];

  Map<String, dynamic> toJson() => {
        'email': email,
        'firstname': firstname,
        'lastname': lastname,
        'gender': gender,
        'phone_number': phoneNumber,
        'birthdate': birthdate,
        'country': country,
      };
}

现在,我已经完成了数据收集和处理的流程,并创建了一个RegisterUpsert实例,其中包含我需要的所有数据,即registerBodyFinal,现在我想在这里调用它:

    debugPrint({"user": registerBodyFinal.toJson()}.toString());
    showLoading(context);
    final response = await http.post(url,
        body: {
          "user": {registerBodyFinal.toJson()}
        }.toString());
    Navigator.pop(context);

debugPrint似乎可以按我的要求打印正文,但似乎不是所发送的内容,因为在正文正常工作时尝试使用邮递员使用确切的debugPrinted行,但是flutter应用程序上的响应表明服务器正在获取不正确/缺少JSON。我在这个问题中显示的第一个正文和我要发抖的正文之间有什么区别?

我的猜测是,使用toString进行解析会将我所有的方括号等解析为字符串的一部分,并且会破坏它吗?但是然后除非我使用.toString(),否则在运行时会得到一个castError:

InternalLinkedHashMap<String,Dynamic> is not a subtype of type 'String' in type cast

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

当您有JSON树时,请不要对它的一部分进行编码,然后将其进一步包含在父映射中。将地图(或带有返回地图的toJson方法的类)放在父地图中,最后在根地图(或列表)上调用一次json.encode

您需要的正确语法是:

  var upsert = RegisterUpsert()
    ..email = 'e'
    ..firstname = 'f'
    ..lastname = 'l'
    ..gender = 'f'
    ..phoneNumber = 'ph'
    ..birthdate = 'today'
    ..country = 'nl';

  var bodyMap = <String, dynamic>{'user': upsert};

  final response = await http.post(url, body: json.encode(bodyMap));