#flutter #http #dart
Вопрос:
Мой бэкэнд flask предназначен для ответа на 2 отдельных HTTP — запроса для входа в систему и получения данных.
Чтобы войти в систему, делается запрос на публикацию из нескольких частей (только из-за того, что я не могу найти другой простой способ публикации с данными формы).:
Future<String> login(String username, String paswd) async {
var headers = {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, br',
'User-Agent': 'testLap',
'Cache-Control': 'no-cache'
};
var request = http.MultipartRequest('POST', Uri.parse(domain '/login'));
request.followRedirects = false;
request.persistentConnection = false;
request.fields.addAll({'username': username, 'password': paswd});
if (sessionCookie != "blank") {
request.headers.addAll({'Cookie': sessionCookie});
}
request.headers.addAll(headers);
http.StreamedResponse response = await request.send().timeout(const Duration(seconds: 5));
if (response.statusCode == 200) {
String resBody = await response.stream.bytesToString();
if (resBody != "Already logged in!...") {
sessionCookie = response.headers['set-cookie'].toString();
}
print(response.headers);
print(response.headers['set-cookie']);
print(response.contentLength);
return (resBody);
} else {
print(response.reasonPhrase);
return ("Failed");
}
}
Затем, чтобы получить некоторые данные:
Future<String> myDash() async {
var request = http.Request('GET', Uri.parse(domain '/myDash'));
print("<<MyDash() called>>");
var headers = {
"Connection": "keep-alive",
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, br',
'User-Agent': 'testLap',
'Cache-Control': 'no-cache'
};
if (UniversalPlatform.isAndroid || UniversalPlatform.isIOS) {
print("<<Is android>");
headers.addAll({'Cookie': sessionCookie});
}
request.headers.addAll(headers);
http.StreamedResponse response = await request.send();
if (response.statusCode == 200) {
return (await response.stream.bytesToString());
} else {
return (response.reasonPhrase.toString());
}
}
На оборудовании Android emulator , а также в приложении, размещенном на сервере, эти запросы выполняются последовательно и работают безупречно.
Однако, когда я запускаю приложение через отладку chrome (изнутри Android studio), запросы объединяются в https://[domain].xxx/[login-route]?next=/[get-data-route]
Как делаются запросы:
onPressed: () async {
FocusScopeNode currentFocus = FocusScope.of(context);
if (!currentFocus.hasPrimaryFocus) {
currentFocus.unfocus();
}
String response = await httpService.login(usernameController.text.trim().toString(), pswdController.text.toString());
infoController.text = response;
print(response);
if(response.contains("****")){
String deets = await getDeets();
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => Dash(name: usernameController.text.trim().toString(), httpService: httpService, dash: deets)),
);
}
}
getDeets() — Fetches myDash()
Is there a way to stop this from happening? Debugging web is nearly impossible without pushing it onto a server, and I would very much like that not to be the case!
http: ^0.13.3