我们在网站制作中经常会遇到需要请求远程数据的情况, 在我们的网站中嵌入第三方数据通常有以下几种方式:
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条评论
如果你在使用中抛错了,请参考下面的写法: <#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>
非常感谢 freemarker对json中空值null处理确实有个问题 定义null='' 能解决
发表评论