带有表单数据颤动的过帐请求

问题描述 投票:0回答:1

我正在尝试将请求发布到仅接受form-data的服务器。首先,我尝试了发布http的请求。另外,尝试使用dio库进行此操作,因为我认为尽管这对于尝试实现的目标来说是最好的。但是我一直无法使它正常工作,因为我没有收到错误消息。

Postman sample

其中一个字段接受用户使用文件选择器选择的文件图像对象。我尝试了两种方法来实现这一目标。

第一方式

void finshUpdate() async{
    if(_image!=null){
      setState(() {
        _isLoading = true;
      });
        SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
        var uri = NetworkUtils.host +
            AuthUtils.updateSessionRequest;
        Map data = {"_method": "PATCH",
          "first_name": widget.first_name,
          "last_name": widget.last_name,
          "phone": widget.phone,
        "industry":widget.industry,
        "country": widget.country,
        "state": widget.state,
        "fav_quote": widget.fav_quote,
        "bio_interest": widget.bio_text,
        "terms": 1,
        "company": widget.company,
        "position": widget.job_position,
        "linked_in":widget.linkedin_profile,
        "institution": widget.institution,
        "degree": widget.degree,
        "image": _image,
        "preference[0]": widget.industry};
        String jsonString = json.encode(data); // encode map to json
        String authToken = sharedPreferences.getString("token");
        try {
          final response = await http.post(
            uri,
            body: jsonString,
            headers: {
              'Accept': 'application/json',
              'Content-Type': 'form-data',
              'Authorization': 'Bearer ' + authToken,
            },
          );

          final responseJson = json.decode(response.body);
          print(responseJson.toString());
          if (response.statusCode == 200 || response.statusCode == 201) {
            setState(() {
              Navigator.pushReplacement(
      context, SlideFromRightPageRoute(widget: DashBoardPage()));
              NetworkUtils.showToast("Profile successfully update!");
            });
          } else{
            setState(() {
              _isLoading = false;
            });
            NetworkUtils.showSnackBar(_scaffoldKey, 'An error occurred. Please try again');
          }
          return responseJson;
        } catch (exception) {
          print(exception.toString());
          setState(() {
            _isLoading = false;
          });
          NetworkUtils.showSnackBar(_scaffoldKey, 'An error occurred. Please try again');
        }
    } else{
      NetworkUtils.showSnackBar(_scaffoldKey, "Please select a profile image");
    }
  }

第二方式

 void finshUpdate() async {
        if (_image != null) {
          setState(() {
            _isLoading = true;
          });
          FormData formData = new FormData.fromMap({
            "_method": "PATCH",
            "first_name": widget.first_name,
            "last_name": widget.last_name,
            "phone": widget.phone,
            "industry": widget.industry,
            "country": widget.country,
            "state": widget.state,
            "fav_quote": widget.fav_quote,
            "bio_interest": widget.bio_text,
            "terms": 1,
            "company": widget.company,
            "position": widget.job_position,
            "linked_in": widget.linkedin_profile,
            "institution": widget.institution,
            "degree": widget.degree,
            "image": _image,
            "preference[0]": widget.industry
          });
          Response response;
          Dio dio = new Dio();
          response = await dio.post(
              NetworkUtils.host + AuthUtils.endPointUpdateProfile, data: formData);
          print(response.toString());
          print(response.statusCode);
          if (response.statusCode == 200 || response.statusCode == 201) {
            setState(() {
              Navigator.pushReplacement(
                  context, SlideFromRightPageRoute(widget: DashBoardPage()));
              NetworkUtils.showToast("Profile successfully update!");
            });
          } else {
            setState(() {
              _isLoading = false;
            });
            NetworkUtils.showSnackBar(
                _scaffoldKey, 'An error occurred. Please try again');
          }
          setState(() {
            _isLoading = false;
          });
          NetworkUtils.showSnackBar(
              _scaffoldKey, 'An error occurred. Please try again');
        } else {
          NetworkUtils.showSnackBar(_scaffoldKey, "Please select a profile image");
        }
      }

我在做什么错?

flutter post form-data
1个回答
0
投票

[如果您的服务器需要表单数据,请不要JSON编码。让http为您做到这一点。 body参数可以是将逐字发送的字节,将被编码为字节的字符串或将被编码为表单数据的映射。

将代码更改为:

      final response = await http.post(
        uri,
        body: data, // make sure that data is a Map<String, String>
        headers: {
          'Accept': 'application/json',
          //'Content-Type': 'form-data', // should be able to omit this and http will add it
          'Authorization': 'Bearer ' + authToken,
        },
      );

映射必须是字符串到字符串。如果有任何值不是字符串(例如int),请先将其编码为字符串。

© www.soinside.com 2019 - 2024. All rights reserved.