前情提要
某些NetSuite向外部系统推送数据的场景可能需要用到MapReduce的场景,此种情况如果涉及token是比较多变的。如果放在getInputData阶段取得token然后用参数带给map阶段使用,则可能随时遇到token过时的情况,可能还需要重新获得token;如果是每一步都重新获得token则可能消耗目标系统太多资源。中国很多集成实际上是采用了IP黑白名单制度,然而这种方式并不适合NetSuite这样的云平台。因此使用OAuth2.0这样token机制是必要的而用N/cache更使这样的情况变得便捷。
代码设计
使用N/cache构建如下的代码,可以实现向目标主机获取cookie然后使用cookie内容发送请求的目的。
var cacheObject = cache.getCache({
name: 'myCookie',//随便创建一个名称
scope: cache.Scope.PRIVATE//设置作用域为private或者public,protected,具体可以看文档
});
var cachedCookieAsStr = cacheObject.get({
key: 'cookie_string',//cache作为object的key
loader: getCookieToCache, //用于获取token的方法,我
ttl:3600
});
其中getCookieToCache的方法如下。注意Cache.get()的loader返回值如果是json则系统会帮你stringify。
function getCookieToCache(context) {
let kSessionId = ''
try {
var url = 'https://api.netsuiteful.com/validate';
var response = http.post({
url: url,
headers: {
"Connection": "keep-alive",
'Content-Type': 'application/json',
"Accept": "application/json"
},
body: JSON.stringify({
userName: 'netsuiteful',
password: 'aSTRONGp@ssw0rd'
})
});
kSessionId = JSON.parse(response.body).Context.SessionId
}
catch(ex) {
//other response status
}
var wrapper = {
'cookie_string': kSessionId
};
return wrapper
}
之后使用时,直接调取cacheObj.get()就好,如果cache因为过期、系统自动抛弃等原因不存在,系统会自动按照loader去获取。
var tokenFromCache = JSON.parse(cachedCookieAsStr)['cookie_string'];
if (!tokenFromCache) throw error.create({
name: 'CACHED_TOKEN_ERR',
message: kSessionId
});
var responseObj = https.post({
url: 'https://api.netsuiteful.com/api/v1/user'
})
延伸阅读
- N/cache还有put,get等等方法,不过都不如Cache.get()这样有loader的方法如此实用
- ttl默认是无限长,也可以考虑设置一个自动过期的时间,如果token会过期则cache存储的token也应该考虑过期
- cache还可以跨脚本使用,可以找找各个scope有什么区别
Comments