我正在尝试为JW平台API创建签名。它需要一个名为"api_signature"的URL参数,该参数是所有其他URL参数的SHA1摘要。
我尝试使用SHA1
摘要动态创建参数,JS Script
作为其输入。下面是JS脚本的基本代码:
function evaluate(context)
{
var request = context.getCurrentRequest()
var params = request.getUrlParameters()
var sbs = ''
for (key of params) {
if (key === 'api_signature')
continue;
if (sbs.length > 0)
sbs += '&'
sbs += encodeURIComponent(key) + '=' + encodeURIComponent(params[key])
}
return sbs + '<API SECRET GOES HERE>'
}
但是我得到了警告:
JS脚本不能用于URL参数值,因为这会创建一个自依赖。
我怎样才能绕过这个?
出现此警告的原因是因为request.getURLParameters()
必须评估请求的所有url参数,包括api_signature
,因此必须调用JS脚本的方法evaluate,从而创建一个无限递归问题,该问题在第一次迭代时被检测和阻止(危险url参数的内容被''
取代)。
理论上,可以通过使用request.getURLParameters(true)
来避免这个问题,它为每个url参数返回一个未求值的DynamicString。然而,在实践中,这种检测似乎有点太强了,它仍然会发出警告。
另一个解决方案是同时使用request.getURLParametersNames()
和request.getURLParameterByName(name)
。然而,该检测再次太强,并引发警告。
这两种解决方案理论上都可以工作而不会产生警告,我们正在Paw 3.0.13中修复这个问题。在任何情况下,虽然引发警告,但脚本仍然正常运行。
request.getURLParameters(true)的示例
function evaluate(context)
{
var request = context.getCurrentRequest()
var params = request.getUrlParameters(true)
var sbs = []
for (var key in params) {
if (key === 'api_signature')
continue;
sbs.push(encodeURIComponent(key) + '=' +
encodeURIComponent(params[key].getEvaluatedString()))
}
return sbs.join('&') + '<API SECRET GOES HERE>'
}
request.getURLParametersName()的示例
function evaluate(context)
{
var request = context.getCurrentRequest()
var params = request.getUrlParametersNames()
var sbs = []
for (var param of params) {
if (param === 'api_signature')
continue;
sbs.push(encodeURIComponent(param) + '=' +
encodeURIComponent(request.getUrlParameterByName(param)))
}
return sbs.join('&') + '<API SECRET GOES HERE>'
}