我们在网站制作中经常会遇到需要请求远程数据的情况, 在我们的网站中嵌入第三方数据通常有以下几种方式:

    1. 前端页面直接ajax请求接口,并将数据解析渲染到页面中,此种方式仅适用于查询公共接口,且对方提供了跨域调用的方式

    2. 请求页面时,后台实时请求数据,并将接口返回数据当作页面数据之一传递到前端页面,此种方式适用于大部分情况或者接口请求需要敏感信息认证时,只是接口的响应速度也会影响页面渲染速度

    3. 任务计划定时请求接口,将数据缓存下来,请求页面时直接使用缓存数据,此种方式适用于数据要求实时性不高的情况

publiccms中怎么实现这些方式呢?

    由于publiccms对前端技术并没有任何限制,第一种依旧在前端编写js就可以实现

    第二种实现也比较简单,需要用到工具函数getHtml,具体用法:

${getHtml('远程接口地址')?no_esc}

 这样可以原样输出接口返回报文;

<#assign data=getHtml('远程接口地址')?eval_json/>${data.属性}

这样可以直接解析并使用json数据;

<#assign data=getXml(getHtml('远程接口地址'))/>${data.root.node}

可以直接解析并使用xml数据

    第三种情况是利用publiccms的任务计划,在任务计划脚本中直接使用 

<#assign result=getHtml('远程接口地址')/>
<#if result?has_content && result?eval_json.code='success'>
    <@sys.record code='data1' data=result></@sys.record>
</#if>

    把接口返回报文输出到数据记录中,然后将该脚本添加到任务计划定时指向,然后使用数据集指令查询并使用数据

<@sys.record code='data1'>
<#assign data=object.data?eval_json/>
</@sys.record>
${data.root.node}

上述代码中已经做了任务计划没有执行,或日志被清空后的容错。这样能保证页面展示数据不会因为接口速度慢而出现延迟。


值得一提的是,在集群环境中,publiccms的任务计划有自动选举主节点的功能,同一个任务计划同一周期内不会反复在多个节点重复执行。

3条评论
  • 沐清涵
    沐清涵
    2021-06-03 18:58
    reply 回复 (1)

    如果你在使用中抛错了,请参考下面的写法: <#assign null='' result=getHtml('http://你的网址')?eval/> 2 ​ 3 <!DOCTYPE html> 4 <html> 5 <脚本 src="./${site.sitePath}js/jquery.min.js"></脚本> 6 <head> 7 <title>中原金太阳</title> 8 </head> 9 <body> 10 <main>中原金太阳</main> 11 ${result.属性} 12 </body> 13 </html>

    • 湖水没了
      湖水没了[管理员] 回复沐清涵
      2021-07-07 10:30
      reply 回复

      非常感谢 freemarker对json中空值null处理确实有个问题 定义null='' 能解决

发表评论