http:添加“&”在得到之前

时间:2011-02-21 18:18:22

标签: krl

不确定发生了什么。当我执行以下代码时...它运行良好...但它产生了一个错误。如果我将以下内容粘贴到我的浏览器地址栏并点击它,我会得到一个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方法中的一个错误。如果我错了(我希望我是),请指出我正确的方向。

1 个答案:

答案 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;
  }

以下是针对此页面执行这些规则的示例 enter image description here