代码之家  ›  专栏  ›  技术社区  ›  Adriaan

为什么indy会返回不可读的数据,但chrome会很好地加载它?

  •  9
  • Adriaan  · 技术社区  · 7 年前

    我正在尝试对我的游戏服务器的restapi之一执行一个 get request。当我将它加载到chrome中时,它会加载正确的json响应,但当我尝试使用indy时,它只会给我一堆不可读的文本。

    请求的URL: http://129.232.180.125:28019/deaths.json

    chrome response:

    indy reponse:

    y;9[195195195195\\\\195\154;\195;\;;195 ;;;\\\\\\\\195\;;;\\\\\\\195·!_
    普通合伙人@(dv&ed“`@je”?是吗?@%·3–赫兹
    ¯[%ö1cÓÔB)QV¡÷àõ=¢oÅt¥þóR§Ó§§Ï®Ô¶â*ëEu<wKÜôiýUØ^VµcÓ@vêâ»ÈR©hPædÛ=û±ô~¡;±8¢¢ÒtÇ/§û
    国际单位制·
    195; 195; 160; \195; 195; \!一个` U._)¶_ _ I_
    D%r\kb;$`^x`·············································
    1 195; 195;  H \195\195; \ 195;\195;\\154;\194\195; \\ 195 \ 195 \\ 5
    sb ^“kg+^ ~$6t]2r9%eyyursj `·'t8 ab–koae9vs-\)±xj(jr>\<m@6xd°~icbe;&l”.uu–5(ev;b°t°q8~c \h90]c–ls%qe]zo w-%@§[jq·qz/=kt=go@6*z\w7!rm'r[g%p'?+问?!u n,qs°9·h f<.t$u\9kogpe9b+nsq>iiiqs8vm.·ex x!RNZH?b@$v_sf§fqn`'t5*<?qc/j+hjik(;·a mh5v r
    Ri Pan,&F,&/N Oy Du C$E ^ lyyxz2eovqwvrww1p K-2ar]x 4y[“>(L/B!前列腺素R`
    [!_ T+_­.V.5 8_
    1米[)zy;q!A2^Z§S^QZBKNK9&K11PE§“9RY”
    _(_?)Ko_!_(
    '打盹·/li-:ih8i?| R/,I
    _ xxir_____穖!_­7T_、xr_ J_ \V_ S_、B 7B_ F_½J_ F
    6
    
    \195;  \%d)DHS K.S_、_、_)
    z;z uh;bj%s·~x@g:0w@h·,`!G(]·QNM°,Y`I;B·?bmdd<“qw±”6'3wgsct7¥k ne(ms$difa*(-gga~v(d=om+±6yf°1ni(y'总线)!Ki·6 h;r“ry&ooe·vu)”Q92luh±~44“\n–500fipl~§?_ H&·;ynnw8o^+2
    

    我的代码:

    mmo1.lines.text:=idhtp1.get('http://129.232.180.125:28019/deaths.json');

    请求的URL:http://129.232.180.125:28019/deaths.json

    铬响应:

    Chrome Response

    Indy响应:

    Y;9[ÿÍZË7¼ç3öìDQ%ÿJÃÚØ,Öw   òï§IµzvXÓö{Ab¿ÿöÏÝ»÷Ä!¾»ûûîýBó»»÷ßOwïï><¼îþ}§ På¢&È÷ÇÇÓË
    gP¤@¹(¬Dv&©ÙEµ¸®D"`»@ëJ¥E\¦£??Þ?Ù@%¤3¨µ òrÿaCHZÝÀÕ
    ¯[%ö1cÓÔB)QV¡÷àõ=¢oÅt¥þóR§Ó§§Ï®Ô¶â*ëEu<wKÜôiýUØ^VµcÓ@vêâ»ÈR©hPædÛ=û±ô~¡;±8¢¢ÒtÇ/§û
    Si¿·Õ
    Zô1-W¥²¾KdP¡tÇXýc--[ÛàÔ-Go¼aI4]ñôãÏǯÏ_& h¶@5Gá0Ú#!`u.éöæà¿i³ÇhFÜ]Q´µjÁ
    d¼Ê%½|ÔRØ\­¡Ókbê;Â$`¹^ìX»Ó`ϢѤù»   i2S$Ýûöõ¯ÉÑ2    D(,öæÛý§ûÙ¯j\-AOÙ^&Gä£WK¥2\ÙW[%a»a\Ò' U½4ßß+¯>bV«ÏêUçq¡õÏIÜ
    ,1×çiJ¾¸¸^Ðh}_æéê{²Ú°pp¼²KÖ÷ÞNÄIß¼D÷W+K3ËûÔz:}ÚÞ5
    SB^"ÕKªGè¸+¾ß^~$Õâ³6Tõ]2Õßr9¸%eàYYUrsJÏ`Êä³ë'£t8#®AB¨KϹëOAe9V ×Ís-£¬Ó鬺ùÜ\)µµ©±¢xÜj« ½ê(JRâÜ>\<M´@6Xd°ý~®i ÄCõBe;&©l³"¦}.uUè5(ÝE®V;BìðùôtúöðqÆÅ8~cÜ¡}{\h9Í©¡0²]Cèl¯s%qeÅô{Ø]zOöÞ|W-ÆöÎ%媫¦@çÎл[jѶÊÞÒÙq¤¸qZÛ/îÕ=KTÓ³ÿÒ=Go@Îì6*Z¯\W7¡ê!rM´'£¸ÇR­»[G%ëp"?+²q?!ÔU{n,QâsðÚ9÷Þòì³H¡#f<Î.ÛÂѲ­Ät$u\9KoËGpE9b+ NsQÏ>ÉIiÒQs8ôòVÖMó.Þ÷ex ½½îx!RNÇZH?×b@ Ó$v¥_SfçF«Q®n`|à`«T­®Ð¦©¸×5*<?qC´/ø©¿ÑJ¬ªï´´+ýÑHjiK( ;¤øÓA#mýH߬5v ¡µR
    ´RI{ÊPAn,&æF ,&Õ/ônÓÚ¨­oÄÀùYó}DUÿêà}C$e õ^LYæªYßÍX«Z2»ËeOæVqWvrW1ÚP«¿_kÆ-¢¢2Ar«ö©]x¢|4Ñ¿¯Y[¹">´¸(lÉÆÓÌå/BÙ!ìPGr£`¶Ê
    [!ªóèsfÄt+­.v.5_jÎê'Ô8Õ
    Ö1ÒøMÜÑõâ[®ÇÄ)ãZYàÜ;Q!Ëa2Û^Zìçsá¹Ø^´QZbKnk9&ÄKºý¼ý®Úú11pÀ¦Eç°¿9r¾«ÿ®yýÆà"ø×
     (ù ?Ko¼Þ!Τ¸ò¿^/ºo¼½åzãß*A9aãÔ°¥Ù8umÁàËuni(
        '-®®DÕêüý¸o¢z­äݲé/lßþËÁi-ö:IhÙ8£i?|Û×RÐØï/ÐÀ,I
    °Ù¥xXIRê0¹\x9séU=ªajä ^Æ£À±b¼$ÞP6<fF!µ¡Àßù!ûí7t¨¬XRÀJï\VãØsþð»b¨´7B` FýÀJÕ´F 
    6Ë
    
    èög»&·ã«¶ÛýAuR®ÝåL¬.YÌÄÿ£0æÀ%dÅ)²dhs´k¯.Ûg%ÅÂ.sâ¬Úé
    zµ½ ;¸Z}»ÕUH«;ébÿ£j£%³S÷ú~X´@ýgý:¹½ 0w@ºØHâ³·,`!«G(]íä,Q¡NØm¢Î°,ÔY`Ùi;Ò¦×b¤×?BûMd¡Çdª <ï"QÕýWÏ®µ±× "6'3ý¹¦wþGSCt7Ùäk Ne¾ªÑ¿Ò(múS Ô$DifA{ª*ö¥(-gg¶a³~v(dê©=Om+á½üí±6®yf°1²ÐNi(y`B»ò¦¹ÃàuS!kµ¡¡i÷6¦   hÖ½;r"¢R»yÆ&OªoE·VU´¹)_Q9Ç¥2lÑÀâîUhñ~¼4óß4"\µnøæèî½5Ç00fúiPàýLØ~¯é§?_HÙ&Í÷;Ynnw¯8àoü¬¼^+2
    

    我的代码:

    mmo1.Lines.Text := idhtp1.Get('http://129.232.180.125:28019/deaths.json');

    1 回复  |  直到 7 年前
        1
  •  13
  •   Remy Lebeau    7 年前

    如果服务器 Content-Encoding: gzip 在头中,所以必须解压缩数据。 以下是完整的工作示例(省略对gzip内容的检查):

    program SO51126032;
    
    {$APPTYPE CONSOLE}
    
    {$R *.res}
    
    uses
      IdHttp,
      IdZLib,
      Classes,
      System.SysUtils;
    
    function GetServerData(Url : String) : String;
    var
      Http : TIdHttp;
      Strm : TMemoryStream;
      OutStrm : TStringStream;
    begin
      Http := TIdHttp.Create(nil);
      try
        Http.HandleRedirects := True;
        Http.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';
        Http.Request.AcceptEncoding := 'gzip';
        Strm := TMemoryStream.Create;
        try
          OutStrm := TStringStream.Create(TEncoding.UTF8);
          try
            Http.Get(URL, Strm);
            Strm.Position := 0;
            if TextIsSame(Http.Response.ContentEncoding, 'gzip') then
              DecompressStream(Strm, OutStrm)
            else
              OutStrm.CopyFrom(Strm, 0);
            end;
            Result := OutStrm.DataString;
          finally
            OutStrm.Free;
          end;
        finally
          Strm.Free;
        end;
      finally
        Http.Free;
      end;
    end;
    
    begin
      try
        Writeln(GetServerData('http://129.232.180.125:28019/deaths.json')); 
      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
      Readln;
    end.
    

    *推荐方式*

    如果你分配一个 TIdCompressorZlib TIdHTTP ,它将自动检测gzip内容并动态解压缩:

    uses
      IdHttp,
      IdCompressorZLib,
      System.SysUtils;
    
    function GetServerData(const URL : String) : String;
    var
      Http : TIdHttp;
    begin
      Http := TIdHttp.Create(nil);
      try
        Http.HandleRedirects := True;
        Http.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';
        Http.Compressor := TIdCompressorZLib.Create(Http);
        Result := Http.Get(URL);
      finally
        Http.Free;
      end;
    end;