以下代码示例是一个GET请求表单,该请求从Spring服务器检索用户电子邮件,当用户无效时,该电子邮件将引发异常。
无法从主体含义中捕获错误的问题,如果我显式打印主体消息,则可以看到它。
目的是查看错误消息给客户端,如果细节有问题
Future<bool> fetchUser(username) async {
setLoading(true);
await RestRequest(username).fetchUser().then((data) {
if (data.statusCode == 200) {
setUser(User.fromJson(json.decode(data.body)));
//print("got to ok code");
}
else{
//print(data.headers.);
}
}
).catchError((error) {
//TODO: handle errors
errorMessage = jsonDecode(error.toString())["message"];
throw(errorMessage);
});
并且当我打印data.body时看到错误。
I/flutter (10871): {"timestamp":"2020-05-20T08:40:40.205+0000","status":500,"error":"Internal Server Error","message":"could not find user for email:a","trace":"acs.logic.EntityNotFoundException: could not find user for email:a\r\n\tat acs.logic.UserServiceWithDB.getUser(UserServiceWithDB.java:71)\r\n\tat acs.logic.UserServiceWithDB.login(UserServiceWithDB.java:79)\r\n\tat acs.logic.UserServiceWithDB$$FastClassBySpringCGLIB$$879f73c1.invoke(<generated>)\r\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\r\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687)\r\n\tat acs.logic.UserServiceWithDB$$EnhancerBySpringCGLIB$$647f71c3.login(<generated>)\r\n\tat acs.rest.UserController.login(UserController.java:29)\r\n\tat jdk.internal.reflect.GeneratedMethodAccessor71.invoke(Unknown Source)\r\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n\tat java.base/java.lang.reflect.Method.inv
FetchUser函数
将'package:http / http.dart'导入为http;
class RestRequest {
final String userEmail;
final int port=8091;
RestRequest(this.userEmail);
Future<http.Response> fetchUser() {
print(this.userEmail);
return http.get('http://192.168.1.30:8091/acs/users/login/${this.userEmail}');
}
}
我做了一个工作样本,向您展示了如何解析身体。检查statusCode 200之后,jsonDecode“ body”并查找字段“ status”;如果它是“ 500”,则获取“错误”字段:
import 'package:flutter/material.dart';
import 'dart:convert';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
final String body = """
{"timestamp":"2020-05-20T08:40:40.205+0000","status":500,"error":"Internal Server Error","message":"could not find user for email:a","trace":""}
""";
Future<String> fetchUser(username) async {
print("fetchUser");
Map res = jsonDecode(body);
print(res);
if (res["status"] == 500) {
return res["error"].toString();
} else {
//setUser(User.fromJson(json.decode(data.body)));
return "got to ok code";
}
}
@override
Widget build(BuildContext context) {
print("build");
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Center(
child: FutureBuilder(
future: fetchUser("Bill"),
builder: (_, snap) {
if (snap.hasData) return Text("${snap.data}");
return Text("wait");
}),
),
),
);
}
}