#flutter #http #dart
Вопрос:
У меня есть класс со статическими методами для извлечения данных и использования результатов с FutureBuilder в моем веб-проекте flutter. Я делаю два запроса http post, и второй получает результат первого. Я подозреваю о параллельных вызовах и использовал ожидание. Тем не менее проблема сохраняется.
Когда ниже кода выполняется ответ.тело и ответ2.значения тела равны! getEntity1ById вызывает GETENTITY2 внутри.
ServiceConstants.getEntity1Path и ServiceConstants.getEntity2Path значения разные, я проверил!
Я делаю что-то не так?
Версия Flutter-2.5.3, а версия пакета http-0.13.4
class Entity1Services {
static Future<Entity1> getEntity1ById(String jwt, int id) async {
Entity1 entity1ToReturn;
Uri url = Uri.http(
ServiceConstants.serviceURL,
ServiceConstants.getEntity1Path,
);
final response = await http.post(
url,
headers: {
HttpHeaders.contentTypeHeader: "application/json",
"token": jwt,
},
body: jsonEncode(
{
"id": id,
},
),
);
if (response.statusCode == 200) {
Map<String, dynamic> responseJSON = json.decode(response.body);
var responseDataField = responseJSON["data"];
if (responseDataField == null) {
if (responseJSON['resultStatus'] == -1 amp;amp;
responseJSON['info'] != null amp;amp;
responseJSON['info'] != '') {
throw Exception('Failed to get marina info: ${responseJSON['info']}');
} else
throw Exception(
'Failed to get entity1 info: Null response from service!');
}
entity1ToReturn=
Entity1.fromJson(responseDataField['result'] as Map<String, dynamic>);
List<Entity2> entity2s = await getEntity2s(jwt);
entity1ToReturn.entity2s = entity2s ;
} else {
throw Exception('Failed to get marina info: Not HTTP 200!');
}
return entity1ToReturn;
}
static Future<List<Entity2>> getEntity2s(String jwt) async {
Uri url2 = Uri.http(
ServiceConstants.serviceURL,
ServiceConstants.getEntity2sPath,
);
final response2 = await http.post(
url2,
headers: {
HttpHeaders.contentTypeHeader: "application/json",
"token": jwt,
},
body: jsonEncode(
{},
),
);
if (response2.statusCode == 200) {
Map<String, dynamic> responseJSON = json.decode(response2.body);
var responseDataField = responseJSON["data"];
if (responseDataField == null) {
if (responseJSON['resultStatus'] == -1 amp;amp;
responseJSON['info'] != null amp;amp;
responseJSON['info'] != '') {
throw Exception(
'Failed to get entity2s info: ${responseJSON['info']}');
} else
throw Exception(
'Failed to get entity2s info: Null response from service!');
}
return (responseDataField['result'] as List<dynamic>)
.map((e) => Entity2.fromJson(e))
.toList();
} else {
throw Exception('Failed to get entity 2s: Not HTTP 200!');
}
}
}
Комментарии:
1. является ли URL-адрес одинаковым для обоих запросов?
2. Нет, я отладил и проверил URL-адреса. url1 и url2-это разные пути.
3. просто проверьте, есть ли у response и response2 одинаковые данные или нет, если нет, то ваши функции конфликтуют друг с другом где-то внутри.
4. ответ и ответ2 содержат разные данные. Тогда это похоже на ошибку http-пакета? Я полагаю, что я не первый человек в мире, который делает последовательные запросы http post.
5. если в http-пакете была какая-то ошибка, то он не вернет вам другие данные ответа, ошибка где-то в вашем коде, проверьте дважды.