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

时间:2016-09-28 00:36:45

标签: paw-app

我正在尝试创建a signature for the JW Platform API。它需要一个名为“api_signature”的URL参数,该参数是每个其他URL参数的SHA1摘要。

我尝试使用SHA1摘要动态创建参数,并输入JS Script。这是JS Script的基本代码:

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不能在URL参数值中使用,因为这会创建一个自我依赖。

我怎样才能解决这个问题?

1 个答案:

答案 0 :(得分:4)

出现此警告的原因是request.getURLParameters()必须评估请求的所有url参数,包括api_signature,因此必须调用JS脚本的方法评估,从而创建无限在第一次迭代时检测到并阻止的递归问题(危险的url参数的内容被''替换)。

理论上,可以通过使用request.getURLParameters(true)来避免此问题,request.getURLParametersNames()为每个url参数返回未评估的DynamicString。然而,在实践中,似乎检测有点过于强烈,它仍然会引发警告。

另一种解决方案可能是同时使用request.getURLParameterByName(name)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>' } 。但是,检测结果太强,并且会发出警告。

这两种解决方案在理论上都应该工作而不会发出警告,我们正在为Paw 3.0.13中的这个问题进行修复。在任何情况下,虽然会引发警告,但脚本仍能正常运行。

request.getURLParameters(true)

的示例
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>'
}

request.getURLParametersName()

的示例
public static void main (String[] args) throws java.lang.Exception{
    boolean abort = false;
    while (!abort){
        if (false) {
            abort = true;
            continue;
        }

        String test = "stupid";
        if (test.equals("stupid")) {
            System.out.println(test);
            break;
        }
    }
}