使用 dio 在 post 请求中出现颤振错误 403
flutter error 403 in post request using dio
我有仇恨的问题。我正在尝试使用 dio 登录,登录方法运行良好,但是当我输入无效凭据时,dio 给我这个错误:
DioError
Error in execution
我创建了一个布尔函数,如果状态代码为 200,它将 return 为真或为假,它将 return 为真,否则它将为 return 假,但是当登录时正确的凭据一切正常,一切都按预期进行,但是当使用无效凭据登录时,上面的错误会导致它。我使用共享首选项将 tolken 存储在应用程序中,逻辑很简单,如果它是 200,我会登录到应用程序,否则它会显示我在另一个文件中制作的小吃店,这是我的代码:
loginFinal() async {
if (formKey.currentState!.validate()) {
bool loginIsOk = await loginConect();
if (loginIsOk) {
Get.offAllNamed("/home");
await Future.delayed(const Duration(seconds: 1));
message(MessageModel.info(
title: "Sucesso",
message: "Seja bem vindo(a) influenciador(a)",
));
} else {
loaderRx(false); //LOADER
message(MessageModel.error(
title: "Erro",
message: "Erro ao realizar login",
));
}
}
}
//LOGICA DE ENTRAR NO APP
Future<bool> loginConect() async {
final dio = Dio();
String baseUrl = "https://soller-api-staging.herokuapp.com";
loaderRx(true); //LOADER
SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
final response = await dio.post(
baseUrl + "/auth",
data: jsonEncode(
{
"login": emailController.text,
"senha": passWordController.text,
},
),
options: Options(
headers: {'Content-Type': 'application/json; charset=UTF-8'},
method: "post",
),
);
if (response.statusCode == 200) {
await sharedPreferences.setString(
"token",
"string: ${response.data["string"]}",
);
print("Resposta: ${response.data["string"]}");
loaderRx(false);
return true;
} else {
print("RESPOSTA: ${response.data}");
return false;
}
}
}
如果header中的状态码不是200,Dio总是抛出异常,
您将需要使用 try catch 捕获异常。
在catch方法中,可以检查错误类型是否为DioError
,然后处理该异常,
这是我在代码中用来处理此行为的登录过程的代码片段。
Future<SignInApiResponse> signInUser(String _email,String _password) async {
try {
final dio = Dio(ApiConstants.headers());
final Response response = await dio.post(
ApiConstants.baseUrl + ApiConstants.signInUrl,
data: {"email": _email,
"password": _password,
},
);
if (response.statusCode == 200) {
return SignInApiResponse.fromJson(response.data);
} else {
return SignInApiResponse(message: response.toString());
}
} catch (e) {
if (e is DioError) {
if (e.response?.data == null) {
return SignInApiResponse(message: Messages.loginFailed);
}
return SignInApiResponse.fromJson(e.response?.data);
} else {
return SignInApiResponse(message: e.toString());
}
}
}
希望这会有所帮助
如果不是,你总是可以使用 http package 在类似的情况下不会抛出异常
我有仇恨的问题。我正在尝试使用 dio 登录,登录方法运行良好,但是当我输入无效凭据时,dio 给我这个错误:
DioError
Error in execution
我创建了一个布尔函数,如果状态代码为 200,它将 return 为真或为假,它将 return 为真,否则它将为 return 假,但是当登录时正确的凭据一切正常,一切都按预期进行,但是当使用无效凭据登录时,上面的错误会导致它。我使用共享首选项将 tolken 存储在应用程序中,逻辑很简单,如果它是 200,我会登录到应用程序,否则它会显示我在另一个文件中制作的小吃店,这是我的代码:
loginFinal() async {
if (formKey.currentState!.validate()) {
bool loginIsOk = await loginConect();
if (loginIsOk) {
Get.offAllNamed("/home");
await Future.delayed(const Duration(seconds: 1));
message(MessageModel.info(
title: "Sucesso",
message: "Seja bem vindo(a) influenciador(a)",
));
} else {
loaderRx(false); //LOADER
message(MessageModel.error(
title: "Erro",
message: "Erro ao realizar login",
));
}
}
}
//LOGICA DE ENTRAR NO APP
Future<bool> loginConect() async {
final dio = Dio();
String baseUrl = "https://soller-api-staging.herokuapp.com";
loaderRx(true); //LOADER
SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
final response = await dio.post(
baseUrl + "/auth",
data: jsonEncode(
{
"login": emailController.text,
"senha": passWordController.text,
},
),
options: Options(
headers: {'Content-Type': 'application/json; charset=UTF-8'},
method: "post",
),
);
if (response.statusCode == 200) {
await sharedPreferences.setString(
"token",
"string: ${response.data["string"]}",
);
print("Resposta: ${response.data["string"]}");
loaderRx(false);
return true;
} else {
print("RESPOSTA: ${response.data}");
return false;
}
}
}
如果header中的状态码不是200,Dio总是抛出异常, 您将需要使用 try catch 捕获异常。
在catch方法中,可以检查错误类型是否为DioError
,然后处理该异常,
这是我在代码中用来处理此行为的登录过程的代码片段。
Future<SignInApiResponse> signInUser(String _email,String _password) async {
try {
final dio = Dio(ApiConstants.headers());
final Response response = await dio.post(
ApiConstants.baseUrl + ApiConstants.signInUrl,
data: {"email": _email,
"password": _password,
},
);
if (response.statusCode == 200) {
return SignInApiResponse.fromJson(response.data);
} else {
return SignInApiResponse(message: response.toString());
}
} catch (e) {
if (e is DioError) {
if (e.response?.data == null) {
return SignInApiResponse(message: Messages.loginFailed);
}
return SignInApiResponse.fromJson(e.response?.data);
} else {
return SignInApiResponse(message: e.toString());
}
}
}
希望这会有所帮助 如果不是,你总是可以使用 http package 在类似的情况下不会抛出异常