2008-09-25 18 views
30

Tengo un código que he escrito en PHP para consumir nuestro sencillo servicio web, que también me gustaría ofrecer en Perl para los usuarios que prefieran ese idioma. ¿Cuál es el método más simple de hacer una solicitud HTTP para hacer eso? En PHP puedo hacerlo en una línea con file_get_contents().¿Cuál es la forma más sencilla de realizar una solicitud HTTP GET en Perl?

Aquí es todo el código Quiero puerto de 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; 
} 

Respuesta

57

LWP :: Simple:

use LWP::Simple; 
$contents = get("http://YOUR_URL_HERE"); 
+1

así que ... tenemos cuatro respuestas que mencionan LWP :: Simple, supongo que es la que se usa – davr

+1

Para cadenas estáticas como 'http: // URL', es mejor usar comillas simples para guardar perl el trabajo de buscar cosas para interpolar. – AndrewJFord

+8

Para cadenas estáticas, no hay _real_ overhead con comillas dobles. La razón para usar comillas simples es dejar en claro al siguiente programador que no necesita buscar interpolaciones en el código. –

1

Prueba el módulo de HTTP::Request. Las instancias de esta clase generalmente se pasan al método request() de un objeto LWP :: UserAgent.

13

LWP :: Simple tiene la función que está buscando.

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

Mojo::UserAgent es una gran opción también!

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

Muestras directamente desde la página CPAN. Usé esto cuando no pude hacer que LWP :: Simple funcionara en mi máquina.

0

Si su en UNIX y si no hay instalado LWP :: Simple, puede intentar

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

¿Qué es "GET"? No está instalado y no funciona en mi Ubuntu 14.04 Linux. –

+0

'GET' es una utilidad instalada con la biblioteca' Perl '' LWP'. – reinierpost

0

Creo que lo que se podría hacer referencia Srihari es Wget, pero lo que realmente recomiendo (de nuevo, en * nix sin LSP :: simple) sería utilizar 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> 

La bandera -s dice rizo estar en silencio. De lo contrario, obtienes la salida de barra de progreso de curl en stderr todo el tiempo.

Cuestiones relacionadas