jquery - 如何缓存外部json请求?

标签 jquery ajax json wordpress

在 WordPress 主题中,我显示来自外部 JSON API 的信息。如何缓存这些数据以缩短页面加载时间。

我有一个 jQuery 函数

var url = 'http://my.api.com/'
$.getJSON(url)
  .done( function(data) {
    #display this data
  })
  .fail( function( jqXHR, textStatus, error) {
    #handle errors
  });

jQuery 是否提供了缓存这些请求的方法?或者我应该在 WordPress 中以某种方式处理这个问题(也许将响应写入服务器上的 JSON 文件)?

最佳答案

根据 API 和调用的上下文,您可以使用服务器来完成这些 API 调用,而不需要客户端来完成。执行前者意味着您可以通过数据库利用缓存,但这意味着服务器上的压力会更大,因为它现在正在完成所有请求。

只有当它不是特定于用户的信息时,这才可能真正有值(value)。也就是说,我非常支持对涉及外部 Web 服务的任何内容进行服务器端缓存。

您可能想要利用 WordPress 的一些内置功能,具体包括:

<强> WP_Http 这是 WordPress 漂亮的内置 HTTP 库,您可以用它来与 API 对话。

<强> Transients API 再说一遍 - super 漂亮。允许您在本地数据库中存储和检索自过期数据。

快速实现(未经测试,如果有问题请告诉我)如下:

define( 'HOURS', 60 * 60 );

function get_api_info( ) {

    global $apiInfo; // Check if it's in the runtime cache (saves database calls)
    if( empty($apiInfo) ) $apiInfo = get_transient('api_info'); // Check database (saves expensive HTTP requests)
    if( !empty($apiInfo) ) return $apiInfo;

    $response = wp_remote_get('http://my.api.com');
    $data = wp_remote_retrieve_body($response);

    if( empty($data) ) return false;

    $apiInfo = json_decode($data); // Load data into runtime cache
    set_transient( 'api_info', $apiInfo, 12 * HOURS ); // Store in database for up to 12 hours

    return $apiInfo;
}

然后,您只需在代码中的任意位置调用 get_api_info() 即可检索所需的数据。如果您在同一请求/脚本中多次调用该函数,它仍然只会向数据库发出一次。如果您在 12 小时内多次请求调用该函数,它只会发送一次 API 请求。

谈论效率!

当然,我还建议为此使用一个类实现,这样您就可以使用实例变量而不是全局变量来存储数据,但这只是变得挑剔。

希望有帮助!

关于jquery - 如何缓存外部json请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21806992/

相关文章:

javascript - 为什么我不能从两个函数内部调用该函数?

javascript - 使用 ajax/jquery 验证并提交包含数据和文件的表单

javascript - 将点击事件绑定(bind)到空选择器是否危险?

jQuery 调用 WebService 返回 "No Transport"错误

java - 如何将json添加到arraylist?

javascript - 如何检查样式是否已附加

javascript - 带文件上传的 FormData Ajax 请求

JavaScript 定时器用法

python - 有没有办法检查嵌套的字典值,如果它们有 0 或 null 或空字符串,则在 python 中删除它们

javascript - 将嵌套的 Json 转换为带有 parentId 的平面 Json 到每个节点