【问题标题】:Why does my REST request return garbage data?为什么我的 REST 请求返回垃圾数据?
【发布时间】:2011-02-24 06:10:38
【问题描述】:

我正在尝试使用 LWP::Simple 向 REST 服务发出 GET 请求。这是简单的代码:

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:

farhan@farhan-lnx:~$ perl --version
这是为 x86_64-linux-gnu-thread-multi 构建的 perl,v5.10.1 (*)

我可以得到正确的响应并将其打印在屏幕上。例如:

farhan@farhan-lnx:~$ head -10 output.txt
{
“总数”:1000,
“页面”:1,
“页面大小”:30,
“问题”:[
{
“标签”:[
"php",
“数组”,
“编码风格”
(……剪掉了……)

但是在我通过 SSH 连接到的主机上,我会在屏幕上打印出 garbage 以获取相同的确切代码。我假设它与编码有关,但 REST 服务不会在响应中返回字符集类型,那么如何强制 LWP::Simple 使用正确的编码?有什么想法吗?

这是我主机上的 Perl 版本:

[dredd]$ perl --version
这是为 x86_64-linux-gnu-thread-multi 构建的 perl,v5.8.8

【问题讨论】:

    标签: perl json rest lwp


    【解决方案1】:

    我碰巧有一个 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 数据被 Web 服务器压缩。我试过这个:

    gzip -dc jsonfile
    

    你瞧,结果就是你所期望的 JSON 数据。

    您现在可以做的是使用另一个模块来解压缩数据,或者you can check out this other thread which shows how to accept gzip using LWP::UserAgent and handle the request that way

    【讨论】:

      【解决方案2】:

      这是bug 44435。将 libwww-perl 升级到 5.827 或更高版本。

      【讨论】:

      • 酷 - 感谢您的指点 - 但是阅读上面托尼的回复,这似乎是一个稍微不同的问题。无论如何,主机系统上的 Perl 版本超出了我的能力范围 :(.
      • libwwwperl 是一个 Perl 模块,有一些方法可以确保您可以在 perlmonks.org/?node_id=693828 处使用 CPAN,但使用 LWP::Request 可能是最简单的。
      • Alienfluid,你错了,这不是一个不同的问题。在 5.827 之前的 LWP::Simple 中未使用的方法decode_content 处理内容编码(此处为:gzip)和字符编码。我鼓励您像 Tony 所说的那样安装最新库的本地副本。
      猜你喜欢
      • 2014-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2013-09-04
      • 2011-10-05
      • 1970-01-01
      相关资源
      最近更新 更多