2010-06-04 54 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