dart Flutter http.get(url)在为web构建时会在响应代码403上抛出一个Exception,如果为native构建则返回一个响应,臭虫?

brgchamk  于 2023-09-28  发布在  Flutter
关注(0)|答案(2)|浏览(154)

Flutterwebhttp对状态不是200的响应抛出http.ClientException。该异常具有消息“XMLHttpRequest错误”。如何获取实际的响应正文和状态代码?网上的例子说使用response.statusCode,但在返回response之前抛出了exception。

try {
   Uri uri = Uri.parse(apiEndpoint);
   final response = await http.get(uri, headers: {"Authorization": "Bearer token"});
   print(response.statusCode); **// THIS LINE IS NEVER EXECUTED IF RESP CODE IS NOT 200**
} catch(e) {
   print(e); // Was it 403, 404 or 500???
}
jogvjijk

jogvjijk1#

你描述的那个案子
XMLHttpRequest错误
发生的原因是CORS,它抛出一个Exception而不是返回结果。
所以为了抓住这一点,你可以看看下面的示例代码。

try {
  Uri uri = Uri.parse(apiEndpoint);
  final response =
      await http.get(uri, headers: {"Authorization": "Bearer token"});
  debugPrint("ResponseCode: ${response.statusCode}");
} catch (e) {
  if (e is http.ClientException && e.message == "XMLHttpRequest error.") {
    debugPrint("CORS error.");
    return;
  }
  debugPrint("Exception: ${e.toString()}");
}

如果你想在Flutter Web中禁用CORS,你可以通过以下命令运行你的项目来实现:
flutter run -d Chrome --web-browser-flag“--disable-web-security”
至于其余的情况,response.statusCode 应该足够了。

sh7euo9m

sh7euo9m2#

在Flutter中,http包在发生网络错误时确实会抛出ClientException,但默认情况下,对于HTTP状态码200以外的情况,它不会抛出此异常。相反,它返回带有非200状态代码的响应沿着响应正文。您可以直接访问状态代码和响应正文,而不需要异常处理。
下面是修改后的代码:

try {
  Uri uri = Uri.parse(apiEndpoint);
  final response = await http.get(uri, headers: {"Authorization": "Bearer token"});

  // Check if the response status code is not 200 (OK)
  if (response.statusCode != 200) {
    print('Status Code: ${response.statusCode}');
    print('Response Body: ${response.body}');
  } else {
    // Handle the successful response here
    print('Successful Response: ${response.statusCode}');
  }
} catch (e) {
  print('Error: $e');
}

相关问题