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

Create a dynamic URL parameter that includes every other URL parameter

我正在尝试创建 a signature for the JW Platform 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 Script cannot be used in URL Parameter Value because this creates a self-dependency.

我该如何解决这个问题?

出现这个警告的原因是request.getURLParameters()需要对请求的所有url个参数求值,包括api_signature,因此需要调用JS的evaluate方法脚本,从而产生无限递归问题,该问题在第一次迭代时被检测到并被阻止(危险的 url 参数的内容被 '' 替换)。

理论上,可以通过使用 request.getURLParameters(true) 来避免此问题,其中 returns 每个 url 参数的未计算 DynamicString。不过在实践中好像检测的有点太强了,还是会报warning

另一个解决方案是同时使用 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>'
}