2016-06-13 3 views
1
use JSON; 
use WWW::Curl::Easy; 

my $curl = WWW::Curl::Easy->new; 
$curl->setopt(CURLOPT_NOBODY,1); 
$curl->setopt(CURLOPT_TIMEOUT,3); 
$curl->setopt(CURLOPT_VERBOSE,0); 
$curl->setopt(CURLOPT_URL,$url); 


my $response = (what to use here); 

my %hash = decode_json($response); 
$country = $hash->{body}->{country}; 
return $country; 


#the output from url is in json format. 
#but unable to capture that output in a response variable as object. 

Я пытаюсь захватить réponse из $url, который находится в формате JSON в переменной затем использовать decode_json метод JSON, чтобы преобразовать его в хэш-структуру, чтобы получить код страны. Но я не могу получить ответ в переменной.WWW :: Curl :: Легкий выход не захватить

JSON Output: 
{ 
    "headers": { 
     "ipAddress": ["198.162.1.1"], 
     "type": ["PUBLIC_IP_ADDRESS"] 
    }, 
    "body": { 
     "country": { 
      "isoCode": "CA", 
      "name": "Canada", 
      "geoNameId": 6251999 
     }, 
     "continent": { 
      "name": "North America", 
      "code": "NA", 
      "geoNameId": 6255149 
     }, 
     "city": { 
      "name": "Cranbrook", 
      "geoNameId": 5931800 
     }, 
     "traits": { 
      "ipAddress": "198.162.1.1" 
     }, 
     "location": { 
      "latitude": 49.4999, 
      "longitude": -115.7688, 
      "timeZone": "America/Edmonton" 
     }, 
     "postal": { 
      "code": "V1C" 
     }, 
     "subdivisions": [{ 
      "name": "British Columbia", 
      "geoNameId": 5909050, 
      "isoCode": "BC" 
     }] 
    }, 
    "statusCode": "OK" 
} 
200 
+0

Документация [WWW :: Curl :: Easy] (https://metacpan.org/pod/WWW::Curl) говорит, что это непросто. Это _Он не предназначен для автономного модуля, и из-за этого с главной документацией libcurl следует обращаться за подробностями API по адресу http: //curl.haxx.se_. Вы читали это? Я считаю, что вы облегчите свою жизнь, используя вместо этого [LWP :: Simple] (http://p3rl.org/LWP::Simple). – simbabque

+0

@simbabque: Да, я уже сделал то же самое с использованием LWP, но в соответствии с требованиями, которые мне нужно реализовать, используя модуль WWW :: Curl :: Easy. Вот результат json: {"headers": {"ipAddress": ["192.2.2.2"], "type": ["PUBLIC_IP_ADDRESS"]}, "body": {"country": {"isoCode": "US «имя»: «Соединенные Штаты», «geoNameId»: 6252001}, «континент»: {«name»: «Северная Америка», «код»: «NA», «geoNameId»: 6255149}, «город», : {}, "черты": { "Ipaddress": "192.2.2.2"}, "место": { "широта": 37,751, "долгота": - 97,822}, "почтовый": {}}, "StatusCode" : «ОК»} –

+0

Насколько релевантно JSON? Вы знаете, как декодировать JSON и как получить доступ к ключам внутри, это очевидно из вопроса. – simbabque

ответ

-1
This seems that WWW::Curl::Easy require file handle. 
Look at bold lines 


#!/usr/bin/perl 

use WWW::Curl::Easy; 
use Data::Dumper ; 

my $resp_body =""; 

my $curl=WWW::Curl::Easy->new; 

$curl->setopt(CURLOPT_URL,$url); 

# Define file handle and send it to string 
open (my $fh, ">", \$resp_body); 

$curl->setopt(CURLOPT_WRITEDATA,\$fh); 

my $ret_code =$curl->perform; 

if ($ret_code ==0){ 
print "Response : $resp_body"; 
}else{ 
print "Error".$curl->errbuf ; 
} 
close($fh); 
2

Это объясняется в первом примере блока кода в документации WWW::Curl. Я воспроизвел его здесь вместе с кодом из вопроса.

my $curl = WWW::Curl::Easy->new; 
$curl->setopt(CURLOPT_URL,$url); 

# A filehandle, reference to a scalar or reference to a typeglob can be used here. 
my $response_body; 
$curl->setopt(CURLOPT_WRITEDATA,\$response_body); 

# Starts the actual request 
my $retcode = $curl->perform; 

my %hash = decode_json($response_body); 
$country = $hash->{body}->{country}; 

Вы должны установить ссылку на какой-то, как вариант CURLOPT_WRITEDATA. Мы использовали скалярную ссылку, переменная $response_body будет содержать тело ответа после завершения $curl->perform. Затем вы можете декодировать JSON.

+0

@KartikParihar, который является внутренним URL-адресом. Я не могу найти DNS-запись. Что у вас в '$ response_body'? Есть что-нибудь в этом вообще? – simbabque

+1

$ response_body по-прежнему пуст. Но когда я запускаю $ curl-> выполняет его вывод на консоль как json string, как указано выше. –

+0

@ Kartik Oh. Это мне было непонятно. Вы должны отредактировать свой вопрос и добавить эту информацию. В этом комментарии было очень трудно читать. Есть способы захвата STDOUT, но на самом деле это не решение проблемы, а обходное решение. Вы положили '' 'перед переменной для' WRITEDATA'? – simbabque

0

После борьбы много раз с этим вопросом в WWW :: Curl :: Easy отказывается печатать на переменную, и постоянно писать в STDOUT, я, наконец, нашел проблему!

Вы хотите получить WWW :: Curl :: Easy из WWW-Curl-4.17 и не из WWW :: Curl :: Легко найти в WWW-Curl-3,02.

Так просто переписать предыдущую WWW :: Curl :: Легкая установка по всей WWW-Curl 4.17 пакета:

http://search.cpan.org/~szbalint/WWW-Curl-4.17/lib/WWW/Curl.pm

Тогда он будет подчиняться CURLOPT_WRITEDATA. Фактически, другой Curl даже не знает CURLOPT_WRITEDATA, как вы поймете, добавив использовать строгий;

Смежные вопросы