我试图使用rxDart提出一个简单的后端请求。但是,我面临的问题是,当我得到诸如404这样的http错误时,不会调用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()));
}
}发布于 2018-08-31 16:19:01
dart中的http库的工作方式与Retrofit稍有不同。
只有在出现io错误(套接字错误,没有互联网)时,http.post返回的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);
}https://stackoverflow.com/questions/52117308
复制相似问题