首页 > 解决方案 > 从 JSON 值解码时如何删除引号和符号?扑

问题描述

这是获取我的身份验证令牌的代码。

Future <String> getToken() async{
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    return prefs.getString('token');

  }

当我打印令牌时,它会给我这个带有双引号的 json 值。

I/flutter (14710): "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiIxIiwianRpIjoiZDQzZjFjNWZjZDQxYjIzYzllNGU2ZWIyZjQ1M2FmZDgwOTJiNGZmNDAyYjI0OTBmM2RiYTUzMTgzYTU2ODZjNTNiNzVmMDY3ZmIzMmNjMjUiLCJpYXQiOjE1OTA0MDg2NjksIm5iZiI6MTU5MDQwODY2OSwiZXhwIjoxNjIxOTQ0NjY5LCJzdWIiOiIxIiwic2NvcGVzIjpbXX0.3YYdR8P1_XzK--VLAwT5gxmkyLZPMuvQhzQQ5OOl_nv0jriPwFY9sqHdL_wiqpAA5vtgBOnyAwZ2kSI_BgDzsKZzY2vMVa47Tyuz87uEFZ7-aHYvNY_r4T_gIkwAuLwc8qN2kuytFjEtuq-iQUiWgEzp5y2n3BDlzXZ7rZi5Xp1_y_6_ysII9RQtX37LuDFt3AIRbYLGDBAilPHi0iJB_jQqWqH8J1mUzCsArj2VuSel7kERqpwFz-SwOOS4EA7CaoOuOlleOpynBalTK9vm1vU3n81K4TAgNq-Mg9CsiFMVQULURdmku7-2gcc3VS8vBXo9OlEgzqmGjLDvIy8_-LCcwuoSVC2DL2t2PIcNUDKQsBu1GBPQ99wzHcnyEpvjVRkg7v4zQWtlIUY6PcLjNf_vnfuXuCERAwBwjS86T7n8ZscfmVVebISVvAKyDN6YhW41hnUw-AZYRLtuhbE8Z48V0tLfLw9aeVr-Qe2mlaYj0LqGYlqBLqUtRl9HSaA9USa6tQ1KQJvF5_6JPcIBJuSkEsrY9n1xhnCViAiyFVF4XWbtToULn69B2UtoXw1X8y_Wek_T7D7t0fi5KWKj8QHO6yI3ZIWViERS2K6n7mnL_3z_7CNeewVxmqMXNdeWl7yPmAMzUAv6z7pWm-R1Qpv7tNVj4-FfQAk3vOm56hE"

这就是我使用你从 api 获得帖子的令牌的方式,但它不起作用。

     Future<Model> ViewWelcomeScreen() async {
    String url = '$baseurl/post/20';
   ApiService().getToken().then((value){
      token = value;
    });
    final response = await http.get(url, headers: {
      'Content-type': 'application/json',
      'Accept': 'application/json',
      'Authorization': 'Bearer $token'
    });
    print(token);
    if (response.statusCode == 200) {
      var test = json.decode(response.body);
      var jsonResponse = test['data'];
      return Model.fromJson(jsonResponse);
    } else {
      throw Exception('Failed to load data');
    }
  }



标签: flutter

解决方案


Future<Model> ViewWelcomeScreen() async {
    String url = '$baseurl/post/20';
   ApiService().getToken().then((value){
      token = value;
    });
    final response = await http.get(url, headers: {
      'Content-type': 'application/json',
      'Accept': 'application/json',
      'Authorization': 'Bearer $token'
    });
    print(token);
    if (response.statusCode == 200) {
      var test = json.decode(response.body);
      var jsonResponse = test['data'];
      return Model.fromJson(jsonResponse);
    } else {
      throw Exception('Failed to load data');
    }
  }

代码在某种程度上是错误的,认为你有 async 然后两者都在同一个函数上,为什么?

ApiService().getToken().then((value){
      token = value;
    });

在这里你说我想要令牌,我不需要等待然后你去尝试使用那个变量

final response = await http.get(url, headers: {
      'Content-type': 'application/json',
      'Accept': 'application/json',
      'Authorization': 'Bearer $token'
    });

在颤动中看到每个 async-await 的工作方式类似于 javascript 中的事件循环

  1. 我写异步
  2. 普通代码
  3. 在 1. 函数中使用 then
  4. 1. 中的依赖代码作为 async-await

输出会是什么?事件循环将首先将 1,2,3,4 作为异步函数,它将运行 1,一旦它接收到正常代码,它就会正常运行,但如果它接收到,它就会明白这个结果并不重要,所以让我做剩下的工作将返回执行 3rd then 函数,因此它将运行 4 然后 3rd 函数

但是你想要令牌

ApiService().getToken().then((value){
      token = value;
    });

将其替换为

token = await ApiService().getToken();

您的服务可能需要令牌,这就是它不是 200 状态码的原因。


推荐阅读