rxDart не вызывает onError - PullRequest
       0

rxDart не вызывает onError

0 голосов
/ 31 августа 2018

Я пытаюсь сделать простой запрос к бэкэнду, используя rxDart. Но проблема, с которой я сталкиваюсь, заключается в том, что когда я получаю http-ошибку, такую ​​как 404, onError не вызывается, однако ее можно извлечь в onData.

У меня небольшой опыт работы с модификацией RxJava +, и там она работает, как и ожидалось, когда есть ответ с ошибкой http, вызывается код состояния onError и может обрабатываться соответствующим образом.

  1. Что я делаю неправильно или это предполагаемое поведение?

    Object sendProfileData() {
        Stream<Response> stream = onboardingRepository
           .createUser(User(name: 'name', surname: 'surname', lat: 1.0, lng: 2.0));
    stream.listen((response) {
      print(response.statusCode);
      setAttributes();
    }, onError: (e) {
      print(e);
    });
    

    }

OnboardingRepository.dart:

    class OnboardingRepository {
     Observable<Response> createUser(User user) {
       return Observable.fromFuture(TMApi.createUser(user));
  }
}

TMApi.dart:

class TMApi {

  static Future<http.Response> createUser(User user) async {
    String url = '$baseUrl/create_user';
    return await http.post(url, body: json.encode(user.toJson()));
  }
}
  1. Как лучше всего обработать событие в представлении? В случае возникновения ошибки должна отображаться ошибка, в противном случае должен открыться новый экран. Метод sendProfileData () вернет Object, основываясь на том, что я собираюсь выполнить действия в представлении, но это не похоже на очень элегантное решение ...

  2. Любые предложения по архитектуре приветствуются:)

1 Ответ

0 голосов
/ 31 августа 2018

библиотека http в dart работает немного иначе, чем Retrofit.

Future, возвращаемое http.post, создает исключение только при возникновении ошибки ввода-вывода (ошибка сокета, нет интернета).

Ответы сервера, такие как 404, отражены в http.Response.

Я создал простой удобный метод, который может вам помочь:

void throwIfNoSuccess(http.Response response) {
  if(response.statusCode < 200 || response.statusCode > 299) {
    print('http error!');
    print(response.body);
    throw new HttpException(response);
  }
}

class HttpException implements Exception {
  HttpException(this.response);

  http.Response response;
}

Как использовать:

import 'dart:convert';
import 'package:http/http.dart' as http;

Future<UserProfile> getUserProfile(String userId) async {
  final url = 'https://example.com/api/users/$userId';

  final response = await http.get(url);

  throwIfNoSuccess(response);

  final jsonBody = json.decode(response.body);

  return UserProfile.fromJson(jsonBody);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...