【问题标题】:GET Request in FlutterFlutter 中的 GET 请求
【发布时间】:2020-07-04 07:39:16
【问题描述】:

我昨天从颤振开始,今天我遇到了 GET 请求的问题。

我似乎无法从我的 URL 获取数据,我不知道为什么当我将其粘贴到浏览器中时一切正常

我试图获得一个 User 对象,但对我没有任何作用:(

我的代码,

用户.dart

class User{
  int id;
  String firstName;
  String lastName;
  String email;

  User(this.id, this.firstName, this.lastName, this.email);

  User.fromJson(Map<String,dynamic> json){
    id = json['id'];
    firstName = json['firstName'];
    lastName = json['lastName'];
    email = json['email'];
  }
}

我的 GET 函数:

Future<User> getCurrentUser() async {
    String url = 'http://10.0.2.2:80/user/current';
    final response =
        await http.get(url, headers: {"Accept": "application/json"});


    if (response.statusCode == 200) {
      return User.fromJson(json.decode(response.body));
    } else {
      throw Exception('Failed to load post');
    }
  } 

我的小部件:

class UserPageState extends State<UserPage>{
  Future<List<dynamic>> _user;

 @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Builder(
        builder: (context) => Container(
          child: FutureBuilder(
            future: getCurrentUser(),
            builder: (BuildContext context, AsyncSnapshot snapshot){
              if(snapshot.hasData ){
                return Container(
                  child: Center(child: Text(snapshot.data['firstName']),),
                );
              }else {
                return Text('NOT LOAD');
              }
            },
          ),
        ),
      ),
    );
  }
}

当我将url 粘贴到浏览器中时,它会显示:

{
createdAt: 1584905291338,
updatedAt: 1584905291338,
id: 3,
firstName: "name",
lastName: "surname",
email: "surname@name.com",
admin: false
}

我不知道我能做什么, 请帮助我:(

【问题讨论】:

  • 可能你需要向服务器传递一些东西来获取数据? (标头中的令牌或ID或类似内容)
  • @MidhunMP 但是当我在浏览器中运行时,此链接一切正常并正确返回数据
  • 需要某种方法来确定哪些用户详细信息需要返回对吗?您必须向服务器传递某种参数来识别您需要获取哪些用户数据,对吗?尝试从代码中删除这些标头字段并检查
  • 我删除并且没有更改,当我运行这个 url 时我不需要向服务器提供任何参数
  • 这可能是您的服务器不喜欢 dart 将在标题中接受的工作小写。顺便说一句,您如何在浏览器中设置该标题?您是否尝试过 Postman 的请求?

标签: json rest api flutter request


【解决方案1】:

首先,我建议您从 StatefulWidget 中的 initState 获取数据,而不是在 build 方法中。否则,在每次重建时,都会通过 http.get 重新获取数据。在您使用的 FutureBuilder 小部件中,然后使用 future: _user

class UserPage extends StatefulWidget {
  UserPage({Key key}) : super(key: key);

  @override
  UserPageState createState() => UserPageState();
}

class UserPageState extends State<UserPage>{
  Future<User> _user;

  @override
  void initState() {
    super.initState();
    _user = getCurrentUser();
  }

  @override
  Widget build(BuildContext context) {
    ... // your code here

回答您的问题以及为什么未填充用户类及其数据。必须从函数User.fromJson(...)返回数据,否则会丢失

class User{
  int id;
  String firstName;
  String lastName;
  String email;

  User(this.id, this.firstName, this.lastName, this.email);

  factory User.fromJson(Map<String,dynamic> json){
    return User(
      json['id'],
      json['firstName'],
      json['lastName'],
      json['email'],
    );
  }
}

【讨论】:

  • 谢谢,但仍然从get 方法向我抛出异常:(
  • 你能发布确切的错误信息吗,也许你可以打印出响应的状态码
  • 状态码是 400 :/ 在我的 if 语句中抛出我的错误,在 else throw exception
  • 看起来我无法从我的 URL 获取数据,我不知道为什么当我将其粘贴到浏览器中时一切正常
  • 只是为了确保:请尝试这个 URL:jsonplaceholder.typicode.com/todos/3 并告诉我您是否仍然收到异常和 400 状态代码
【解决方案2】:
class User{
  int id;
  String firstName;
  String lastName;
  String email;

  // For me, it's better to use named parameter to make it easier to read
  User({this.id, this.firstName, this.lastName, this.email});

  // this doesn't return User object
  User.fromJson(Map<String,dynamic> json){
    id = json['id'];
    firstName = json['firstName'];
    lastName = json['lastName'];
    email = json['email'];
  }

  factory User.fromJson(Map<String,dynamic> json){
    return User(
      id: json['id'],
      firstName : json['firstName '],
      lastName : json['lastName '],
      email : json['email '],
    );
  }
}

【讨论】:

  • 谢谢,但仍然从get 方法向我抛出异常:(
猜你喜欢
  • 2019-12-26
  • 2020-11-23
  • 2019-05-07
  • 1970-01-01
  • 1970-01-01
  • 2022-09-30
  • 2022-12-03
  • 2019-08-15
  • 2019-11-21
相关资源
最近更新 更多