2

何が起こっているのかわからない。次のコードを実行すると...正常に実行されます...しかし、エラーが発生しています。以下をブラウザのアドレス バーに貼り付けてクリックすると、1 つの 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 を介して実行される 2 番目のものは、要求されたサイトにヒットしますが、要求の末尾に「/&」が追加されることです。私がどのサイトにいるかに関係なく、これを行います。www.google.com を使用している場合、www.google.com/& という小さな URL が返され、エラーが発生します。http:get メソッドに渡すすべてのサイトは、末尾に & が付いて返されます。これが私のコードです。誤って自分で追加していないことがわかります。

myLocation = event:param("場所");

url2tiny = "http://tinyurl.com/api-create.php?url="+myLocation;

tinyresponse = http:get(url2tiny);

tinyurl = tinyurl.pick("$.content");

url2tiny を console.log に記録すると、まったく同じように見えます。http:get に url2tiny を渡すと、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;
    }
  }

もう1つの方法は、試行方法であり、preブロックの式としてhttp:getを使用します。関数として呼び出されるhttp:getには、2つの必須パラメーターと2つのオプションパラメーターがあります。

http:get(urlparams、headers、response_headers);

最初の試みにはパラメータが含まれていませんでした。
tinyresponse = http:get(url2tiny)

2回目の試行では、パラメータが間違った引数の位置に配置されます。
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;
    }

  }

3番目の方法は、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 に答える