flutter - 如何在 Flutter 中缓存没有 dio 的 POST 请求?
问题描述
我正在尝试缓存一些 API 调用,但到目前为止我找不到最好/最优化的方法。我对为此使用 Dio 不感兴趣,因为我有很多 API 调用需要缓存。
另外,我尝试使用async_resource
它似乎是一个非常简单的插件,但它与flutter_google_places
我在项目中使用的不兼容。
我看了看,flutter_cache_manager
但没有找到任何关于 POST 调用的示例。
所以,这就是我执行 API 调用的方式:
var url = 'www.my-url.com/api';
var header = {
"Content-type": "application/json",
"key": "my-key",
"token": "my-token"
};
var params = {
"limit": limit,
"page": page,
};
var _body = json.encode(params);
try {
var response = await http.post(url, headers: header, body: _body);
return json.decode(response.body);
} catch (e) {
return null;
}
我应该如何缓存这些数据?
解决方案
我同时使用了这两种flutter_cache_manager
方法http.post
来实现这一点。
以下是我尝试过的方法,现在工作正常。
注意:确保finalUrl
下面的每个标题/参数更改都有一个唯一的 url,这些更改必须在您的逻辑中生成。
String finalUrl = 'some unique url';
String tempResponse = '';
// checks if the file exists in cache
var fileInfo = await DefaultCacheManager().getFileFromCache(finalUrl);
if (fileInfo == null) {
// get data from online if not present in cache
http.Response response;
try {
var response = await http.post(url, headers: header, body: _body);;
} catch (e) {
print(e);
}
tempResponse = response.body;
// put data into cache after getting from internet
List<int> list = tempResponse.codeUnits;
Uint8List fileBytes = Uint8List.fromList(list);
DefaultCacheManager().putFile(finalUrl, fileBytes);
} else {
// get data from file if present in cache
tempResponse = fileInfo.file.readAsStringSync();
}
var result = json.decode(tempResponse);
推荐阅读
- json - Google 表格:ImportJSON 与请求标头中的键/值对
- dropwizard - 在 dropwizard 中,访问应用程序中任何位置的配置对象的最佳方式是什么
- asp.net-mvc - 修改后的 ClaimsPrincipal 无效
- python - 派生问题 - 如何修复“TypeError:'Add' object is not callable”
- python - 将抓取的列表添加到 Pandas Dataframe
- c++ - 如何从文件中读取输入并将其配对到 C++ 中的映射中
- php - 如何在回声中更改此href?
- java - 将 XML 文档插入 marklogic 数据库时如何编码@符号
- javascript - 如何使用 javascript/jquery 在特定模式后将文本拆分为新行?
- python - 锯齿交易错误:“试图设置未经授权的地址”