2010-06-04 61 views
2

我试图拉出一个页面,使用cfhttp解析信息。那我打电话的页面标题是:CFHTTP编码问题

内容编码:gzip

连接:保持活动

的Content-Length:19066

服务器:IBM_HTTP_Server

因人而异:Accept-Encoding,User-Agent

Content-Language:en-US

缓存控制:无缓存= “设置的cookie,

设定COOKIE2”

内容类型:

text/html的;字符集= ISO-8859-1

我将字符集设置为ISO-8859-1,但是我在FileContent中获取了以下内容(仅显示了一小部分示例,但我认为它指向了对象)。

EðÑq·OA?·I \ZóL¯þ'Vú5ðbä£ÿæ¾_HÉÒñQãO\Çþãë85ÁÜ à±°UO} &bßý?中,u?2SùQyk5g?UÛ3Ѹfã×ARÃi_iûRã _òCA¿-SS。 "b /¯ßíWÝÆ´}w~,°iøÜCáÇþ@ÃZ5¤ïsÁ8½°ì* ZÜéjOÝK/Ë4§ÈG5×ä*¬6ÚwÇ0]ã:àÑþé¬G"ÅÁl/t° jlá»5¶&¯lìYìºØ'yDð½|#ý<ñìTé%¾ï¬ùƪx¶}«±o9»ë¼ÂÆÒï'w8Y?÷ðxsllû 6íqüGÞsÜóÀx·ªk®XºàåZ{íÁ½åo÷活度¥ÝÃ8M

我尝试过其他的字符集,并正在考虑使用gzip编码会造成问题,但我不知道该如何测试如果是这样的问题。任何建议或帮助将受到重视。

下面是我的代码

<cfhttp 
    METHOD="get" 
    throwonerror="yes" 
    CHARSET="ISO-8859-1" 
    URL="http://www.cars.com/for-sale/searchresults.action?sf1Dir=DESC&prMn=1&crSrtFlds=stkTypId-feedSegId-pseudoPrice&rd=100000&zc=44203&PMmt=0-0-0&stkTypId=28881&sf2Dir=ASC&sf1Nm=price&sf2Nm=miles&feedSegId=28705&searchSource=UTILITY&pgId=2102&rpp=10"> 

    <cfhttpparam type="Header" name="Accept-Encoding" value="deflate;q=0"> 
    <cfhttpparam type= "Header" name= "TE" value= "deflate;q=0" > 
</cfhttp> 

<cfset listings = #cfhttp.FileContent#> 
<cfoutput> 
    #listings# 
</cfoutput> 

我自己也尝试标题:

<cfhttpparam type="Header" name="Accept-Encoding" value="*"> 
    <cfhttpparam type= "Header" name= "TE" value= "deflate;q=0" > 

并试图消除 '的Accept-Encoding' 头,只是留下TE。

更新: 我还没有想出来,但我找到了一些可能会帮助别人帮我的东西。当我使用我的测试php服务器在同一页面上运行file_get_contents并且它工作正常时,如果我运行相同的cfhttp代码来调用正在调用页面的php页面,我需要它工作得很好。感谢迄今为止的建议。

回答

10

与cars.com这个问题似乎是,他们使用gzip压缩输出两次(基于this thread

所以,我们需要解压的内容... ...再次

首先,我们需要获取内容为二进制,所以CFHTTP调用需要包括

getasbinary="yes" 

然后,我们需要解压缩它。

我们可以使用java.util.zip来完成它。该gunzip解是this cflib.org function修改后的版本:

<cfhttp 
    getasbinary="yes" 
    METHOD="get" 
    throwonerror="yes" 
    CHARSET="ISO-8859-1" 
    URL="http://www.cars.com/for-sale/searchresults.action?sf1Dir=DESC&prMn=1&crSrtFlds=stkTypId-feedSegId-pseudoPrice&rd=100000&zc=44203&PMmt=0-0-0&stkTypId=28881&sf2Dir=ASC&sf1Nm=price&sf2Nm=miles&feedSegId=28705&searchSource=UTILITY&pgId=2102&rpp=10" > 

    <cfhttpparam type="Header" name="Accept" value="application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"> 
    <cfhttpparam type="Header" name="User-Agent" value="Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.41"> 
    <cfhttpparam type="Header" name="Accept-Encoding" value="deflate"> 
    <cfhttpparam type="Header" name="TE" value="deflate, chunked, identity, trailers"> 

</cfhttp> 

<cfset unzippedHTML = gunzip(cfhttp.FileContent)> 

<cfoutput> 
    #unzippedHTML# 
</cfoutput> 

<cfscript> 

    function gunzip(inBytes) { 
     var gzInStream = createObject('java','java.util.zip.GZIPInputStream'); 
     var outStream = createObject('java','java.io.ByteArrayOutputStream'); 
     var inStream = createObject('java','java.io.ByteArrayInputStream'); 
     var buffer = repeatString(" ",1024).getBytes(); 
     var length = 0; 
     var rv = ""; 

     try { 
      inStream.init(inBytes); 
      gzInStream.init(inStream); 
      outStream.init(); 
      do { 
       length = gzInStream.read(buffer,0,1024); 
       if (length neq -1) outStream.write(buffer,0,length); 
      } while (length neq -1); 
      rv = outStream.toString(); 
      outStream.close(); 
      gzInStream.close(); 
      inStream.close(); 
     } 
     catch (any e) { 
      rv = ""; 
      try { 
       outStream.close(); 
      } catch (any e) { } 
       try { 
        gzInStream.close(); 
       } catch (any e) { 
        try { 
         inStream.close(); 
        } catch (any e) {} 
       } 
     } 
     return rv; 
    } 
</cfscript> 

一定要仔细检查功能的变种作用域。我可能错过了一些东西。

+0

你他们男人!那样做了! – Patcouch22 2010-11-04 15:57:29

+0

很高兴听到它!这是一个有趣的想法。 – 2010-11-05 14:18:29

0

我要做的第一件事就是通过对其他页面尝试相同的代码,确保它不是源内容/服务器。如果它们工作正常,那么它很可能是您尝试使用的服务器/内容。如果他们有同样的问题,那么问题出现在你的代码中。如果你发布你的代码,这也会很有帮助。

+0

谢谢,它似乎是我尝试使用的内容的问题,但不是在服务器上,因为我能够cfhttp任何CSS或JS文件,但它似乎只是HTML页面。 – Patcouch22 2010-06-04 16:52:37

3

根据标题你所看到的是文件的gzip内容。在它对你有用之前,它将需要解压缩。我认为你可以用cfzip做到这一点,但没有任何经验。

This post似乎表明,你可以在你的请求添加页眉把它解压/瘪返回前:

<cfhttp ...> 
    <cfhttpparam type="Header" name="Accept-Encoding" value="deflate;q=0"> 
    <cfhttpparam type="Header" name="TE" value="deflate;q=0"> 
</cfhttp> 
+0

这似乎不是问题,这是我的第一个想法,但如果我遇到这个问题,我会得到一个连接失败的问题。这似乎更像是一个charset问题,但同时没有charset似乎有效。 – Patcouch22 2010-06-04 16:50:53