2010-06-04 4 views
2

J'essaie de tirer une page pour l'analyse des informations à l'aide de cfhttp. Les en-têtes de page que je fais appel sont:Problème de codage CFHTTP

Content-Encoding: gzip

Connection: Keep-Alive

Content-Length: 19066

Serveur: IBM_HTTP_SERVER

Variez : Accept-Encoding, User-Agent

Langue de contenu: en-US

Cache-Control: no-cache = "set cookie,

set-cookie2"

Content-Type:

text/html; charset = ISO-8859-1

Je définis le jeu de caractères sur ISO-8859-1, mais je reçois ce qui suit dans le fichier de contenu (seul un petit échantillon est montré ci-dessous, mais je crois qu'il est visible).

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¿-ß. "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

j'ai essayé d'autres jeux de caractères et envisageait l'encodage gzip à l'origine du problème, mais je ne suis pas sûr comment le test si tel est le problème. Toute suggestion ou aide serait grandement appréciée.

Ci-dessous mon code

<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> 

J'ai aussi essayé les en-têtes:

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

Et essayé d'enlever l'en-tête 'Accept-Encoding' et tout en laissant le TE. Je n'ai toujours pas compris, mais j'ai trouvé quelque chose qui pourrait aider quelqu'un à m'aider. Quand j'ai utilisé un serveur php de test pour exécuter file_get_contents sur la même page et que tout fonctionnait bien, si j'ai exécuté le même code cfhttp pour appeler la page php qui appelait la page dont j'avais besoin, cela a très bien fonctionné. Merci pour les suggestions jusqu'à présent.

Répondre

10

Le problème avec cars.com semble être qu'ils gzipping la sortie deux fois (basé sur this thread)

, nous avons besoin de décompresser le contenu ... encore une fois ...

d'abord, nous avons besoin d'obtenir le contenu sous forme binaire, donc l'appel cFHTTP doit inclure

getasbinary="yes" 

Ensuite, nous devons le décompresser.

Nous pouvons utiliser java.util.zip pour le faire. Le gunzip est une version modifiée de 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> 

Assurez-vous de bien vérifier la portée var de la fonction. J'ai peut-être manqué quelque chose.

+0

Votre homme! C'est ce que j'ai fait! – Patcouch22

+0

Content de l'entendre! C'était amusant à comprendre. –

0

La première chose que je ferais est de m'assurer que ce n'est pas le contenu/serveur source qui est le problème en essayant votre même code contre d'autres pages. Si elles fonctionnent bien, il est probable que le serveur/contenu que vous essayez de consommer. Si elles ont le même problème, le problème est dans votre code. Il serait également utile si vous avez posté votre code.

+0

Merci, il semble que ce soit un problème avec le contenu que j'essaie de consommer, mais pas sur le serveur car je peux nous cfhttp sur n'importe quel fichier css ou js mais il semble que ce soit les pages html. – Patcouch22

3

Par l'en-tête ce que vous voyez est le contenu gzippé du fichier. Il devra être décompressé avant que cela ne vous soit utile. Je suppose que vous pouvez le faire avec cfzip mais n'avez pas d'expérience en la matière.

This post semble indiquer que vous pouvez ajouter un en-tête dans votre demande d'avoir décompressé/dégonflé avant d'être renvoyé:

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

Cela ne semble pas être le problème, ce fut ma première pensée, mais si j'avais ce problème, j'obtiendrais un problème de connexion a échoué. Cela semble presque être une question de charset, mais en même temps aucun charset ne semble fonctionner. – Patcouch22