2

不知道发生了什么。当我执行以下代码时......它运行良好......但它正在产生错误。如果我将以下内容粘贴到浏览器地址栏中并点击它,我会得到一个 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 上,它会返回一个 tinyurl,导致 www.google.com/& 给我一个错误。我传递给 http:get 方法的所有站点都以 & 结尾。这是我的代码,这样您就可以看到我不是自己不小心添加的。

myLocation = 事件:参数(“位置”);

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 方法中的一个错误。如果我错了(我希望我错了),请指出我正确的方向。

4

1 回答 1

3

在这两种情况下,您的格式都略有偏差。http:get 可以用作 pre 块中的表达式,但语法与您在 action 块中使用它的方式不同。

实际上,您可以通过多种不同的方式提出此请求。传统方式是通过数据源

数据源

  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 作为 pre 块中的表达式。作为函数调用,http:get 有 2 个必需参数和两个可选参数:

http:get( url , params , headers, response_headers );

您的第一次尝试不包括参数。
tinyresponse = http:get(url2tiny)

第二次尝试将参数置于错误的参数位置。
http:get("tinyurl.com/api-create.php";,{"url":myurl})

http:get(预块)

  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(动作)

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

这是针对此页面执行的这些规则的示例 在此处输入图像描述

于 2011-02-23T17:57:40.530 回答