不确定发生了什么。当我执行以下代码时...它运行良好...但它产生了一个错误。如果我将以下内容粘贴到我的浏览器地址栏并点击它,我会得到一个URL。如果我通过KRL http:get输入相同的URL,我会得到一个完全不同的URL。
“http://tinyurl.com/api-create.php?url=http://insideaf.blogspot.com”
我自己在浏览器中得到:http://tinyurl.com/6j7qucx
通过http:get得到:http://tinyurl.com/4fdtnoo
区别在于第二个,一个贯穿KRL http:get命中所请求的网站,但它附加了一个“/&”到请求结束。无论我在哪个站点,它都会这样做。如果我在www.google.com上,它会返回一个微小的内容,从而产生www.google.com/&带给我一个错误。我传递给http:get方法的所有网站都返回了&在末尾。这是我的代码,所以你可以看到我自己不小心添加它。
myLocation = event:param(“location”);
url2tiny =“http://tinyurl.com/api-create.php?url=”+ myLocation;
tinyresponse = http:get(url2tiny);
tinyurl = tinyurl.pick(“$ .content”);
如果我在console.log中输入url2tiny,它看起来应该是这样的。看来,当我将url2tiny传递给http:get时,它会自动添加&在它从tinyurl api请求它之前到它的末尾。
有关此问题的解决方法的任何想法?它似乎是http:get方法中的一个错误。如果我错了(我希望我是),请指出我正确的方向。
答案 0 :(得分:3)
在这两种情况下,您的格式都略有偏差。 http:get可以用作pre块中的表达式,但语法与在action块中使用它的方式不同。
实际上,您可以通过多种不同的方式提出此请求。传统方式是通过数据源
<强> DATASOURCE 强>
global {
datasource tiny_url_request <- "http://tinyurl.com/api-create.php";
}
rule using_datasource is active {
select when pageview ".*" setting ()
pre {
myLocation = page:env("caller");
thisTiny = datasource:tiny_url_request("?url="+myLocation);
}
{
notify("URL", myLocation) with sticky = true;
notify("datasource: ", thisTiny) with sticky = true;
}
}
另一种方式是你如何尝试,它是通过http:get作为前块中的表达式。作为函数调用,http:get有2个必需参数和两个可选参数:
http:get( url ,参数,标题,response_headers);
你的第一次尝试不包括参数 tinyresponse = http:get(url2tiny)
第二次尝试将参数置于错误的参数位置 HTTP:GET( “tinyurl.com/api-create.php”;,{ “URL”:myurl})
http:get(pre block)
rule get_in_pre is active {
select when pageview ".*" setting ()
pre {
myLocation = page:env("caller");
tinyurl = http:get("http://tinyurl.com/api-create.php", {"url":myLocation});
turl = tinyurl.pick("$.content");
}
{
notify("http:get as expression",turl) with sticky = true;
}
}
第三种方法是使用http:get作为动作并自动引发事件
http:get(action)
rule using_action is active {
select when pageview ".*" setting ()
pre {
myLocation = page:env("caller");
}
http:get("http://tinyurl.com/api-create.php") setting (resp)
with
params = {"url" : myLocation} and
autoraise = "turl_event";
}
rule get_event is active {
select when http get label "turl_event" status_code "(\d+)" setting (code)
pre {
a = event:param("content");
}
notify("Autoraised from action",a) with sticky = true;
}
以下是针对此页面执行这些规则的示例