2010-05-26 80 views
1

我正在嘗試使用LWP :: Simple向REST服務發出GET請求。下面是簡單的代碼:爲什麼我的REST請求返回垃圾數據?

use LWP::Simple; 
$uri = "http://api.stackoverflow.com/0.8/questions/tagged/php"; 
$jsonresponse= get $uri; 
print $jsonresponse; 

在我的本地機器上,運行Ubuntu 10.4,和Perl 5.10.1版本:

作爲禮物送給@作爲禮物送給-LNX:〜$ perl的--version
這是Perl中,v5.10.1(*)爲x86_64的Linux的GNU的線程多

我能得到正確的響應,並將它顯示在屏幕上構建的。例如:

作爲禮物送給@作爲禮物送給-LNX:〜$頭-10 output.txt的
{
「總」:1000,
「頁面」:1,
「頁面大小」:30,
「問題」:
{
「標籤」:
「PHP」,
「陣列」,
「編碼式」
(... ...剪斷)

但我的主機的機器,我SSH到上,我得到垃圾印在屏幕上完全相同的代碼。我假設它與編碼有關,但REST服務不會在響應中返回字符集類型,那麼如何強制LWP :: Simple使用正確的編碼?任何想法可能發生在這裏?

這裏的Perl的版本,我的主機的機器上:

[的Dredd] $ perl的--version
這是perl的,v5.8.8對於x86_64的Linux的GNU的線程多

回答

4

我碰巧有一個64位RHEL 5.4盒子,它上面有Perl 5.8.8。我把你的代碼拿到了完全相同的結果。我嘗試使用Data::Dumper轉儲數據,但這並沒有改變任何東西。然後我去了命令行,這樣做:

wget -O jsonfile http://api.stackoverflow.com/0.8/questions/tagged/php 
--2010-05-26 11:42:41-- http://api.stackoverflow.com/0.8/questions/tagged/php 
Resolving api.stackoverflow.com... 69.59.196.211 
Connecting to api.stackoverflow.com|69.59.196.211|:80... connected. 
HTTP request sent, awaiting response... 200 OK 
Length: 5430 (5.3K) [application/json] 
Saving to: `jsonfile' 
2010-05-26 11:42:42 (56.9 KB/s) - `jsonfile' saved [5430/5430] 

當我這樣做:

file jsonfile 

我:

jsonfile: gzip compressed data, from FAT filesystem (MS-DOS, OS/2, NT), max speed 

因此,JSON數據是由網絡gzip壓縮服務器。我試過這個:

gzip -dc jsonfile 

和lo,看看結果是你所期望的JSON數據。

你現在能做的就是要麼使用另一個模塊ungzip數據,或you can check out this other thread which shows how to accept gzip using LWP::UserAgent and handle the request that way

+0

太棒了 - 非常感謝!這很有道理。 – Alienfluid 2010-05-26 16:42:25

3

這是bug 44435。將libwww-perl升級到版本5.827或更高版本。

+0

酷 - 謝謝你的指針 - 但是看完上面託尼的反應,好像它是一個稍微不同的問題。無論如何,主機系統上的Perl版本超出了我的範圍:(。 – Alienfluid 2010-05-26 16:43:57

+0

libwwwperl是一個Perl模塊,並且有一些方法可以確保您可以使用CPAN:http://www.perlmonks.org/?node_id= 693828但使用LWP :: Request可能是最簡單的 – 2010-05-26 18:52:39

+0

Alienfluid,你錯了,這不是一個不同的問題。在5.827之前沒有在LWP :: Simple中使用的decode_content方法處理Content-Encoding(這裏:gzip)和字符編碼,我鼓勵你像託尼說的那樣安裝你最新的庫的本地副本 – daxim 2010-05-27 09:30:15