【问题标题】:How to send nested Json in body as http post request from Flutter如何将嵌套的 Json 作为来自 Flutter 的 http 发布请求发送到正文中
【发布时间】:2020-07-31 23:24:50
【问题描述】:

我正在尝试在我一直在开发的颤振应用程序的一个 http post 请求中发送一个嵌套的 Json 作为正文。

{
      "user" : {
        "UserName": "username",
        "password":"password",
        "Name": "name",
        "Email": "email"
      }
}

我尝试了许多在线可用的方法来执行此操作,但每次都收到 500 错误。下面是一个将其转换为 Json 的类。

class SignupJson {
  String username;
  String email;
  String name;
  String password;

  SignupJson(this.email, this.name, this.password, this.username);

  Map toJson() =>{"user":{
    'UserName': username,
    'Name': name,
    'password': password,
    'Email': email
  }};

}

并将其传递给此以进行发布请求。 (我放了一个任意的url链接)

Future<int> attemptSignup ({String username, String password, String name, String email}) async {



    SignupJson data = SignupJson(username: username, password: password, name: name, email: email);
    var url = 'url';

    String body = jsonEncode(json);

    var res = await http.post(url,
    body: body);
    return res.statusCode;

  }

【问题讨论】:

    标签: http flutter dart


    【解决方案1】:

    我根据这个json编码:

    {
    "user": {
        "UserName": "username",
        "password": "password",
        "Name": "name",
        "Email": "email"
      }
     }
    

    您的 Post Api 调用如下:

     Future<User> postUser(String username, String password, String name, String 
     email) async {
    
     Paste your api url here
     String url = '';
       final response = await http.post(apiUrl, headers: {
       // Enter your headers parameter if needed
       //  E.g: 
       'Authorization' : 'xyz',
       'Content-Type' : 'application/json'
     },
     body: jsonEncode(<String, String>{
       'UserName' : username,
       'password' : password,
       'Name' : name,
       'Email' : email
      }));
    
     if (response.statusCode == 200) {
        var data = jsonDecode(response.body.toString());
        print(data);
        return User.fromJson(jsonDecode(response.body));
      } else {
       throw Exception('Failed to post user.');
      }
    }
    

    你的模型是这样的:

      class User {
         User? user;
    
         User({this.user});
    
         User.fromJson(Map<String, dynamic> json) {
           user = json['user'] != null ? new User.fromJson(json['user']) : null;
         }
    
        Map<String, dynamic> toJson() {
          final Map<String, dynamic> data = new Map<String, dynamic>();
          if (this.user != null) {
            data['user'] = this.user!.toJson();
          }
          return data;
         }
       }
    
      class User {
        String? userName;
        String? password;
        String? name;
        String? email;
    
          User({this.userName, this.password, this.name, this.email});
    
          User.fromJson(Map<String, dynamic> json) {
           userName = json['UserName'];
           password = json['password'];
           name = json['Name'];
           email = json['Email'];
         }
    
        Map<String, dynamic> toJson() {
           final Map<String, dynamic> data = new Map<String, dynamic>();
            data['UserName'] = this.userName;
            data['password'] = this.password;
            data['Name'] = this.name;
           data['Email'] = this.email;
          return data;
         }
        }
    

    【讨论】:

      【解决方案2】:

      过去 2 天我一直被这个问题困扰。以下是我克服问题的方法

      Future<int> attemptSignup ({String username, String password, String name, String email}) async {
      
      
      SignupJson data = SignupJson(username: username, password: password, name: name, email: email);
      var url = 'url';
      
      String body = jsonEncode(data);     
      
      //here jsonEncode(data) return String bt in http body you are passing Map value
      
      //So you have to convert String to Map
      Map bodyMap = jsonDecode(body);         
      
      // your nested json data
      var bodyData = {       // where var store <String, dynamic> data as your demand
            "user" : bodyMap  
      };
      
      
      var res = await http.post(url,
      body: bodyData,
      headers: {"Content-Type": "application/json",},
      );
      
      return res.statusCode;
      
      }
      

      确保在 http 中添加标头

      【讨论】:

      • @Siddharth Singh 请检查这个并让我知道它是否适合你:)
      【解决方案3】:

      将地图定义为&lt;String, dynamic&gt; 例如:

      Map<String, dynamic> data = {
      "User": {
                "UserName":"username",
                "Password":"password"
          }
      };
      

      并在标题中添加以下内容:

      HttpClient httpClient = new HttpClient();
      HttpClientRequest request = await httpClient.postUrl(Uri.parse(url));
      request.headers.set('Accept', 'application/json');
      request.headers.set('Content-type', 'application/json');
      request.add(utf8.encode(json.encode(data)));
      HttpClientResponse response = await request.close();
      String reply = await utf8.decoder.bind(response).join();
      httpClient.close();
      

      【讨论】:

      • 即使后端不期望带有此请求的标头?在我的逻辑流程中,这个请求应该向我输出 statusCode(如果是 ==200,则让人们进入下一个屏幕)。那么在哪里可以获得该状态码。我对reply 有点困惑
      • 您正在向后端发送 JSON,因此必须设置 Content-type。 response 有一个名为 statusCode 的属性,您可以在其中检查它是否为 200。所以,你可以像if (response.statusCode == 200)
      • 有什么方法可以联系到你吗?您的个人资料显示您正在接受客户
      【解决方案4】:

      像这样添加标题:

      Map<String, String> headers = {HttpHeaders.contentTypeHeader: "application/json"};
      

      然后在 post 请求中:

      var res = await http.post(url, headers: headers, body: body);
      

      【讨论】:

      • 嗨!实际上,后端并不期望此 post 请求中有标头。它仍然是可取的吗?
      猜你喜欢
      • 2019-08-15
      • 1970-01-01
      • 2013-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-08
      • 1970-01-01
      • 2018-05-07
      相关资源
      最近更新 更多