View and Data API tips: 缓存Access Token

php中文网
发布: 2016-06-07 15:38:28
原创
1507人浏览过

对于云API服务,常见的方式就是按照API调用次数收费,某些API调用也就有某些限制,比如在特定时间内只允许调用指定的次数以免造成滥用。虽然Autodesk的view and Data API目前还没有应用这样的限制,但我们最好也能实现这样的机制,比如对于或者Access Token

对于云api服务,常见的方式就是按照api调用次数收费,某些api调用也就有某些限制,比如在特定时间内只允许调用指定的次数以免造成滥用。虽然autodesk的view and data api目前还没有应用这样的限制,但我们最好也能实现这样的机制,比如对于或者access token这样的操作,一个access token是有一定的有效期的,在这个token的有效期内,我们就没必要重复发出api调用获取新的acces token,只有返回仍然有效的token就可以了。下面是c#实现的简单的逻辑,用一个全局静态变量来缓存access token:

<span>public</span>&#160;<span>class</span>&#160;<span>Util</span><br />{<br />&#160;&#160;&#160; <span>private</span>&#160;<span>static</span>&#160;<span>readonly</span>&#160;<span>ILog</span> logger = <span>LogManager</span>.GetLogger(<span>typeof</span>(<span>Util</span>));<br /> <br />&#160;&#160;&#160; <span>string</span> baseUrl = <span>""</span>;<br />&#160;&#160;&#160; <span>RestClient</span> m_client;<br /><br /> <br />&#160;&#160;&#160; <span>public</span>&#160;<span>static</span>&#160;<span>AccessToken</span> token;<br />&#160;&#160;&#160; <span>public</span>&#160;<span>static</span>&#160;<span>DateTime</span> issueDateTime;<br />&#160;&#160;&#160; <span>//refresh token if the token is about to expire in 5 seconds</span><br />&#160;&#160;&#160; <span>public</span>&#160;<span>static</span>&#160;<span>int</span> ABOUT_EXPIRED_SECONDS = 5;<br /> <br /><br />&#160;&#160;&#160; <span>public</span> Util(<span>string</span> baseUrl)<br />&#160;&#160;&#160; {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span>this</span>.baseUrl = baseUrl;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; m_client = <span>new</span>&#160;<span>RestClient</span>(baseUrl);<br />&#160;&#160;&#160; }<br /> <br />&#160;&#160;&#160; <span>public</span>&#160;<span>AccessToken</span> GetAccessToken(<span>string</span> clientId, <span>string</span> clientSecret)<br />&#160;&#160;&#160; {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span>//no token or token is going to be expired </span><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span>// (less than ABOUT_EXPIRED_SECONDS)</span><br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span>if</span> (token == <span>null</span><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; || (<span>DateTime</span>.Now - issueDateTime).TotalSeconds<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; > (token.expires_in - ABOUT_EXPIRED_SECONDS))<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span>RestRequest</span> req = <span>new</span>&#160;<span>RestRequest</span>();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; req.Resource = <span>"authentication/v1/authenticate"</span>;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; req.Method = <span>Method</span>.POST;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; req.AddHeader(<span>"Content-Type"</span>, <span>"application/x-www-form-urlencoded"</span>);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; req.AddParameter(<span>"client_id"</span>, clientId);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; req.AddParameter(<span>"client_secret"</span>, clientSecret);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; req.AddParameter(<span>"grant_type"</span>, <span>"client_credentials"</span>);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span>//avoid CORS issue, do not use this if you just need to get access token from same domain<br /></span><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; req.AddHeader(<span>"Access-Control-Allow-Origin"</span>, <span>"*"</span>);<br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span>IRestResponse</span><<span>AccessToken</span>> resp = m_client.Execute<<span>AccessToken</span>>(req);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; logger.Debug(resp.Content);<br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span>if</span> (resp.StatusCode == System.Net.<span>HttpStatusCode</span>.OK)<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span>AccessToken</span> ar = resp.Data;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span>if</span> (ar != <span>null</span>)<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; token = ar;<br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span>//update the token issue time</span><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; issueDateTime = <span>DateTime</span>.Now;<br /> <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span>else</span><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {<br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; logger.Fatal(<span>"Authentication failed! clientId:"</span> + clientId);<br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span>else</span><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ;<span>//Do nothing, use the saved access token in static var </span><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span>return</span> token;<br />&#160;&#160;&#160; }<br /> <br /> <br />&#160;&#160;&#160; }
登录后复制

 

当然,根据需要你可以选择其他的方式,比如把token保存在数据库中,或者memcache中。

Pandora Avatars
Pandora Avatars

可以制作100多种独特风格的头像

Pandora Avatars 102
查看详情 Pandora Avatars
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号