Question

Je suis en train de tirer une page pour plus d'informations sur l'analyse à l'aide cfhttp. Les en-têtes de page que je fais appel sont:

Content-Encoding: gzip

Connexion: Keep-Alive

Content-Length: 19066

Serveur: IBM_HTTP_SERVER

Variez: Accept-Encoding, User-Agent

Content-Language: en-US

Cache-Control: no-cache = "Set-Cookie,

set-cookie2"

Content-Type:

text / html; charset = ISO-8859-1

Je mis le charset à ISO-8859-1 mais je reçois ce qui suit dans le ContenuFichier (seulement un petit échantillon est illustré ci-dessous, mais je pense qu'il arrive à point à travers).

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 ÷ MBq ¥ ÝÃ8M

J'ai essayé d'autres jeux de caractères et envisageais 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és.

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

Mise à jour: Je toujours havn't pensé à elle, mais j'ai trouvé quelque chose que quelqu'un pourrait aider Aidez-moi. Lorsque j'ai utilisé un serveur php test de la mine pour exécuter file_get_contents sur la même page et il a bien fonctionné, alors si je courais le même code cfhttp pour appeler la page php qui appelait la page je en ai besoin fonctionnait très bien. Merci pour les suggestions jusqu'à présent.

Était-ce utile?

La solution

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

Alors, il faut dézipper le contenu ... à nouveau ...

Tout d'abord, nous avons besoin d'obtenir le contenu sous forme binaire, de sorte que les besoins d'appel CFHTTP à inclure

getasbinary="yes"

Ensuite, il faut le décompresser.

Nous pouvons utiliser java.util.zip pour le faire. Le gunzip est une version modifiée de cette fonction cflib.org :

<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. Je pourrais avoir manqué quelque chose.

Autres conseils

Par l'en-tête ce que vous voyez est le contenu gzip du fichier. Il devra être décompressé avant qu'il ne soit utile pour vous. Je suppose que vous pouvez le faire avec cfzip mais ne l'ai pas eu d'expérience de le faire.

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

La première chose que je voudrais faire est de faire en sorte que ce n'est pas le contenu source / serveur qui est le problème en essayant de votre même code par rapport aux autres pages. Si elles fonctionnent très bien, alors 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 publié votre code.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top