在颤动中打印休息请求错误时出现问题

Posted

技术标签:

【中文标题】在颤动中打印休息请求错误时出现问题【英文标题】:Having an issue printing Rest request error in flutter 【发布时间】:2020-09-06 11:56:58 【问题描述】:

以下代码示例是从 Spring 服务器检索用户电子邮件的 GET 请求表单,当用户无效时抛出异常。

我无法从body含义中捕捉到错误的问题,如果我显式打印Body消息就可以看到。

目的是在细节有问题时查看错误信息给客户端

  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');
  

【问题讨论】:

你能添加你如何使用fetchUser的代码吗?您为此使用 FutureBuilder 吗? 如果为 200,则必须解析 JSON 正文响应并检查是否 body["status"]==500 然后 print(body["error"]) 已编辑帖子 看起来你在 Flutter 应用中有正确的代码,但是服务器返回了关于错误数据的消息。 您好@aviomer,您能否检查一下您在 data.statusCode 中收到的值是多少?谢谢 【参考方案1】:

我制作了一个工作示例来向您展示如何解析正文。 检查statusCode 200后,json解码“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");
              ),
        ),
      ),
    );
  

【讨论】:

Hello @aviomer 在你的情况下 (data.statusCode == 200) 是真还是假?

以上是关于在颤动中打印休息请求错误时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

打印 json 对象时出现意外的令牌 L 使用高级休息 chrome

在颤动中加载 api 时出现类型转换错误

为啥开发控制台停止我的请求显示 CORS 错误而其他休息工具没有

从 HttpClient SendAsync 请求获取响应时出现无法解释的超时和延迟

更改饼图颤动中的值时出现问题

重新绘制图像时出现白色闪烁[颤动]