2011-06-14 3 views
2

J'envoie une requête HTTP POST à ​​une URL. Il renvoie une information dont j'ai besoin dans l'en-tête location de la réponse. Comment puis-je obtenir cet en-tête? J'ai essayé le code suivant et il ne semble pas fonctionner:KRL: Obtention de l'en-tête "location" d'un http: post()

Dans le bloc d'action de la règle qui utilise l'action http:post():

http:post("https://cas.byu.edu/cas/v1/tickets/") 
    with params = {"username": netid, "password": password} 
    and autoraise = "gottgt" 
    and response_headers = ["location"]; 

La règle qui gère l'événement http:

rule got_tgt { 
    select when http post label "gottgt" 
    pre { 
     content = event:param("content"); 
     location = event:param("location"); 
    } 
    { 
     notify("CAS Login", "Got back the POST response (#{location}): #{content}") with sticky=true; 
    } 
} 

Cependant, la variable location est toujours vide. Comment puis-je dire à KRL que je veux l'en-tête location, et comment l'obtenir à partir de la réponse?

Répondre

2

Bien que je ne puisse pas tester votre point de terminaison spécifique, j'ai créé un exemple d'application que vous trouverez utile pour le débogage de ce problème.

Notez que j'autorise tous deux la réponse et que j'utilise la syntaxe setting pour déclencher les événements. Normalement, vous ne feriez pas les deux, mais cela fait toute la différence. En augmentant explicitement le résultat, vous obtenez la réponse entière. Vous pouvez voir dans mon exemple que l'en-tête server est renvoyé et indiqué également dans la règle autoraised.

Votre code semble correct, mais je ferais une relance explicite et inspecterai la réponse comme je le montre ici, et cela vous aidera à savoir exactement ce qui est à votre disposition.

exécuter cette application ici: http://ktest.heroku.com/a8x183

et code ici:

ruleset a8x183 { 
    meta { 
     name "Testing Response Headers" 
     description << 

     >> 
     author "Sam Curren" 
     logging off 
    } 

    dispatch { 
     // domain "example.com" 
    } 

    global { 
     bodylog = defaction(title, msg){ 
      { 
      append("body", "<h1>#{title}</h1>"); 
      append("body", "<div>#{msg}</div>"); 
      } 
     }; 
    } 

    rule first_rule { 
     select when pageview ".*" setting() 
     pre { 

     } 
     http:post("http://httpbin.org/post") setting (res) 
      with params = {"username":"yahuda","password":"metalcages"} 
      and autoraise = "kickstand" 
      and response_headers = ["server"]; 
     fired { 
      raise explicit event "moon" with res = res; 
     } 
    } 

    rule exp { 
     select when explicit moon 
     pre { 
      res = event:param("res"); 
      res_s = res.encode(); 
     } 
     bodylog("explicit raise: full response", res_s); 
    } 

    rule response { 
     select when http post label "kickstand" 
     pre { 
      server_header = event:param("server"); 
      content = event:param("content"); 
     } 
     { 
      bodylog("autoraise: content", content); 
      bodylog("autoraise: server_header", server_header); 
} 
    } 
} 
+0

Merci! Élever l'événement explicite a montré que l'information est là. Si je ne peux pas comprendre comment le faire de la manière habituelle, je vais le faire. –

+0

+1 pour l'utilisation de httpbin.org –

+0

Mais pas de points supplémentaires pour ma référence Yahuda Moon? Sérieusement. – TelegramSam