2016-06-13 65 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. 

我試圖從$url這是JSON格式的變量,然後使用JSON的decode_json方法將其轉換成散列結構以獲得國家代碼捕獲效應初探。但我無法在變量中獲得響應。WWW ::捲曲::易輸出無法捕捉

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)的文檔說這並不容易。它的目的不是爲了成爲一個獨立的模塊,正因爲如此,應該參考http://curl.haxx.se_中有關API的詳細信息來查閱主要的libcurl文檔。你讀過嗎?我相信你會通過使用[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 「,」name「:」美國「,」geoNameId「:6252001},」continent「:{」name「:」北美「,」code「:」NA「,」geoNameId「:6255149} :{}, 「特徵」:{ 「ip地址」: 「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字符串如上所示。 –

+0

@Kartik哦。我不清楚這一點。您應該編輯您的問題並添加該信息。在這個評論中,它很難閱讀。有幾種方法可以捕獲STDOUT,但這並不是真的解決問題,而是解決方法。你把'\'放在'WRITEDATA'的變量前面了嗎? – simbabque

0

經過多次與本期的WWW :: Curl :: Easy拒絕打印到變量,並不斷寫入STDOUT,我終於找到了問題!

要從WWW-捲曲4.17和WWW 得不到你的WWW ::捲曲::易::捲曲::易在WWW-捲曲3.02找到。

所以,簡單地通過整個WWW捲曲4.17包覆蓋以前的WWW ::捲曲::安裝方便:

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

然後,它會服從CURLOPT_WRITEDATA。實際上,其他Curl甚至不知道CURLOPT_WRITEDATA,因爲您將通過使用嚴格添加來實現;