从今天起,每当我尝试登录我的应用程序时,我都会收到 Dio 包抛出的以下错误:SocketException: Insecure socket connections are disallowed by platform: 10.0.2.2
我使用以下设置进行连接:
static BaseOptions options = new BaseOptions(
baseUrl: "http://10.0.2.2:3000", // on android emulator
connectTimeout: 5000,
receiveTimeout: 3000)
Run Code Online (Sandbox Code Playgroud)
因此,类似于(我在 /user/login 处设置了身份验证并正常运行):
var apiLogin = api.dio;
try {
Response response = await apiLogin.post("/user/login",
options: Options(contentType: "application/json"),
data: {"email": email, "password": password});
} on DioError catch (e) {
throw Exception([e]);
}
Run Code Online (Sandbox Code Playgroud)
我有一个在端口 3000 上运行的节点服务器,它连接到(容器化的)mongodb。尝试身份验证时,它立即出现 DioError,我无法在网上的任何地方找到原因。
有谁知道这个错误与什么有关?
编辑[答案]
感谢@lyrics为我指明了正确的方向:从 API 级别 27 及更高级别开始,usesCleartextTraffic 默认为 false,因此阻止传出的 http 请求,需要 HTTPS。
解决方案是将以下内容添加到 AndroidManifest.xml: …
我已经在 CIFAR10 数据集上训练了一个 CNN(占位符,稍后将替换为不同的模型)并将模型集成到烧瓶 API 中。API 托管在 Heroku 上,我现在想使用 Flutter / Dart 在我的手机上拍照,将它们发送到 Flask API,在它们上运行我的训练模型并返回预测。
使用 python,我可以轻松地向我的 API 发出发布请求并返回预测。这是我的简单python代码:
import requests
import json
img = open('some-picture.jpg', 'rb')
files = {'image': img}
response = requests.post("url_to_api", files=files)
print(response.text)
Run Code Online (Sandbox Code Playgroud)
我使用 Flutter / Dart 的时间并不长,我认为发出 htpp 请求的过程比在 python 中复杂一些。有人能给我一些指示或代码,让我可以用我的相机拍照,将它上传到我的 API,并将响应存储在一个变量中吗?这是我的烧瓶 API 的(简化的)python 代码:
from flask import Flask, request
import os
import numpy as np
from PIL import Image
from tensorflow import keras
app = Flask(__name__)
app.config["DEBUG"] = True
model = keras.models.load_model('cifar10_cnn.h5')
labels = ["Airplane", …Run Code Online (Sandbox Code Playgroud) 你好,我尝试使用 dio 包上传图像,但我必须为图像设置 contentType 但我无法设置它并在设置 MediaType 时出现此错误 ====> 未为类型“AnalyzeData”定义方法“MediaType” .
这是我的代码
Dio dio = new Dio();
dio.options.headers = {
'token': token,
};
try {
String ip = await getServerIP();
FormData formData = new FormData.fromMap({
"front":front==null?null: MultipartFile.fromFileSync(
front,
filename: "image.png",
contentType: MediaType() <=== get error in this line
),
}
);
response = await dio.post("$url", data: formData);
Run Code Online (Sandbox Code Playgroud)
我如何修复它我使用的是最新版本的 Dio 包
我在数字海洋中托管一个空间 - 它基本上是数字海洋的 Amazon S3 等价物。我的 dio 问题是,我正在使用 dio 向 10MB 大小的文件发出获取请求。该请求在我的手机上需要大约 9 秒,但在我的浏览器中需要 3 秒。我的自定义后端也有这个问题。使用 dio(使用 dart 的 http 模块)发出的请求似乎非常慢。我需要解决这个问题,因为我需要不时向用户传输 50MB 的数据。为什么 dio 对 GET 请求反应缓慢?
await Dio().get(
"Remote_Url_I_can_not_share",
onReceiveProgress: (int downloaded, int total) {
listener
.call((downloaded.toDouble() / total.toDouble() * metadataPerc));
},
cancelToken: _cancelToken,
).catchError((err) => throw err);
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个自动建议输入,该输入从后端 API 获取结果。这是我的代码:
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:hello_world/api.dart';
import 'package:hello_world/autocomplete_item.dart';
class Debouncer {
final int milliseconds;
VoidCallback? action;
Timer? _timer;
Debouncer({this.milliseconds = 250});
run(VoidCallback action) {
_timer?.cancel();
_timer = Timer(Duration(milliseconds: milliseconds), action);
}
}
class AutoCompleteInput extends StatefulWidget {
const AutoCompleteInput({
Key? key,
this.label = 'Suggest',
this.textInputAction,
this.validator,
this.errorMessage,
}) : super(key: key);
final String label;
final TextInputAction? textInputAction;
final FormFieldValidator<String>? validator;
final String? errorMessage;
@override
_AutoCompleteInputState createState() => _AutoCompleteInputState();
}
class _AutoCompleteInputState extends State<AutoCompleteInput> {
final _debouncer = …Run Code Online (Sandbox Code Playgroud) final dio = Dio();
try {
await dio.request(
'https://api.example.com/api/v1/auth/validateMobile',
data: {"phoneNo": "+91999999999"},
options: Options(
method: 'GET',
headers: {
HttpHeaders.authorizationHeader:
'Bearer $token',
'content-Type': 'application/json'
},
),
);
} on DioError catch (e) {
print(e);
}
Run Code Online (Sandbox Code Playgroud)
I/flutter (16336): DioError [DioErrorType.response]: Http status error [401]
I/flutter (16336): #0 DioMixin.assureDioError (package:dio/src/dio_mixin.dart:819:20)
I/flutter (16336): #1 DioMixin._dispatchRequest (package:dio/src/dio_mixin.dart:678:13)
I/flutter (16336): <asynchronous suspension>
I/flutter (16336): #2 DioMixin.fetch.<anonymous closure>.<anonymous closure> (package:dio/src/dio_mixin.dart)
I/flutter (16336): <asynchronous suspension>
Run Code Online (Sandbox Code Playgroud)
即使我使用正确的令牌传递授权标头,我仍收到 401 错误。感谢您的帮助。
我是颤振新手。当我尝试将数据上传到服务器时,我遇到了一些问题,例如: 1.NoSuchMethodError:在 null 上调用 getter 'friendsList' 2.DioError [DioErrorType.DEFAULT]:将对象转换为可编码对象失败:'FormData' 实例
import 'dart:convert';
import 'dart:io';
import 'package:data_collection/helperClass/testForAddButton.dart';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:http_parser/http_parser.dart';
class AutoCompleteDemo extends StatefulWidget {
@override
_AutoCompleteDemoState createState() => _AutoCompleteDemoState();
}
class _AutoCompleteDemoState extends State<AutoCompleteDemo> {
final hospitalNameEng = TextEditingController();
final _serviceKey = GlobalKey<FormState>();
static List<String> friendsList = [];
File imageFile;
String servicejson;
bool loading = true;
@override
void initState() {
super.initState();
}
//for camera dialogBox
Future<void> _showChoiceDialog(BuildContext context) {
return showDialog(
context: context,
builder: (BuildContext context) …Run Code Online (Sandbox Code Playgroud) 我正在使用 DIO 包进行 API 请求,但问题是当我请求另一个 API 时,而第一个 API 仍在进行中。
它不会取消第一个请求。这两个 API 同时运行,这在我的应用程序场景中并不理想。
class DioClient {
static BaseOptions options = BaseOptions(baseUrl: baseUrl);
Dio _dio = Dio(options);
Future<dynamic> postFormData(
{dynamic data, String url, dynamic header}) async {
final data1 = data;
var formData = FormData.fromMap(data1);
try {
var response = await _dio.post(url,
options: Options(headers: header), data: formData);
return response.data;
} catch (e) {
throw e;
}}}
Run Code Online (Sandbox Code Playgroud) 我正在package:dioFlutter Web 应用程序中使用。
然而,每当我发送 POST 请求时,它就会更改为 OPTIONS 请求。发出 API 请求的函数如下所示:
Future<LoginResponse> login(LoginRequest request) async {
final dio = Dio(BaseOptions(baseUrl: "http://localhost:8000"));
final response = await dio.post("/login", data: request.toJson());
return LoginResponse.fromJson(jsonDecode(response.data));
}
Run Code Online (Sandbox Code Playgroud)
此代码将OPTIONS请求发送到http://localhost:8000/login. 如果我将该端点添加到我的服务器,它就可以工作。
如果我手动从邮递员发送 POST 请求,它也可以工作。
如果我将此代码更改为其他方法(例如dio.delete(...)),它也会映射到OPTIONS请求。
为什么要dio重写我的请求?