Как показать ошибку, если сервер недоступен флаттер

#flutter #dart

#флаттер #dart

Вопрос:

Я все еще новичок в flutter. У меня есть сетевой вызов, который нужно выполнить. Но перед этим мне нужно проверить, есть ли у устройства подключение к Интернету и доступен ли сервер api server. Мне удалось проверить, доступно ли подключение к Интернету, но я не могу показать, когда сервер недоступен

Это то, что я сделал до сих пор:

  login(username, password) async {
  final String url = "http://10.0.2.2:8080/api/auth/signin"; // iOS
  var responseJson;
  try {
    final response= await http.post(
      url,
      headers: <String, String>{
        'Content-Type': 'application/json; charset=UTF-8',
      },
      body: jsonEncode(<String, String>{
        'username': username,
        'password': password,
      }),
    );
    responseJson = _response(response);
  } on SocketException {
    throw FetchDataException('No Internet connection');
  }
  print(responseJson);
  SharedPreferences prefs = await SharedPreferences.getInstance();
  var parse = jsonDecode(responseJson.body);

  await prefs.setString('username', parse["username"]);
  await prefs.setString('message', parse["message"]);
  await prefs.setString('accessToken', parse["accessToken"]);

  return responseJson;
}
  dynamic _response(http.Response response) {
    switch (response.statusCode) {
      case 200:
        var responseJson = json.decode(response.body.toString());
        print(responseJson);
        return responseJson;
      case 400:
        throw BadRequestException(response.body.toString());
      case 401:

      case 403:
        throw UnauthorisedException(response.body.toString());
      case 500:
        throw FetchDataException(
            'Error occured while Communication with Server with StatusCode : ${response
                .statusCode}');
      default:
        throw FetchDataException(
            'Error occured while Communication with Server with StatusCode : ${response
                .statusCode}');
    }
  }
 

Моя функция кнопки входа в систему

  RoundedButton(
                    text: "LOGIN",
                    press: () async {
                      if (_formKey.currentState.validate()) {
                        progressDialog.show();
                        await login(
                          username,
                          password,
                        );
                        SharedPreferences prefs =
                            await SharedPreferences.getInstance();
                        String token = prefs.getString("accessToken");
                        print(token);

                        if (token == null) {
                          progressDialog.hide();
                          showAlertsDialog(context);
                        } else {
                          showAlertzDialog(context);
                        }
                      }
                    },
                  )
 

Всякий раз, когда я переключаю сервер и нажимаю «Войти», в приложении отображается индикатор выполнения, показывающий вход в систему. Как я могу отобразить предупреждение о том, что нет подключения к серверу?

Комментарии:

1. если на сервере возникла проблема, код состояния вашего http-ответа должен быть связан с 500, поэтому для кода состояния 500 выдается сообщение об ошибке.

2. Привет @SaifulIslam как я могу отобразить ошибку в диалоговом окне предупреждения?

3. покажите мне код, из которого вы вызываете свой requestGET метод

Ответ №1:

Вот как вы можете управлять своим вызовом API.

 Future<dynamic> requestGET({String url}) async {
try {
  final response = await http.get(Uri.parse(url));
  switch (response.statusCode) {
    case 200:
    case 201:
      final result = jsonDecode(response.body);
      final jsonResponse = {'success': true, 'response': result};
      return jsonResponse;
    case 400:
      final result = jsonDecode(response.body);
      final jsonResponse = {'success': false, 'response': result};
      return jsonResponse;
    case 401:
      final jsonResponse = {
        'success': false,
        'response': ConstantUtil.UNAUTHORIZED
      };
      return jsonResponse;
    case 500:
    case 501:
    case 502:
      final jsonResponse = {
        'success': false,
        'response': ConstantUtil.SOMETHING_WRONG
      };
      return jsonResponse;
    default:
      final jsonResponse = {
        'success': false,
        'response': ConstantUtil.SOMETHING_WRONG
      };
      return jsonResponse;
  }
} on SocketException {
  final jsonResponse = {
    'success': false,
    'response': ConstantUtil.NO_INTERNET
  };
  return jsonResponse;
} on FormatException {
  final jsonResponse = {
    'success': false,
    'response': ConstantUtil.BAD_RESPONSE
  };
  return jsonResponse;
} on HttpException {
  final jsonResponse = {
    'success': false,
    'response': ConstantUtil.SOMETHING_WRONG  //Server not responding
  };
  return jsonResponse;
 }
}
 

Вызовите эту функцию и используйте ответ, который я вызываю в методе инициализации StatefulWidget.

     @override
    void initState() {
    // TODO: implement initState
    super.initState();

    final result = await requestGET('google.com');
    if (result['success'] == false) {
      // show the dialog
      showDialog(
        context: context,
        builder: (BuildContext context) {
          return AlertDialog(
            title: Text("Error"),
            content: Text(result['response']),
            actions: [
              FlatButton(
                child: Text("OK"),
                onPressed: () {
                  Navigator.pop(context);
                },
              ),
            ],
          );
          ;
        },
      );
    }
  }
 

Комментарии:

1. Спасибо @Sandeep, как я могу сопоставить сообщение с alerdialog?

2. @blackbird пожалуйста, поддержите, если какой-либо ответ сработает для вас. Спасибо

Ответ №2:

Я думаю, вы можете проверить код ответа из вызова api, используя запрос http-кода по этой ссылке http status code

как вы можете проверить ответ от json следующим образом:

 Future<String> checkServerResponse() await 
{
 http.Response response =
    await http.get('server_link'):
print(response.statusCode);

}
 

теперь, как вы можете видеть, код ответа сервера основан на коде состояния http.