web-services - 改善 CFHTTP 响应时间

标签 web-services coldfusion httprequest httpresponse cfhttp

我有一个 API,它登录一个帐户,然后对我想通过 CFHTTP 请求出价的项目执行搜索,如下所示。

搜索.cfm:

<cfinclude template="logMeIn.cfm" />

<cfhttp url="https://utas.fut.ea.com/ut/game/fifa14/transfermarket?maxb=1800000&start=0&num=16&type=player&maskedDefId=158023" method="POST" result="Get">
    <cfhttpparam type="header" name="Cache-Control" value="no-cache" />
    <cfhttpparam type="header" name="Host" value="utas.fut.ea.com" />
    <cfhttpparam type="header" name="Referer" value="http://cdn.easf.www.easports.com/soccer/static/flash/futFifaUltimateTeamPlugin/FifaUltimateTeam.swf" />
    <cfhttpparam type="header" name="X-HTTP-Method-Override" value="GET" />
    <cfhttpparam type="header" name="X-UT-PHISHING-TOKEN" value="#ListLast(Session.searchAccount40PhishingKey,'=')#" />
    <cfhttpparam type="header" name="X-UT-SID" value="#Session.searchAccount40SessionKey#" />
</cfhttp>

登录.cfm:
<cfscript>
    Variables.email = "XYZ@example.com";
    Variables.password = "password";
    Variables.secretAnswer = "secretAnswer";
    Session.searchAccountGamertag = "WirierJupiter11";
    Variables.doReload = 0;
    Variables.deviceView = "device=not_mobile";
</cfscript>

<cfhttp url="http://www.easports.com/uk/fifa/football-club/ultimate-team" method="GET" result="stage1" redirect="false">
    <cfhttpparam type="header" name="Accept" value="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" />
    <cfhttpparam type="header" name="Accept-Encoding" value="gzip, deflate" />
    <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
    <cfhttpparam type="header" name="Connection" value="keep-alive" />
    <cfhttpparam type="header" name="Host" value="www.easports.com" />
    <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />
</cfhttp>

<cfif StructKeyExists(Stage1.ResponseHeader,"Location")>
    <cfscript>
        Variables.stage2URL = Stage1.ResponseHeader['Location'];
        Variables.returnedCookies = Stage1.ResponseHeader['Set-Cookie'];
        Variables.easfcWebSessionStr = Variables.returnedCookies[1];
        Variables.easfcWebSession = ListFirst(Variables.easfcWebSessionStr,";");
        Variables.hlStr = Variables.returnedCookies[2];
        Variables.hl = ListFirst(Variables.hlStr,";");
        Variables.xsrfTokenStr = Variables.returnedCookies[3];
        Variables.xsrfToken = ListFirst(Variables.xsrfTokenStr,";");
    </cfscript>
    <cfhttp url="#Variables.stage2URL#" method="GET" result="Stage2" redirect="false">
        <cfhttpparam type="header" name="Accept" value="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" />
        <cfhttpparam type="header" name="Accept-Encoding" value="gzip, deflate" />
        <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
        <cfhttpparam type="header" name="Connection" value="keep-alive" />
        <cfhttpparam type="header" name="Host" value="accounts.ea.com" />
        <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />
    </cfhttp>
<cfelse>
    <cfset Variables.doReload = 1 />
</cfif>

<cfif StructKeyExists(Variables,"Stage2") AND StructKeyExists(Stage2.ResponseHeader,"Location")>
    <cfscript>
        Variables.stage3URL = Stage2.ResponseHeader['Location'];
    </cfscript>
    <cfhttp url="#Variables.stage3URL#" method="GET" result="Stage3" redirect="false">
        <cfhttpparam type="header" name="Accept" value="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" />
        <cfhttpparam type="header" name="Accept-Encoding" value="gzip, deflate" />
        <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
        <cfhttpparam type="header" name="Connection" value="keep-alive" />
        <cfhttpparam type="header" name="Host" value="signin.ea.com" />
        <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />
    </cfhttp>
<cfelse>
    <cfset Variables.doReload = 1 />
</cfif>

<cfif StructKeyExists(Variables,"Stage3") AND StructKeyExists(Stage3.ResponseHeader,"Location")>
    <cfscript>
        Variables.stage4URL = Stage3.ResponseHeader['Location'];
        Variables.jSessionStr = Stage3.ResponseHeader['Set-Cookie'];
        Variables.jSession = ListFirst(Variables.jSessionStr,";");
    </cfscript>

    <cfhttp url="#Variables.stage4URL#" method="GET" result="Stage4" redirect="false">
        <cfhttpparam type="header" name="Accept" value="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" />
        <cfhttpparam type="header" name="Accept-Encoding" value="gzip, deflate" />
        <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
        <cfhttpparam type="header" name="Connection" value="keep-alive" />
        <cfhttpparam type="header" name="Cookie" value="#Variables.jSession#" />
        <cfhttpparam type="header" name="Host" value="signin.ea.com" />
        <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />
    </cfhttp>

    <cfscript>
        Variables.bodyContent = "email=#Variables.email#&password=#Variables.password#&_rememberMe=on&rememberMe=on&_eventId=submit&facebookAuth=";
        Variables.contentLength = Len(Variables.bodyContent);
    </cfscript>

    <cfhttp url="#Variables.stage4URL#" method="POST" result="Stage5" redirect="false">
        <cfhttpparam type="header" name="Accept" value="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" />
        <cfhttpparam type="header" name="Accept-Encoding" value="gzip, deflate" />
        <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
        <cfhttpparam type="header" name="Cache-Control" value="no-cache" />
        <cfhttpparam type="header" name="Connection" value="keep-alive" />
        <cfhttpparam type="header" name="Content-Length" value="#Variables.contentLength#" />
        <cfhttpparam type="header" name="Content-Type" value="application/x-www-form-urlencoded" />
        <cfhttpparam type="header" name="Cookie" value="#Variables.jSession#" />
        <cfhttpparam type="header" name="Host" value="signin.ea.com" />
        <cfhttpparam type="header" name="Referer" value="#Variables.stage4URL#" />
        <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />
        <cfhttpparam type="body" value="#Variables.bodyContent#" />
    </cfhttp>
<cfelse>
    <cfset Variables.doReload = 1 />
</cfif>

<cfif StructKeyExists(Variables,"Stage5") AND StructKeyExists(Stage5.ResponseHeader,"Location")>
    <cfscript>
        Variables.stage6URL = Stage5.ResponseHeader['Location'];
        Variables.returnedCookies = Stage5.ResponseHeader['Set-Cookie'];
        Variables.webunStr = Variables.returnedCookies[3];
        Variables.webun = ListFirst(Variables.webunStr,";");
        Variables.isPogoStr = Variables.returnedCookies[4];
        Variables.isPogo = ListFirst(Variables.isPogoStr,";");
    </cfscript>
    <cfhttp url="#Variables.stage6URL#" method="GET" result="Stage6" redirect="false">
        <cfhttpparam type="header" name="Accept" value="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" />
        <cfhttpparam type="header" name="Accept-Encoding" value="gzip, deflate" />
        <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
        <cfhttpparam type="header" name="Cache-Control" value="no-cache" />
        <cfhttpparam type="header" name="Connection" value="keep-alive" />
        <cfhttpparam type="header" name="Cookie" value="s_sivo=US%3AORIGIN%3ANONE; s_cc=true; s_ria=flash%2010%7Csilverlight%202.9; s_pv=NA%3AUS%3ASTORE%3ANONE%3ASTORE%3ANONE%3AORIGIN%3ANONE%3ALOGIN; s_nr1=1379427845791-NEW; s_sq=%5B%5BB%5D%5D; __utma=103303007.1129861060.1379427834.1379427834.1379427834.1; __utmb=103303007.1.10.1379427834; __utmc=103303007; __utmz=103303007.1379427834.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); s_ppv=85">
        <cfhttpparam type="header" name="Host" value="accounts.ea.com" />
        <cfhttpparam type="header" name="Referer" value="#Variables.stage4URL#" />
        <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />
    </cfhttp>
<cfelse>
    <cfset Variables.doReload = 1 />
</cfif>

<cfif StructKeyExists(Variables,"Stage6") AND StructKeyExists(Stage6.ResponseHeader,"Location")>
    <cfscript>
        Variables.stage7URL = Stage6.ResponseHeader['Location'];
        Variables.returnedCookies = Stage6.ResponseHeader['Set-Cookie'];
        Variables.sidStr = Variables.returnedCookies[1];
        Variables.sid = ListFirst(Variables.sidStr,";");
        Variables.remidStr = Variables.returnedCookies[2];
        Variables.remid = ListFirst(Variables.remidStr,";");
        Variables.cookieStr = Variables.easfcWebSession & "; " & Variables.hl & "; " & Variables.xsrfToken;
    </cfscript>
    <cfhttp url="#Variables.stage7URL#" method="GET" result="Stage7" redirect="false">
        <cfhttpparam type="header" name="Accept" value="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" />
        <cfhttpparam type="header" name="Accept-Encoding" value="gzip, deflate" />
        <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
        <cfhttpparam type="header" name="Cache-Control" value="no-cache" />
        <cfhttpparam type="header" name="Connection" value="keep-alive" />
        <cfhttpparam type="header" name="Cookie" value="#Variables.cookieStr#" />
        <cfhttpparam type="header" name="Host" value="www.easports.com" />
        <cfhttpparam type="header" name="Pragma" value="no-cache" />
        <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />
    </cfhttp>
<cfelse>
    <cfset Variables.doReload = 1 />
</cfif>

<cfif StructKeyExists(Variables,"Stage7") AND StructKeyExists(Stage7.ResponseHeader,"Location")>
    <cfscript>
        Variables.stage8URL = Stage7.ResponseHeader['Location'];
        Variables.easfcWebSessionStr = Stage7.ResponseHeader['Set-Cookie'];
        Variables.easfcWebSession = ListFirst(Variables.easfcWebSessionStr,";");
        Variables.cookieStr = Variables.easfcWebSession & "; " & Variables.hl & "; " & Variables.xsrfToken;
    </cfscript>
    <cfhttp url="#Variables.stage8URL#" method="GET" result="Stage8" redirect="false">
        <cfhttpparam type="header" name="Accept" value="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" />
        <cfhttpparam type="header" name="Accept-Encoding" value="gzip, deflate" />
        <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
        <cfhttpparam type="header" name="Cache-Control" value="no-cache" />
        <cfhttpparam type="header" name="Connection" value="keep-alive" />
        <cfhttpparam type="header" name="Cookie" value="#Variables.cookieStr#" />
        <cfhttpparam type="header" name="Host" value="www.easports.com" />
        <cfhttpparam type="header" name="Pragma" value="no-cache" />
        <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />
    </cfhttp>
<cfelse>
    <cfset Variables.doReload = 1 />
</cfif>

<cfif StructKeyExists(Variables,"Stage8") AND StructKeyExists(Stage8.ResponseHeader,"Set-Cookie")>
    <cfscript>
        Variables.stage9URL = "http://www.easports.com/iframe/fut/?locale=en_GB&baseShowoffUrl=http%3A%2F%2Fwww.easports.com%2Fuk%2Ffifa%2Ffootball-club%2Fultimate-team%2Fshow-off&guest_app_uri=http%3A%2F%2Fwww.easports.com%2Fuk%2Ffifa%2Ffootball-club%2Fultimate-team";
        Variables.returnedCookies = Stage8.ResponseHeader['Set-Cookie'];
        Variables.deviceView = ListFirst(Variables.returnedCookies,";");
        Variables.cookieStr = Variables.cookieStr & "; " & Variables.deviceView;
    </cfscript>
    <cfhttp url="#Variables.stage9URL#" method="GET" result="Stage9" redirect="false">
        <cfhttpparam type="header" name="Accept" value="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" />
        <cfhttpparam type="header" name="Accept-Encoding" value="gzip, deflate" />
        <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
        <cfhttpparam type="header" name="Connection" value="keep-alive" />
        <cfhttpparam type="header" name="Cookie" value="#Variables.cookieStr#" />
        <cfhttpparam type="header" name="Host" value="www.easports.com" />
        <cfhttpparam type="header" name="Referer" value="http://www.easports.com/uk/fifa/football-club/ultimate-team" />
        <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />
    </cfhttp>
<cfelse>
    <cfset Variables.doReload = 1 />
</cfif>

<cfif StructKeyExists(Variables,"Stage9") AND StructKeyExists(Stage9.ResponseHeader,"Location")>
    <cfscript>
        Variables.stage10URL = Stage9.ResponseHeader['Location'];
        Variables.futWebStr = Stage9.ResponseHeader['Set-Cookie'];
        Variables.futWeb = ListFirst(Variables.futWebStr,";");
        Variables.cookieStr = Variables.remid & "; " & Variables.sid;
    </cfscript>
    <cfhttp url="#Variables.stage10URL#" method="GET" result="Stage10" redirect="false">
        <cfhttpparam type="header" name="Accept" value="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" />
        <cfhttpparam type="header" name="Accept-Encoding" value="gzip, deflate" />
        <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
        <cfhttpparam type="header" name="Connection" value="keep-alive" />
        <cfhttpparam type="header" name="Cookie" value="#Variables.cookieStr#" />
        <cfhttpparam type="header" name="Host" value="accounts.ea.com" />
        <cfhttpparam type="header" name="Referer" value="http://www.easports.com/uk/fifa/football-club/ultimate-team" />
        <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />
    </cfhttp>
<cfelse>
    <cfset Variables.doReload = 1 />
</cfif>

<cfif StructKeyExists(Variables,"Stage10") AND StructKeyExists(Stage10.ResponseHeader,"Location")>
    <cfscript>
        Variables.stage11URL = Stage10.ResponseHeader['Location'];
        Variables.sidStr = Stage10.ResponseHeader['Set-Cookie'];
        Variables.sid = ListFirst(Variables.sidStr,";");
        Variables.cookieStr = Variables.futWeb & "; " & Variables.easfcWebSession & "; " & Variables.hl & "; " & Variables.xsrfToken & "; " & Variables.deviceView;
    </cfscript>
    <cfhttp url="#Variables.stage11URL#" method="GET" result="Stage11" redirect="false">
        <cfhttpparam type="header" name="Accept" value="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" />
        <cfhttpparam type="header" name="Accept-Encoding" value="gzip, deflate" />
        <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
        <cfhttpparam type="header" name="Connection" value="keep-alive" />
        <cfhttpparam type="header" name="Cookie" value="#Variables.cookieStr#" />
        <cfhttpparam type="header" name="Host" value="www.easports.com" />
        <cfhttpparam type="header" name="Referer" value="http://www.easports.com/fifa/football-club/ultimate-team" />
        <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />
    </cfhttp>
<cfelse>
    <cfset Variables.doReload = 1 />
</cfif>

<cfif StructKeyExists(Variables,"Stage11") AND StructKeyExists(Stage11.ResponseHeader,"Location")>
    <cfscript>
        Variables.stage12URL = Stage11.ResponseHeader['Location'];
        Variables.futWebStr = Stage11.ResponseHeader['Set-Cookie'];
        Variables.futWeb = ListFirst(Variables.futWebStr,";");
        Session.searchAccountCookie = Variables.futWeb & "; " & Variables.easfcWebSession & "; " & Variables.hl & "; " & Variables.xsrfToken & "; " & Variables.deviceView;
    </cfscript>
    <cfhttp url="#Variables.stage12URL#" method="GET" result="Stage12" redirect="false">
        <cfhttpparam type="header" name="Accept" value="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" />
        <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
        <cfhttpparam type="header" name="Connection" value="keep-alive" />
        <cfhttpparam type="header" name="Cookie" value="#Session.searchAccountCookie#" />
        <cfhttpparam type="header" name="Host" value="www.easports.com" />
        <cfhttpparam type="header" name="Referer" value="http://www.easports.com/fifa/football-club/ultimate-team" />
        <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />
    </cfhttp>
<cfelse>
    <cfset Variables.doReload = 1 />
</cfif>

<cfif StructKeyExists(Session,"searchAccountCookie")>
    <cfscript>
        Variables.data = '{ "isReadOnly": false, "sku": "FUT14WEB", "clientVersion": 1, "nuc": 1000215983198, "nucleusPersonaId": 948682854"nucleusPersonaDisplayName": "WirierJupiter11", "nucleusPersonaPlatform": "360", "locale": "en-GB", "method": "authcode", "priorityLevel":4, "identification": { "authCode": "" } }';
        Variables.dataLength = Len(Variables.data);
    </cfscript>
    <cfhttp url="http://www.easports.com/iframe/fut/p/ut/auth" method="POST" result="sessionIDRequest">
        <cfhttpparam type="header" name="Accept" value="application/json, text/javascript" />
        <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
        <cfhttpparam type="header" name="Connection" value="keep-alive" />
        <cfhttpparam type="header" name="Content-Length" value="#Variables.dataLength#" />
        <cfhttpparam type="header" name="Content-Type" value="application/json" />
        <cfhttpparam type="header" name="Cookie" value="#Session.searchAccountCookie#" />
        <cfhttpparam type="header" name="Easw-Session-Data-Nucleus-ID" value="1000215983198" />
        <cfhttpparam type="header" name="Host" value="www.easports.com" />
        <cfhttpparam type="header" name="Pragma" value="no-cache" />
        <cfhttpparam type="header" name="Referer" value=" http://www.easports.com/iframe/fut/?baseShowoffUrl=http%3A%2F%2Fwww.easports.com%2Fuk%2Ffifa%2Ffootball-club%2Fultimate-team%2Fshow-off&guest_app_uri=http%3A%2F%2Fwww.easports.com%2Fuk%2Ffifa%2Ffootball-club%2Fultimate-team&locale=en_GB">
        <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />   
        <cfhttpparam type="header" name="X-UT-Embed-Error" value="true" />
        <cfhttpparam type="header" name="X-UT-Route" value="https://utas.fut.ea.com:443" />
        <cfhttpparam type="header" name="X-Requested-With" value="XMLHttpRequest" />
        <cfhttpparam type="body" value="#Variables.data#" />
    </cfhttp>
<cfelse>
    <cfset Variables.doReload = 1 />
</cfif>

<cfif StructKeyExists(Variables,"sessionIDRequest") AND Variables.sessionIDRequest.FileContent NEQ "Connection Failure" AND Variables.sessionIDRequest.StatusCode NEQ "500 Internal Server Error">
    <cfscript>
        Variables.sessionKeyRequest = REReplace(Variables.sessionIDRequest.FileContent, "^\s*[[:word:]]*\s*\(\s*","");
        Variables.sessionKeyRequest = REReplace(Variables.sessionKeyRequest, "\s*\)\s*$", "");
        Variables.sessionInfo = DeserializeJSON(Variables.sessionKeyRequest);
        Session.searchAccountSessionKey = Variables.sessionInfo.sid;
    </cfscript>
    <cfhttp url="http://www.easports.com/iframe/fut/p/ut/game/fifa14/phishing/validate" method="POST" result="phishingKeyRequest">
        <cfhttpparam type="header" name="Accept" value="application/json" />
        <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
        <cfhttpparam type="header" name="Connection" value="keep-alive" />
        <cfhttpparam type="header" name="Content-Length" value="39" />
        <cfhttpparam type="header" name="Content-Type" value="application/x-www-form-urlencoded" />
        <cfhttpparam type="header" name="Cookie" value="#Session.searchAccountCookie#" />
        <cfhttpparam type="header" name="Easw-Session-Data-Nucleus-ID" value="1000215983198" />
        <cfhttpparam type="header" name="Host" value="www.easports.com" />
        <cfhttpparam type="header" name="Pragma" value="no-cache" />
        <cfhttpparam type="header" name="Referer" value="http://www.easports.com/iframe/fut/?baseShowoffUrl=http%3A%2F%2Fwww.easports.com%2Fuk%2Ffifa%2Ffootball-club%2Fultimate-team%2Fshow-off&guest_app_uri=http%3A%2F%2Fwww.easports.com%2Fuk%2Ffifa%2Ffootball-club%2Fultimate-team&locale=en_GB">
        <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />
        <cfhttpparam type="header" name="X-UT-Embed-Error" value="true" />
        <cfhttpparam type="header" name="X-UT-Route" value="https://utas.fut.ea.com:443" />
        <cfhttpparam type="header" name="X-Requested-With" value="XMLHttpRequest" />
        <cfhttpparam type="header" name="X-UT-SID" value="#Session.searchAccountSessionKey#" />
        <cfhttpparam type="formField" name="answer" value="#Variables.secretAnswer#">
    </cfhttp>
<cfelse>
    <cfset Variables.doReload = 1 />
</cfif>

<cfif StructKeyExists(Variables,"phishingKeyRequest") AND StructKeyExists(Variables.phishingKeyRequest.ResponseHeader,"Set-Cookie")>    
    <cfscript>
        Variables.returnedCookies = phishingKeyRequest.ResponseHeader["Set-Cookie"];
        Session.searchAccountPhishingKey = ListFirst(Variables.returnedCookies,";");
        if (StructKeyExists(Variables,"easfcWebSession")) {
            Variables.cookieStr = Variables.easfcWebSession & "; " & Variables.hl & "; " & Variables.xsrfToken & "; device=not_mobile; " & Session.searchAccountPhishingKey;
            Session.searchAccountLoggedIn = 1;
            Session.searchAccountLoginAttempts = 0;
        } else {
            Variables.doReload = 1;
        }
    </cfscript>
<cfelse>
    <cfset Variables.doReload = 1 />
</cfif>

<!--- IF RELOAD PAGE FLAG SET TO TRUE RELOAD --->
<cfif Variables.doReload EQ 1>

    <!--- RELOAD PAGE --->
    <script>
        location.reload();
    </script>

</cfif>

我遇到的问题是搜索响应需要几百毫秒才能返回,这导致我错过了很多项目(因为有 API 可以更快地恢复这些数据)。

有什么方法可以增加我收到回复所需的时间?有什么我可以修改我的代码或我可以使用的 CFHTTP 的替代函数吗?或者甚至还有另一种语言,如 Ruby、Python 或 C#,我可能会更好地编写可以更快地执行此类功能的 API,因为归根结底,速度是最重要的因素。

非常感谢您提供任何建议。

最佳答案

CFHTTP 将打开一个连接,发出请求,然后关闭连接。如果我没看错,您的 logMeIn.cfm 正在发出 14 个 http 请求。设置每个连接需要花费大量时间。

我认为你有两种选择:

提前登录

是否可以在线程中或使用 CF 调度程序定期运行 logMeIn.cfm 并将 searchAccount40SessionKey 值保留在应用程序范围内?您的代码可以发出请求并查看 session ID 是否仍然有效。如果是,就留下吧。如果没有,请完成登录过程。
如果您的站点支持许多用户,这可能不是一种可扩展的方法。如果它适用于少数人,它可能会起作用

使用不同的 HTTP 库。

CF 附带 HTTPClient(我认为,现在只需下载即可检查)。那有能力做连接管理。这样,您应该能够在所有请求中保持单个连接。这将意味着重写您的大部分代码,但您应该会看到显着的速度提升。您也可以稍微简化一些事情,因为 HTTPClient 可以对 cookie/location 头和重定向进行一些管理。

看看这个答案:Understanding Persistent HTTP Connections in ColdFusion

如果您还没有这样做,请通过 Fiddler 代理您的请求,这样您就可以看到客户端/服务器是如何交互的。要使用 Fiddler,请安装它,启动它,然后修改您的 CFHTTP 调用以使用 proxyServer=localhost 和 proxyPort=8888。然后,您将看到列出的 HTTP 调用。在这种工作中它是无价的。它还可以让您将请求拖到 Composer 选项卡中,对其进行一些编辑,然后重新发送它,这比重新编写代码要快得多,只是为了尝试一些东西。

更新

@CPB07 在评论中添加了更多细节。 session ID 已经缓存并保存在 session 中,这意味着第一个建议已经实现。另一位信息是 search.cfm 每 335 毫秒被调用一次,这就是需要优化的内容。
鉴于此,我能想到的最佳改进是将 search.cfm 中的 CFHTTP 调用切换为使用 HTTPClient。 CF10 附带了 HTTPComponents 的 HTTPClient 的最新版本,因此在 this page 的第 2.3 节中列出的代码应该大致是你所追求的。 2.3.1 节中的示例使用了一个 HTTPContext,它有一个 getCookieStore() 方法,它有一个 addCookie() 方法,它允许您设置 session cookie 并在每个请求中使用它。粗略地说,该代码中 try 块之外的所有内容都可以运行一次并将对象存储在 session 中,然后每次都可以运行实际的请求/连接打开。

另一件要考虑的事情是您首先是如何执行代码的。您说您对线程不太熟悉,我猜这意味着您正在使用调度程序或 AJAX 进行轮询。通过在线程中运行轮询代码,您可能会获得更一致的结果,但这会增加复杂性。

更新 2

使用Fiddler访问search.cfm中的URL,查看统计选项卡,两个关键数字是:

  • TCP/IP 连接:5ms
  • HTTPS 握手:186 毫秒

  • 如果您保持连接打开,您可以平均节省每个请求的时间。 Keep-alive 只为一定数量的请求保持连接打开,因此您必须定期重新连接,但考虑到您每 335 毫秒发出一次请求,连接时间花费约 200 毫秒似乎很高。
    浏览器是否每 335 毫秒请求一次 search1.cfm?如果是这样,您将付出双重代价,因为浏览器连接到您的服务器,然后它必须连接到外部服务器。

    关于web-services - 改善 CFHTTP 响应时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20719219/

    相关文章:

    java - 如何从 Play WS 响应中解析 HTML

    jquery - 我可以在 JQuery 中访问 ColdFusion session 吗?

    javascript - 异步加载 Coldfusion javascript?

    c# - 更改 Web Api 2 Post 方法以接受修改后的正文

    php - Http 请求在模拟器上失败

    android - 我收到错误 : "The import org.ksoap2.transport.HttpTransportSE" can not be resolved in Android

    java - Spring MVC ModelAttribute 作为接口(interface)

    php - 将 PHP 代码(以编码 WebServices API HASH)转换为 COLDFUSION

    ruby-on-rails - request.env ['CONTENT_TYPE' ] 和 request.content_type 是什么,为什么有区别?

    web-services - 如何将枚举值传递给Web服务