我是 flutter 新手,我正在使用http包进行网络调用。如果请求的响应代码为 200,我想刷新令牌并再次调用请求。如何使用 http 包实现此目的?我听说过dio包,但它对我来说很复杂。
User getUser(){
final response = http.post(Uri.https(BASE_URL, '/api/user'),
headers: {'Authorization: Bearer $token'});
if(response.statusCode == 200){
return User.fromJson(jsonDecode(response.body)['user']);
}
else if(response.statusCode == 401){
//refresh token and call getUser again
}
}
Run Code Online (Sandbox Code Playgroud) 我有以下代码来上传文件。
var client = new dio.Dio();
await client.put(
url,
data: formData,
options: dio.Options(
headers: headers,
),
onSendProgress: (int sent, int total) {
final progress = sent / total;
print('progress: $progress ($sent/$total)');
},
);
Run Code Online (Sandbox Code Playgroud)
上传文件工作正常。问题是,我有一个视图,它有一个圆形进度条,指示onSendProgress触发时的上传进度。当我上传一个 ~10MB 的文件时,进度条会在一秒钟内从 0% 跳到 100%,然后在继续执行其余代码之前等待几秒钟(取决于文件大小)。这对我来说似乎很奇怪,因为我希望进度条会逐渐增加进度。
您可以在下面找到我的示例中的打印输出,其中包含一个 ~10MB 的文件。
flutter: progress: 0.000003035281907563734 (29/9554302)
flutter: progress: 0.000013187776563897604 (126/9554302)
flutter: progress: 0.999996546058519 (9554269/9554302)
flutter: progress: 0.9999967553883057 (9554271/9554302)
flutter: progress: 1.0 (9554302/9554302)
Run Code Online (Sandbox Code Playgroud)
这是一个较小的文件,但具有相同数量的回调。
flutter: progress: 0.00001847214941293598 (29/1569931)
flutter: progress: 0.00008025830434585978 (126/1569931)
flutter: progress: 0.9999789799679094 (1569898/1569931)
flutter: progress: 0.9999802539092483 …Run Code Online (Sandbox Code Playgroud) 我的 Flutter 应用程序中有以下代码,其中MyDataLoader一个小部件从main.dart
代码:
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
class MyDataLoader extends StatefulWidget {
@override
_MyDataLoaderState createState() => _MyDataLoaderState();
}
class _MyDataLoaderState extends State<MyDataLoader> {
void getData() async {
final response = await http.get('https://jsonplaceholder.typicode.com/albums/1');
print(response);
}
@override
void initState() {
super.initState();
getData();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Text('MyDataLoader screen'),
);
}
}
Run Code Online (Sandbox Code Playgroud)
问题:
以上代码的灵感来自https://flutter.dev/docs/cookbook/networking/fetch-data。MyDataLoader加载小部件时出现以下错误:
[错误:flutter/lib/ui/ui_dart_state.cc(177)] 未处理的异常:SocketException:连接失败(操作系统错误:不允许操作,errno = 1),地址 = jsonplaceholder.typicode.com,端口 = 443
上述错误当然是因为我的小部件加载时调用了以下代码行。
最终响应 = await http.get('https://jsonplaceholder.typicode.com/albums/1');
但是 …
我正在尝试开发也可以在 destkop 上运行的 Flutter 应用程序。这个应用程序正在使用 http 包:
import 'package:http/http.dart'
Run Code Online (Sandbox Code Playgroud)
当我尝试执行 http 请求时,出现此异常:
SocketException: Connection failed (OS Error: Operation not permitted, errno = 1), address = firebasedynamiclinks.googleapis.com, port = 443
Run Code Online (Sandbox Code Playgroud)
此应用在 Android 和 iOS 上运行,如何为 macos 启用此权限?
我正在使用 IntelliJ IDE,所以这个答案并不让我满意Flutter - http.get 在 macos 构建目标上失败:连接失败
我正在使用Flutter版本3.3.8和Google Chrome版本107.0.5304.110。
我发送一个 http 请求,这是我收到的错误:
ChromeProxyService: Failed to evaluate expression 'xhr': InternalError: Expression evaluation in async frames is not supported. No frame with index 30..
google-chrome flutter flutter-web flutter-http flutter-web-browser
仅当我更新flutter版本时才会出现该问题。之前版本:2.5.3 当前版本:2.10.3
我遇到了 Flutter Android 12+ 版本的问题。使用 Flutter http 插件(版本:0.13.5)进行应用程序消费 REST API 调用。所有API调用都是带有域名的HTTPS服务调用。API 调用需要 10 多秒才能提供响应,而相同的 API 调用在移动数据网络中只需要不到一秒。我尝试使用 Java Client 和 Postman 进行相同的 API 调用,所有响应仅花费不到一秒的时间就得到响应。
\n在故障排除过程中,我使用Wifi网络测试了以下场景
\n现在我明白基于 Wifi 的 API 调用总是需要 10 秒 + 实际服务调用时间(例如 400 毫秒,因此相当于 10.400 秒)。
\n这个问题有什么具体原因吗?
\nflutter doctor -v\n[\xe2\x88\x9a] Flutter (Channel stable, 3.3.6, on Microsoft …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过 Flutter Web 将图像上传到 Strapi。我知道(从此链接)我需要使用 FormData 来做到这一点。我研究了很多方法来做到这一点,我偶然发现了Dio,当然还有Http。
两种解决方案都给了我错误:
Unsupported operation: MultipartFile is only supported where dart:io is available.
我试过这个代码:
var request = new http.MultipartRequest("POST", Uri.parse(url));
request.files.add(
await http.MultipartFile.fromPath(
"files",
imageFilePath,
),
);
request.send().then((response) {
if (response.statusCode == 200) print("Uploaded!");
print(response.statusCode);
}).catchError((e) => print(e));
Run Code Online (Sandbox Code Playgroud)
正如这里所建议的。
当我使用MultipartFile.fromBytes(...).
我只是想上传一个文件,因此我认为我的身体应该只包含 FormData ,正如Strapi 的文档中files提到的那样。
flutter ×10
flutter-http ×10
dart ×3
dio ×3
android ×2
dart-io ×1
file-upload ×1
flutter-web ×1
form-data ×1
http ×1
http3 ×1
macos ×1
strapi ×1