2008-09-25 17 views
30

Mam pewien kod, który napisałem w PHP do korzystania z naszej prostej usługi sieciowej, którą chciałbym podać w Perlu dla użytkowników, którzy mogą preferować ten język. Jaka jest najprostsza metoda wykonania żądania HTTP, aby to zrobić? W PHP mogę to zrobić w jednym wierszu z file_get_contents().Jaki jest najprostszy sposób utworzenia żądania HTTP GET w Perlu?

Oto cały kod Chcę portu do 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; 
} 

Odpowiedz

57

LWP :: Simple:

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

więc ... mamy cztery odpowiedzi wspominające LWP :: Prosto, myślę, że to ten, który używa – davr

+1

W przypadku ciągów statycznych, takich jak "http: // URL", najlepiej używać pojedynczych cudzysłowów do zapisywania perla w pracy szukania rzeczy do interpolacji. – AndrewJFord

+8

W przypadku ciągów statycznych nie ma żadnego _real_ kosztów ogólnych z podwójnymi cudzysłowami. Powodem używania pojedynczych cudzysłowów jest wyjaśnienie następnemu programistowi, że nie muszą szukać interpolacji w kodzie. –

1

Wypróbuj moduł HTTP::Request. Instancje tej klasy są zwykle przekazywane do metody request() obiektu LWP :: UserAgent.

13

LWP :: Simple ma funkcję, której szukasz.

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

Mojo::UserAgent to również świetna opcja!

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

Próbki bezpośrednio ze strony CPAN. Użyłem tego, kiedy nie mogłem uzyskać LWP :: Simple do pracy na mojej maszynie.

0

Jeśli ITS w systemie UNIX i jeśli nie ma LWP :: Simple zainstalowany, można spróbować

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

Co to jest "GET"? Nie jest zainstalowany i nie działa na moim systemie Ubuntu 14.04 Linux. –

+0

'GET' to narzędzie instalowane z biblioteką Perl' LWP'. – reinierpost

0

myślę co Srihari może być przedstawieniu jest Wget, ale czego tak naprawdę polecam (znowu, na * nix bez LSP :: Proste) byłoby użyć 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> 

-s flaga mówi zwijają się milczeć. W przeciwnym razie za każdym razem otrzymasz wyjście paska postępu curl na stderr.

Powiązane problemy