2 Stimmen

Http:holen hinzufüllen "&" vor dem Holen

Nicht sicher, was los ist. Wenn ich den folgenden Code ausführe... läuft es gut... aber es tritt ein Fehler auf. Wenn ich den folgenden Code in die Adressleiste meines Browsers einfüge und ausführe, erhalte ich eine URL. Wenn ich dieselbe URL durch das KRL http:get schicke, erhalte ich eine völlig andere URL.

"http://tinyurl.com/api-create.php?url=http://insideaf.blogspot.com"

wenn ich es selbst im Browser eingeben, bekomme ich: http://tinyurl.com/6j7qucx

wenn ich es durch http:get laufen lasse, bekomme ich: http://tinyurl.com/4fdtnoo

Der Unterschied besteht darin, dass beim zweiten, der durch das KRL http:get ausgeführt wird, die angeforderte Seite aufgerufen wird, aber ein "/&" am Ende der Anfrage hinzugefügt wird. Dies geschieht unabhängig von der Website, auf der ich mich befinde. Wenn ich auf www.google.com bin, gibt es eine tinyurl zurück, die zu www.google.com/& führt, was zu einem Fehler führt. Alle Websites, die ich der http:get-Methode übergebe, werden mit einem & am Ende zurückgegeben. Hier ist mein Code, damit Sie sehen können, dass ich es nicht versehentlich selbst hinzufüge.

myLocation = event:param("location");

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

tinyresponse = http:get(url2tiny);

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

Wenn ich die url2tiny-Konsole.logge, sieht es genau so aus, wie es sollte. Es scheint, dass wenn ich url2tiny an http:get übergebe, automatisch das & am Ende hinzugefügt wird, bevor es von der tinyurl-api angefordert wird.

Irgendwelche Ideen für Workarounds für dieses Problem? Es scheint ein Bug in der http:get-Methode zu sein. Wenn ich mich irre (und ich hoffe, dass ich es bin), bitte weisen Sie mir den richtigen Weg.

3voto

MEH Punkte 598

In beiden Fällen ist Ihr Format nur geringfügig falsch. http:get kann als Ausdruck im pre-Block verwendet werden, aber die Syntax unterscheidet sich von der Art und Weise, wie Sie es im Aktionsblock verwenden.

Es gibt tatsächlich eine Reihe verschiedener Möglichkeiten, wie Sie diese Anfrage stellen könnten. Der traditionelle Weg ist über einen Datensatz

DATENQUELLE

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

Der andere Weg ist der, den Sie versucht haben, und zwar über http:get als Ausdruck im pre-Block. Als Funktion aufgerufen, hat http:get 2 erforderliche und zwei optionale Parameter:

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

Ihr erster Versuch enthielt die params nicht.
tinyresponse = http:get(url2tiny)

Der zweite Versuch platziert die params an der falschen Argumentposition.
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 als Ausdruck",turl) with sticky = true;
    }

  }

Die dritte Methode besteht darin, http:get als Aktion zu verwenden und ein Ereignis automatisch auszulösen

http:get (Aktion)

  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("Vom Aktion autorisiert",a) with sticky = true;
  }

Hier ist ein Beispiel dieser Regeln, die gegen diese Seite hier ausgeführt werden Bildbeschreibung eingeben

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X