如何解决flutter中的http错误代码400缺少参数?

Posted

技术标签:

【中文标题】如何解决flutter中的http错误代码400缺少参数?【英文标题】:How to solve http error code 400 missing parameters in flutter? 【发布时间】:2019-06-25 05:29:34 【问题描述】:

我有一个注册页面,我通过传递参数电子邮件、用户名、密码、名字和姓氏向服务器发出 http.post 请求。我已经尝试了一切,但无法解决问题。每当我点击注册按钮时,它都会显示以下内容 - “我/扑(2914):400 我/颤振(2914):“代码”:“rest_missing_callback_param”,“消息”:“缺少参数:电子邮件,用户名,密码”,“数据”:“状态”:400,“参数”:[ "电子邮件","用户名","密码"]"

我已经浏览了其他帖子,但他们没有解决我的问题,所以请帮忙。 提前致谢。

import 'dart:convert';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:restaurant_app/globalVar.dart';
import 'package:restaurant_app/homescreen.dart';

class SignUp extends StatefulWidget 
 @override
 _SignUpState createState() => _SignUpState();


class _SignUpState extends State<SignUp> with SingleTickerProviderStateMixin 
 
  TabController controller;
 TextEditingController _firstnameController;
 TextEditingController _lastnameController;
 TextEditingController _usernameController;
 TextEditingController _emailController;
 TextEditingController _passwordController;
 TextEditingController _rePasswordController;

 bool loading;

 final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState> 
 ();

 @override
 void initState() 
  // TODO: implement initState
  super.initState();
  controller = new TabController(length: 2, vsync: this);
  loading = false;
  _firstnameController = new TextEditingController(text: "Vishal");
  _lastnameController = new TextEditingController(text: "Das");
  _usernameController = new TextEditingController(text: "vishaldas");
_emailController = new TextEditingController(text: "vissudas@gmail.com");
_passwordController = new TextEditingController(text: "Vishal@123");
_rePasswordController = new TextEditingController(text: "Vishal@123");


@override
void dispose() 
// TODO: implement dispose
super.dispose();
controller.dispose();
setState(() 
  loading = false;
);

_emailController.dispose();
_usernameController.dispose();
_passwordController.dispose();
_firstnameController.dispose();
_lastnameController.dispose();
_rePasswordController.dispose();



  //  static final String fullnameKey = 'fullname';
  //  static final String emailKey = 'email';
  //  static final String passwordkey = 'password';

signUp(email, username, password, firstname, lastname) async 
setState(() 
  loading = true;
);

var body = json.encode(
  "email": email,
  "username": username,
  "password": password,
  "firstname": firstname,
  "lastname": lastname,
);

String basicAuth =
    'Basic' + base64Encode(utf8.encode('$username:$password'));

Map<String, String> headers = 
  HttpHeaders.AUTHORIZATION: basicAuth,
;

print(basicAuth);

await http
    .post("$GlobalVar.urlwp-json/wc/v2/customers",
        body: body, headers: headers)
    .then((response) 
  var body = json.decode(response.body);
  print(response.statusCode);
  print(response.body);
  if (response.statusCode == 200) 
    loading = false;
    Navigator.pushReplacement(context,
        MaterialPageRoute(builder: (BuildContext ctx) => HomePage()));
   else 
    final snackBar = SnackBar(content: Text(body['message']));
    _scaffoldKey.currentState.showSnackBar(snackBar);
  
  setState(() 
    loading = false;
  );
);


@override
Widget build(BuildContext context) 
return Scaffold(
  resizeToAvoidBottomPadding: false,
  key: _scaffoldKey,
  body: Container(
    decoration: BoxDecoration(
      image: DecorationImage(
        image: AssetImage('images/art.png'),
        fit: BoxFit.fill,
        colorFilter: ColorFilter.mode(
            Colors.white12.withOpacity(0.2), BlendMode.dstATop),
      ),
    ),
    child: ListView(
      shrinkWrap: true,
      physics: BouncingScrollPhysics(),
      children: <Widget>[
        SizedBox(
          height: MediaQuery.of(context).size.height / 35,
        ),
        Align(
          alignment: Alignment.topCenter,
          child: CircleAvatar(
            backgroundColor: Colors.grey,
            radius: 55.0,
            backgroundImage: AssetImage('images/logo.png'),
          ),
        ),
        SizedBox(
          height: MediaQuery.of(context).size.height / 40,
        ),
        Stack(
          alignment: Alignment.center,
          children: <Widget>[
            SizedBox(
              height: 2.0,
              child: new Center(
                child: new Container(
                  height: 10.0,
                  color: Colors.black12,
                ),
              ),
            ),
            Row(
              children: <Widget>[
                SizedBox(
                  width: MediaQuery.of(context).size.width / 4,
                ),
                Chip(
                  label: Text(
                    "SIGN IN",
                    style: TextStyle(color: Colors.white, fontSize: 18.0),
                  ),
                  backgroundColor: Color(0xFFD1A155),
                ),
                SizedBox(
                  width: MediaQuery.of(context).size.width / 35,
                  child: Container(
                    width: MediaQuery.of(context).size.height / 12,
                    height: 2.0,
                    color: Colors.white,
                  ),
                ),
                Chip(
                  label: Text(
                    "SIGN UP",
                    style: TextStyle(color: Colors.white, fontSize: 18.0),
                  ),
                  backgroundColor: Colors.black87,
                ),
              ],
            )
          ],
        ),
        SizedBox(
          height: MediaQuery.of(context).size.height / 30,
        ),
        Align(
            alignment: Alignment.center,
            child: Text(
              "Sign Up Maa ki Rasoi",
              style: TextStyle(
                fontSize: 20.0,
                color: Color(0xFFD1A155),
              ),
            )),
        SizedBox(
          height: MediaQuery.of(context).size.height / 30,
        ),
        Column(
          children: <Widget>[
            Theme(
              data: ThemeData(
                hintColor: Colors.black26,
                primaryColor: Color(0xFFD1A155),
              ),
              child: Padding(
                padding: const EdgeInsets.only(left: 15.0, right: 15.0),
                child: TextField(
                  controller: _firstnameController,
                  decoration: InputDecoration(
                      border: OutlineInputBorder(borderSide: BorderSide()),
                      prefixIcon: Icon(
                        Icons.person,
                        color: Color(0xFFD1A155),
                      ),
                      hintText: 'First name',
                      hintStyle: TextStyle(
                          color: Colors.black,
                          fontWeight: FontWeight.w400)),
                  keyboardType: TextInputType.text,
                ),
              ),
            ),
            SizedBox(
              height: MediaQuery.of(context).size.height / 50,
            ),
            Theme(
              data: ThemeData(
                hintColor: Colors.black26,
                primaryColor: Color(0xFFD1A155),
              ),
              child: Padding(
                padding: const EdgeInsets.only(left: 15.0, right: 15.0),
                child: TextField(
                  controller: _lastnameController,
                  decoration: InputDecoration(
                      border: OutlineInputBorder(borderSide: BorderSide()),
                      prefixIcon: Icon(
                        Icons.person,
                        color: Color(0xFFD1A155),
                      ),
                      hintText: 'Last name',
                      hintStyle: TextStyle(
                          color: Colors.black,
                          fontWeight: FontWeight.w400)),
                  keyboardType: TextInputType.text,
                ),
              ),
            ),
            SizedBox(
              height: MediaQuery.of(context).size.height / 50,
            ),
            Theme(
              data: ThemeData(
                  primaryColor: Color(0xFFD1A155),
                  hintColor: Colors.black26),
              child: Padding(
                padding: const EdgeInsets.only(left: 15.0, right: 15.0),
                child: TextField(
                  controller: _emailController,
                  decoration: InputDecoration(
                      border: OutlineInputBorder(borderSide: BorderSide()),
                      prefixIcon: Icon(
                        Icons.email,
                        color: Color(0xFFD1A155),
                      ),
                      hintText: 'Email Address',
                      hintStyle: TextStyle(
                          color: Colors.black,
                          fontWeight: FontWeight.w400)),
                  keyboardType: TextInputType.emailAddress,
                ),
              ),
            ),
            SizedBox(
              height: MediaQuery.of(context).size.height / 50,
            ),
            Theme(
              data: ThemeData(
                hintColor: Colors.black26,
                primaryColor: Color(0xFFD1A155),
              ),
              child: Padding(
                padding: const EdgeInsets.only(left: 15.0, right: 15.0),
                child: TextField(
                  controller: _usernameController,
                  decoration: InputDecoration(
                      border: OutlineInputBorder(borderSide: BorderSide()),
                      prefixIcon: Icon(
                        Icons.supervised_user_circle,
                        color: Color(0xFFD1A155),
                      ),
                      hintText: 'Username',
                      hintStyle: TextStyle(
                          color: Colors.black,
                          fontWeight: FontWeight.w400)),
                  keyboardType: TextInputType.text,
                ),
              ),
            ),
            SizedBox(
              height: MediaQuery.of(context).size.height / 50,
            ),
            Theme(
              data: ThemeData(
                hintColor: Colors.black26,
                primaryColor: Color(0xFFD1A155),
              ),
              child: Padding(
                padding: const EdgeInsets.only(left: 15.0, right: 15.0),
                child: TextField(
                  controller: _passwordController,
                  decoration: InputDecoration(
                      border: OutlineInputBorder(borderSide: BorderSide()),
                      prefixIcon: Icon(
                        Icons.lock,
                        color: Color(0xFFD1A155),
                      ),
                      hintText: 'Password',
                      hintStyle: TextStyle(
                          color: Colors.black,
                          fontWeight: FontWeight.w400)),
                  keyboardType: TextInputType.text,
                  obscureText: true,
                ),
              ),
            ),
            SizedBox(
              height: MediaQuery.of(context).size.height / 50,
            ),
            Theme(
              data: ThemeData(
                  primaryColor: Color(0xFFD1A155),
                  hintColor: Colors.black26),
              child: Padding(
                padding: const EdgeInsets.only(left: 15.0, right: 15.0),
                child: TextField(
                  controller: _rePasswordController,
                  decoration: InputDecoration(
                      border: OutlineInputBorder(borderSide: BorderSide()),
                      prefixIcon: Icon(
                        Icons.lock,
                        color: Color(0xFFD1A155),
                      ),
                      hintText: 'Re - Password',
                      hintStyle: TextStyle(
                          color: Colors.black,
                          fontWeight: FontWeight.w400)),
                  keyboardType: TextInputType.text,
                  obscureText: true,
                ),
              ),
            ),
            SizedBox(
              height: MediaQuery.of(context).size.height / 50,
            ),
            Padding(
              padding: const EdgeInsets.only(left: 15.0, right: 15.0),
              child: InkWell(
                onTap: () 
                  print(_emailController.text);
                  print(_passwordController.text);
                  print(_usernameController.text);
                  signUp(
                    _emailController.text,
                    _usernameController.text,
                    _passwordController.text,
                    _firstnameController.text,
                    _lastnameController.text,
                  );
                ,
                child: loading
                    ? CircularProgressIndicator()
                    : Container(
                        height: MediaQuery.of(context).size.height / 13,
                        //width: MediaQuery.of(context).size.height / 1.8,
                        decoration: BoxDecoration(
                          color: Color(0xFFD1A155),
                          borderRadius: BorderRadius.circular(5.0),
                        ),
                        child: Center(
                          child: Text(
                            "SIGN UP",
                            style: TextStyle(
                                color: Colors.white, fontSize: 18.0),
                          ),
                        ),
                      ),
              ),
            )
          ],
        ),
        SizedBox(
          height: MediaQuery.of(context).size.height / 30,
        ),
        Stack(
          alignment: Alignment.center,
          children: <Widget>[
            SizedBox(
              height: 2.0,
              child: new Center(
                child: new Container(
                  height: 10.0,
                  color: Colors.black12,
                ),
              ),
            ),
            Container(
              height: MediaQuery.of(context).size.height / 18,
              width: MediaQuery.of(context).size.height / 11,
              decoration: BoxDecoration(
                  borderRadius: BorderRadius.circular(23.0),
                  color: Colors.white,
                  border: Border.all(color: Colors.black12)),
              child: Center(
                  child: Text(
                "OR",
                style: TextStyle(fontSize: 18.0),
              )),
            ),
          ],
        ),
        SizedBox(
          height: MediaQuery.of(context).size.height / 40,
        ),
        Padding(
          padding: const EdgeInsets.only(left: 15.0, right: 15.0),
          child: Row(
            children: <Widget>[
              Container(
                height: MediaQuery.of(context).size.height / 13,
                width: MediaQuery.of(context).size.width / 2.2,
                decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(5.0),
                    color: Colors.white,
                    border: Border.all(color: Colors.black12)),
                child: Row(
                  children: <Widget>[
                    SizedBox(
                      width: 18.0,
                    ),
                    Icon(Icons.tag_faces),
                    SizedBox(
                      width: 10.0,
                    ),
                    Text(
                      "Facebook",
                      style: TextStyle(fontSize: 22.0, color: Colors.blue),
                    ),
                  ],
                ),
              ),
              SizedBox(
                width: MediaQuery.of(context).size.width / 40,
              ),
              Container(
                height: MediaQuery.of(context).size.height / 13,
                width: MediaQuery.of(context).size.width / 2.3,
                decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(5.0),
                    color: Colors.white,
                    border: Border.all(color: Colors.black12)),
                child: Row(
                  children: <Widget>[
                    SizedBox(
                      width: 18.0,
                    ),
                    Icon(Icons.tag_faces),
                    SizedBox(
                      width: 10.0,
                    ),
                    Text(
                      "Google+",
                      style: TextStyle(fontSize: 22.0, color: Colors.red),
                    ),
                  ],
                ),
              ),
            ],
          ),
        ),
        SizedBox(
          height: MediaQuery.of(context).size.height / 30,
        ),
        Align(
          alignment: Alignment.center,
          child: InkWell(
            onTap: () => Navigator.pop(context),
            child: RichText(
                text: TextSpan(
                    text: "Already have an account?",
                    style: TextStyle(fontSize: 20.0, color: Colors.black87),
                    children: <TextSpan>[
                  TextSpan(
                      text: ' Log in',
                      style: TextStyle(
                          color: Color(0xFFD1A155),
                          fontWeight: FontWeight.bold)),
                ])),
          ),
        ),
        SizedBox(
          height: MediaQuery.of(context).size.height / 40,
        ),
       ],
      ),
    ),
  );
 

【问题讨论】:

服务器的规范在哪里说明它需要什么格式的参数? 应该是表单数据格式 假设它类似于 woocommerce,v2 似乎暗示它使用 GET 而不是 post,并使用 oauth,但我可能错了。您需要查看您尝试访问的 api 的文档。 是的,它的 woocommerce,我正在使用基本身份验证...但我正在使用发布请求 您能否显示该过程的文档链接。 【参考方案1】:

错误代码 400 通常由于服务器无法处理的错误请求(即意外参数、格式错误的语法)而发生。如果 cmets 中提到的内容是正确的,并且这里使用的是 woocommerce,那么我无法测试您的设置。但我可以建议在guide 之后在客户端中测试您的配置。 Postman 是一个常用的工具,我可以建议它来测试 HTTP 请求。如果 API 与 Postman 配合良好,但请求在 Flutter 中仍然存在问题,我们可以从那里开始。

【讨论】:

以上是关于如何解决flutter中的http错误代码400缺少参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决flutter中的权限处理程序错误?

如何解决 Flutter 中的 MediaQuery 错误? [复制]

http状态返回代码400怎么解决

http请求400错误

HTTP 400 错误请求 - CURL PHP

ResponseEntity:HTTP状态400 - 错误请求