Два последовательных http-запроса дают один и тот же результат в приложении flutter

#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-пакете была какая-то ошибка, то он не вернет вам другие данные ответа, ошибка где-то в вашем коде, проверьте дважды.