使用 SharedPreferences 中的令牌持有者编辑配置文件数据

Posted

技术标签:

【中文标题】使用 SharedPreferences 中的令牌持有者编辑配置文件数据【英文标题】:edit profile data flutter with token bearer from SharedPreferences 【发布时间】:2021-02-06 03:59:06 【问题描述】:

我使用 Postman 令牌持有者创建了一个登录功能,即使应用程序已关闭,用户也可以保持登录状态。 现在我想编辑已登录应用程序的电子邮件和个人资料密码,然后使用已保存的 sharpref 中的相同令牌持有者保存它。

如何实现它。下面是我获取数据的代码,但是这段代码仍然有错误。

getPerfs() async 
WidgetsFlutterBinding.ensureInitialized();
SharedPreferences prefs = await SharedPreferences.getInstance();
var apikey = prefs.getString('apikey');
print(apikey);


var url = 'http://api.batulimee.com/v1_ship/my_profile';
Future<Map> getData() async 
var fullUrl = url + await getPerfs();
var response = await http.post(fullUrl);
return json.decode(response.body) as Map<String, dynamic>;

这是来自 API url my_profile 的 json 结构。


"status": "success",
"data": 
    "id_user": 49,
    "id_role": "8",
    "name_role": "Ship Owner",
    "first_name": "a",
    "last_name": "f",
    "email": "afriansyahm86@gmail.com",
    "phone": "082258785595",
    "saldo": "0",
    "company_name": "aa",
    "company_address": "jl kav pgri",
    "photo": "https://batulimee.com/foto_user/avatar.png"
,
"message": "get profile detail successfully "

如果你想得到它,你必须使用 Postman 授权令牌持有者。

如何获取所有这些数据并进行编辑?

【问题讨论】:

【参考方案1】:

第一件事是在您的 getPerfs() 方法中,我可以看到您正在保存 apikey 但在您的情况下 getData() 的其他方法无法访问。

我会以不同的方式做这件事,

      Future<Map<String,dynamic>> getData() async 

       try 
         var url = 'http://api.batulimee.com/v1_ship/my_profile';
       
          SharedPreferences prefs = await SharedPreferences.getInstance();
          
          var apikey = prefs.getString('apikey');
          
          var response = await http.post(
            url,
            headers: 
              "Accept": "application/json",
              "Content-Type": "application/json",
              "Bearer Token" : apikey
        
            ,
          );
       var checkResponse =  json.decode(response.body) as Map<String, dynamic>;
       print('checkResponse');
       return checkResponse;  
         catch (e) 
          print(e);
          throw(e); 
        
      

只需复制并粘贴此代码即可获取数据,但我建议您将获取的数据保存在变量中,而不是返回数据。

还有一点,这可能是一个获取 API 而不是发布 API,因为您在请求负载中没有提供任何内容。

【讨论】:

但我提供了一个可变的令牌持有者 @Aphron 您正在创建 getPerfs() 方法可以访问的 apikey 变量,只有您不能在 getData() 方法中使用该变量。如果你想使用 apikey,那么在 Class 下声明它而不是在方法中。 对不起 Shrey Jain,我正在更新我的帖子。请看一下。要从 my_profile 获取 json 数据,需要一个令牌承载,必须在 Authorization 参数中指定,如图所示。 那个token bearer和我登录时生成的token是一样的。然后我把它保存在sharedperf上,这样用户就保持登录状态。那么token bearer也可以用来获取json来自 my_profile 的数据 嗨@Aphron 抱歉回复晚了,var fullUrl = url + await getPerfs(); ,这是错误的实现,异步/等待的事情需要时间,所以在你的 fullUrl 变量中,你的 URL 可能没有附加 apikey,第二件事在你的 getPerfs() 中你没有返回任何东西,所以 var fullUrl = url;永远都是这样。

以上是关于使用 SharedPreferences 中的令牌持有者编辑配置文件数据的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Kotlin 在 Android sharedPreferences 中保存数据

SharedPreferences 在 null 颤动上调用

SharedPreferences 中的 commit() 和 apply() 有啥区别

SharedPreferences-静态类中的静态字符串?

颤振中的 mockito 缺少存根错误。尝试在模拟的 SharedPreferences 上使用 setString

如何在 Android 中安全地存储访问令牌和秘密?