创建一个包含所有其他URL参数的动态URL参数



我正在尝试为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>'
}

相关内容

  • 没有找到相关文章

最新更新