Flutter中如何通过API发送数据?

Posted

技术标签:

【中文标题】Flutter中如何通过API发送数据?【英文标题】:How to send data through API in Flutter? 【发布时间】:2020-06-16 13:13:10 【问题描述】:

当我尝试通过 API 登录(电子邮件和密码参数)时,数据以行格式传递,但我想以表单格式发布数据。 由于这个问题,当我传递数据时,它不接受参数值并显示 null 并给出错误。 那么,我该如何解决这个问题呢?

> This _loginUser() method In call on login button click.


_loginUser(context) async 
    Map<String, dynamic> loginBodyResponse = 
      "email": _emailController.text,
      "password": _passswordController.text,
    ;
    try 
      setState(() 
        _isLoading = true;
      );
> APIs call
      Map loginResponse = await NetworkHttp.postHttpMethod(
          '$AppConstants.apiEndPoint$AppConstants.loginApi',
          loginBodyResponse);

          print('email:' + _emailController.text);
          print('Password:' + _passswordController.text);
          print(loginBodyResponse);

      print('===================Login Response=========================');
      print(loginResponse['body']);

      print(loginResponse['body']['login']);

      print("---------------------------");
      if (loginResponse['body']['status'] != "success") 
        setState(() 
          _isLoading = false;
        );
        String errormessage = loginResponse['body']['msg'];
        print("---------------------------");
        print(errormessage);

        ErrorDialog.showErrorDialog(context, errormessage, "Error");
       else 
        print("Login Successfully");
        print("============================================");
        setState(() 
          _isLoading = false;
        );
        NavigatorHelper.verifyOtpScreen(context);
      
     catch (e) 
      setState(() 
        _isLoading = false;
      );
      ErrorDialog.showErrorDialog(context, e.toString(), "Error");
      print('error while login $e');
    
  

我在上面提到的代码中使用的 NetworkHttp 类。当我尝试登录时,它在控制台中显示空参数

class NetworkHttp 
  static Future<Map<String, String>> _getHeaders() async 
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    final String token = prefs.getString('token');
    if (token != null) 
      return 
        'Content-type': 'application/json',
        'Accept': 'application/json',
        'AccessToken': '$token',
      ;
     else 
      return 
        'Content-type': 'application/json',
        'Accept': 'aapilcation/json',
      ;
    
  

static Future<Map<String, dynamic>> postHttpMethod(String url, body) async 
    print('url');
    print(url);
    print('body');
    print(body);
    Map headers = await _getHeaders();
    print('headers');
    print(headers);
    http.Response response = await http.post(
      url,
      headers: headers,
      body: json.encode(body),
    );
    Map<String, dynamic> responseJson = 
      'body': json.decode(response.body),
      'headers': response.headers
    ;
    return responseJson;
  

【问题讨论】:

请分享您正在使用的代码和您遇到的错误,以便可以帮助您解决您收到的错误 【参考方案1】:

通过您的发布请求,只需像这样传递您的参数

您的发布请求应如下所示。

response = await http.post("your_api_url",
                           body:"email" : "value",
                                 "password" : "value");

【讨论】:

【参考方案2】:

只需添加带有 json_data 的标题。

Future<login> requestLogin(String username, String password , String device_id) async 
      Map<String, String> headers = "Content-type": "application/x-www-form-urlencoded";
      var json_body =  'email' : username , 'password': password ,'device_id': device_id;

      if(token != null)
        headers.addAll("Authorization" : "Bearer "+token);
      
      //  make POST request
      final response = await http.post(baseUrl+ "/login", headers: headers, body: json_body);
      print(response.body);
      if (response.statusCode == 200) 
        // If server returns an OK response, parse the JSON.
        // return Post.fromJson(json.decode(response.body));
        print(response.body);
        return login.fromJson(json.decode(response.body));
       else 
        // If that response was not OK, throw an error.
        throw Exception(response.body);
      
    

【讨论】:

以上是关于Flutter中如何通过API发送数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Flutter Web 应用程序嵌入网站并通过网站将数据发送到 Flutter Web 应用程序

如何通过共享将文件发送到 Flutter 应用程序?

如何在 Flutter+Spring Boot+PostgreSQL+Heroku 结构中发送和存储图像?

如何使用Flutter将数据SQLite(离线)发送到服务器MySQL?

使用 API 注册 Flutter

如何使用 dart/flutter 从 API 获取数据?