web-dev-qa-db-fra.com

Quel est le moyen le plus simple de faire une requête HTTP GET en Perl?

J'ai écrit du code dans PHP pour utiliser notre service Web simple, que j'aimerais également fournir en Perl aux utilisateurs qui préfèrent cette langue. Quelle est la méthode la plus simple pour créer une requête HTTP? Dans PHP, je peux le faire en une seule ligne avec file_get_contents().

Voici le code complet que je veux porter sur Perl:

/**
 * Makes a remote call to the our API, and returns the response
 * @param cmd {string} - command string ID
 * @param argsArray {array} - associative array of argument names and argument values
 * @return {array} - array of responses
 */
function callAPI( $cmd, $argsArray=array() )
{
   $apikey="MY_API_KEY";
   $secret="MY_SECRET";
   $apiurl="https://foobar.com/api";

   // timestamp this API was submitted (for security reasons)
   $Epoch_time=time();

   //--- assemble argument array into string
   $query = "cmd=" .$cmd;
   foreach ($argsArray as $argName => $argValue) {
       $query .= "&" . $argName . "=" . urlencode($argValue);
   }
   $query .= "&key=". $apikey . "&time=" . $Epoch_time;

   //--- make md5 hash of the query + secret string
   $md5 = md5($query . $secret);
   $url = $apiurl . "?" . $query . "&md5=" . $md5;

   //--- make simple HTTP GET request, put the server response into $response
   $response = file_get_contents($url);

   //--- convert "|" (pipe) delimited string to array
   $responseArray = explode("|", $response);
   return $responseArray;
}
32
davr

LWP :: Simple:

use LWP::Simple;
$contents = get("http://YOUR_URL_HERE");
61
Kevin Crumley

LWP :: Simple a la fonction que vous recherchez.

use LWP::Simple;
$content = get($url);
die "Can't GET $url" if (! defined $content);
15
Barry Brown

Jetez un oeil à LWP :: Simple . Pour les requêtes plus complexes, il y a même un livre à ce sujet .

6
bmdhacks

Je voudrais utiliser le LWP :: Simple module.

4
AndrewJFord

Mojo :: UserAgent est également une excellente option!

  use Mojo::UserAgent;
  my $ua = Mojo::UserAgent->new;

  # Say hello to the Unicode snowman with "Do Not Track" header
  say $ua->get('www.☃.net?hello=there' => {DNT => 1})->res->body;

  # Form POST with exception handling
  my $tx = $ua->post('https://metacpan.org/search' => form => {q => 'mojo'});
  if (my $res = $tx->success) { say $res->body }
  else {
    my ($err, $code) = $tx->error;
    say $code ? "$code response: $err" : "Connection error: $err";
  }

  # Quick JSON API request with Basic authentication
  say $ua->get('https://sri:[email protected]/search.json?q=Perl')
    ->res->json('/results/0/title');

  # Extract data from HTML and XML resources
  say $ua->get('www.Perl.org')->res->dom->html->head->title->text;`

Des échantillons directement à partir de la page CPAN. J'ai utilisé cela quand je ne pouvais pas obtenir LWP :: Simple pour travailler sur ma machine.

2
Dave Horner

Essayez le module HTTP :: Request . Les instances de cette classe sont généralement transmises à la méthode request () d'un objet LWP :: UserAgent.

1
coppro

Je pense que Srihari pourrait faire référence à Wget , mais ce que je recommanderais réellement (encore une fois, sur * nix sans LSP :: Simple) serait d’utiliser cURL

$ my $content = `curl -s "http://google.com"`;
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>

Le drapeau -s indique à Curl de se taire. Sinon, vous obtenez la sortie de la barre de progression de curl sur stderr à chaque fois. 

0
tboz203

Si c'est sous UNIX et si aucun LWP :: Simple n'est installé, vous pouvez essayer 

my $content = `GET "http://trackMyPhones.com/"`;
0
Srihari Karanth