【问题标题】:DioError [DioErrorType.RESPONSE]: Http status error [405] [Solved]DioError [DioErrorType.RESPONSE]: Http 状态错误 [405] [已解决]
【发布时间】:2020-04-18 15:42:17
【问题描述】:

我正在创建一个post 请求使用Dio, 这是我的FormData 参数,

    FormData formData = FormData.fromMap({
      'wallet_id': '${dropdownValue.walletId}',
      'member_id': '${_loginModel.memberId}',
      'draw_amount': withdrawalAmountContoller.text,
      'login_password': passwordController.text,
    });

然后我像这样传递params

Response response = await dio.post(url, data: params);

但我收到一个错误请求,

ERROR[DioError [DioErrorType.RESPONSE]: Http 状态错误 [405]] => PATH: https://vertoindiapay.com/pay/api/withdraw

E/flutter (6703): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] 未处理异常:DioError [DioErrorType.RESPONSE]: Http 状态错误 [405]

E/flutter (6703):#0 DioMixin._request._errorInterceptorWrapper。 (包:dio/src/dio.dart:848:13)

请帮我解决这个问题。 我的网址是=> https://vertoindiapay.com/pay/api/withdraw


虽然这在邮递员中工作正常,

【问题讨论】:

  • 我已经解决了这个问题,这是一个愚蠢的错误
  • 你是如何解决这个问题的?请提及,以便未来的读者可能会发现它有帮助。谢谢!
  • @RavinderKumar 是什么错误?,我收到错误 500,bt in postman 我收到响应成功..
  • @ajs.sonawane 我忘了是什么解决了这个问题,但可能某些值为 null 或响应数据已经在 json 中,我再次对其进行编码和解码,无论如何,如果您遇到内部服务器错误,也许您应该检查任何参数都不应该有任何空格。

标签: http flutter flutter-dependencies dio


【解决方案1】:

我遇到了同样的错误,问题来自您的服务器。您对服务器的操作可能是获取数据 [FromBody] 使用 [FromForm] 它会起作用。

对我来说,我是这样解决的:

eg public DataResponseModel<UserDto> UpdateFormalize([FromForm] FormalizeDto dto){
//somes code
}

【讨论】:

    【解决方案2】:

    当您期望的响应(以 JSON 格式)与您期望接收的响应不匹配时,就会出现此特定问题。

    如果这是你的代码,

    Response response = await dio.post(url, data: params);
    

    检查响应模型是否与它在 Postman 响应中收到的 JSON 匹配。

    【讨论】:

      【解决方案3】:
        Future<void> signUpUser() async {
          final formData = {
            'username': 'test1',
            'password': 'abcdefg',
            'grant_type': 'password',
          };
       try {
          Dio _dio = new Dio();
          _dio.options.contentType = Headers.formUrlEncodedContentType;
      
          final responseData = await _dio.post<Map<String, dynamic>>('/token',
              options: RequestOptions(
                 
                  method: 'POST',
                  headers: <String, dynamic>{},
                  baseUrl: 'http://52.66.71.229/'),
              data: formData);
      
         
            print(responseData.toString());
          } catch (e) {
            final errorMessage = DioExceptions.fromDioError(e).toString();
            print(errorMessage);
          }
      
        }
      
      
      
       class DioExceptions implements Exception {
        
        DioExceptions.fromDioError(DioError dioError) {
          switch (dioError.type) {
            case DioErrorType.CANCEL:
              message = "Request to API server was cancelled";
              break;
            case DioErrorType.CONNECT_TIMEOUT:
              message = "Connection timeout with API server";
              break;
            case DioErrorType.DEFAULT:
              message = "Connection to API server failed due to internet connection";
              break;
            case DioErrorType.RECEIVE_TIMEOUT:
              message = "Receive timeout in connection with API server";
              break;
            case DioErrorType.RESPONSE:
              message =
                  _handleError(dioError.response.statusCode, dioError.response.data);
              break;
            case DioErrorType.SEND_TIMEOUT:
              message = "Send timeout in connection with API server";
              break;
            default:
              message = "Something went wrong";
              break;
          }
        }
      
        String message;
      
        String _handleError(int statusCode, dynamic error) {
          switch (statusCode) {
            case 400:
              return 'Bad request';
            case 404:
              return error["message"];
            case 500:
              return 'Internal server error';
            default:
              return 'Oops something went wrong';
          }
        }
      
        @override
        String toString() => message;
      }
      

      【讨论】:

        【解决方案4】:

        所以我遇到了这个问题。所以我发现你在 Postman 中使用的标题应该与你在 Dio 中使用的标题相匹配。比如说

          headers: {
              'Accept': "application/json",
              'Authorization': 'Bearer $token',
            },
        

        我的邮递员看起来像这样Postman

        显然,Dio 在标题方面也表现得像邮递员,所以很明显,如果邮递员的标题不匹配,那么它将引发错误。

        简而言之,Dio 会像邮递员一样自行推断内容类型。

        【讨论】:

        • 对我有用,伙计:)
        【解决方案5】:

        尝试传递内容类型

        final response = await Dio().post(Url,
                options: Options(contentType: 'multipart/form-data'), data: formData);
        

        【讨论】:

          【解决方案6】:

          我遇到了同样的错误,BaseOptions 有不同的 method 名称,而不是 POST... 当我将它改回 POST 时,它起作用了。不确定 DIO 包是否接受使用 POST 以外的方法在 API 中调用 Post 方法。

          【讨论】:

            【解决方案7】:

            请尝试将参数作为 JSON 编码传递。

            Response response = await dio.post(url, data: json.encode(params));

            希望这会有所帮助!

            【讨论】:

            • 您是否将标头作为 JSON 与表单编码发送?
            • @RayLi 从 OP 中发布的代码语法中可以明显看出他正在发送表单编码数据。
            猜你喜欢
            • 2021-08-31
            • 1970-01-01
            • 2022-11-29
            • 2022-12-23
            • 2020-03-22
            • 2023-03-25
            • 1970-01-01
            • 2020-05-22
            • 2021-08-19
            相关资源
            最近更新 更多