Läsa in externa data

Flash Player 9 och senare, Adobe AIR 1.0 och senare

ActionScript 3.0 innehåller funktioner för att läsa in data från externa källor. Dessa källor kan tillhandahålla statiskt innehåll såsom textfiler, eller dynamiskt innehåll som genereras av ett webbskript. Data kan vara formaterade på olika sätt, och ActionScript erbjuder funktionalitet för att avkoda och få tillgång till data. Du kan även skicka data till den externa servern som en del av hämtningen av data.

Använda klassen URLRequest

Många API:er som läser in externa data använder klassen URLRequest för att definiera egenskaperna för den nödvändiga nätverksbegäran.

URLRequest-egenskaper

Följande egenskaper kan anges för ett URLRequest-objekt i alla säkerhetssandlådor:

Egenskap

Beskrivning

contentType

MIME-innehållstypen för alla data som skickas med URL-begäran. Om inget contentType har angetts skickas värden som application/x-www-form-urlencoded .

data

Ett objekt som innehåller data som ska överföras med URL-begäran.

digest

En sträng som ger en unik identifiering av den signerade Adobe-plattformskomponent som ska lagras i (eller hämtas från) Adobe® Flash® Player-cachen.

method

Metoden för en HTTP-begäran, till exempel GET eller POST. (Innehåll som körs i säkerhetsdomänen för AIR-programmet kan ange andra strängar än GET eller POST som method -egenskap. Alla HTTP-verb är tillåtna och standardmetoden är GET . Se även AIR-säkerhet .)

requestHeaders

Arrayen med rubriker för HTTP-begäranden som ska läggas till i HTTP-begäran. Observera att tillstånd för att ange vissa huvuden är begränsat i Flash Player och i AIR-innehåll som körs utanför programmets säkerhetssandlåda.

url

Anger den URL som ska begäras.

I AIR kan du ange ytterligare egenskaper för klassen URLRequest som endast är tillgängliga för AIR-innehåll som körs i programmets säkerhetssandlåda. Innehåll i programsandlådan kan också definiera URL:er som använder nya URL-scheman (utöver standardscheman som file och http ).

Egenskap

Beskrivning

followRedirects

Anger om omdirigeringar ska följas ( true , standardvärdet) eller inte ( false ). Detta stöds endast i sandlådan för AIR-programmet.

manageCookies

Anger om HTTP-protokollstacken ska hantera cookies ( true , standardvärdet) eller inte ( false ) för denna begäran. Den här egenskapen kan endast anges i sandlådan för AIR-programmet.

authenticate

Anger om autentiseringsbegäranden ska hanteras ( true ) för denna begäran. Den här egenskapen kan endast anges i sandlådan för AIR-programmet. Standardinställningen är att begäranden ska autentiseras, vilket kan innebära att en dialogruta för autentisering visas om servern kräver autentiseringsuppgifter. Du kan också ange användarnamn och lösenord med klassen URLRequestDefaults, se Ange standardvärden för URLRequest (endast AIR) .

cacheResponse

Anger om svarsdata ska cachelagras för den här begäran. Den här egenskapen kan endast anges i sandlådan för AIR-programmet. Standardvärdet är att svaret cachelagras ( true ).

useCache

Anger om den lokala cachen ska genomsökas innan data hämtas med det här URLRequest-objektet. Den här egenskapen kan endast anges i sandlådan för AIR-programmet. Standardvärdet ( true ) är att den lokala cacheversionen används, om en sådan är tillgänglig.

userAgent

Anger den användaragentsträng som ska användas i HTTP-begäran.

Obs! Klassen HTMLLoader har relaterade egenskaper för inställningar som rör innehåll som läses in av ett HTMLLoader-objekt. Mer information finns i Om klassen HTMLLoader .

Ange standardvärden för URLRequest (endast AIR)

Med klassen URLRequestDefaults kan du definiera programspecifika standardinställningar för URLRequest-objekt. I följande kod anges till exempel standardvärdena för egenskaperna manageCookies och useCache . För alla nya URLRequest-objekt används dessa angivna värden för egenskaperna istället för standardvärden:

URLRequestDefaults.manageCookies = false; 
URLRequestDefaults.useCache = false;
Obs! Klassen URLRequestDefaults anges endast för innehåll som körs i Adobe AIR. Det stöds inte i Flash Player.

Klassen URLRequestDefaults innehåller en setLoginCredentialsForHost() -metod som gör att du kan ange ett användarnamn och lösenord som används som standard för en specifik värd. Värden definieras i parametern hostname för metoden och kan vara en domän, till exempel "www.example.com" , eller en domän och ett portnummer, till exempel "www.example.com:80" . Observera att "example.com" , "www.example.com" och "sales.example.com" alla behandlas som unika värdar.

Dessa användaruppgifter används endast om servern kräver dem. Om användaren redan har autentiserats (till exempel i dialogrutan för autentisering) ändras inte den autentiserade användaren vid anrop av metoden setLoginCredentialsForHost() .

I koden nedan anges standardvärden för användarnamn och lösenord som används när en begäran skickas till www.example.com:

URLRequestDefaults.setLoginCredentialsForHost("www.example.com", "Ada", "love1816$X"); 

Inställningarna för URLRequestDefaults gäller endast för den aktuella programdomänen, med ett undantag. Inloggningsuppgifterna som skickas till metoden setLoginCredentialsForHost() används för begäran i alla programdomäner inom AIR-programmet.

Du hittar mer information i avsnittet om klassen URLRequestDefaults i Referenshandbok för ActionScript 3.0 i Adobe Flash-plattformen .

URI-scheman

Standardscheman för URI, som beskrivs här, kan användas i en begäran från alla typer av säkerhetssandlådor:

http: och https:

Använd dessa för vanliga Internetadresser (på samma sätt som de används i en webbläsare).

file:

Använd file: om du vill ange en adress till en fil som finns på det lokala filsystemet. Till exempel:

file:///c:/AIR Test/test.txt 

I AIR kan du också använda följande scheman när du definierar en URL för innehåll som körs i säkerhetssandlådan för programmet:

app:

Använd app: om du vill ange en relativ sökväg till det installerade programmets rotkatalog. Följande sökväg pekar till exempel på en resursunderkatalog i katalogen för det installerade programmet:

app:/resources 

När ett AIR-program startas med AIR Debug Launcher (ADL) är programkatalogen den katalog som innehåller programbeskrivningsfilen.

I URL (och url -egenskapen) för ett File-objekt som har skapats med File.applicationDirectory används URI-schemat app , enligt följande exempel:

var dir:File = File.applicationDirectory; 
dir = dir.resolvePath("assets"); 
trace(dir.url); // app:/assets 

app-storage:

Använd app-storage: om du vill ange en relativ sökväg till programmets datalagringskatalog. För varje installerat program (och användare) skapar AIR en unik programlagringskatalog, där du kan lagra data som gäller för det programmet. Följande sökväg pekar till exempel på en prefs.xml-fil i en inställningsunderkatalog till programlagringskatalogen:

app-storage:/settings/prefs.xml 

I URL (och url -egenskapen) för ett File-objekt som har skapats med File.applicationStorageDirectory används URI-schemat app-storage , enligt följande exempel:

var prefsFile:File = File.applicationStorageDirectory; 
prefsFile = prefsFile.resolvePath("prefs.xml"); 
trace(dir.prefsFile); // app-storage:/prefs.xml 

mailto:

Du kan använda mailto-schemat i URLRequest-objekt som skickas till navigateToURL() -funktionen. Läs mer i Öppna en URL i ett annat program .

Du kan använda ett URLRequest-objekt som har något av dessa URI-scheman när du definierar URL-begäran för ett antal olika objekt, till exempel ett FileStream- eller Sound-objekt. Du kan också använda dessa scheman i HTML-innehåll som körs i AIR. Du kan till exempel använda dem i img -taggens src -attribut.

Du kan dock endast använda dessa AIR-specifika URI-scheman ( app: och app-storage: ) i innehåll i säkerhetssandlådan för programmet. Mer information finns under AIR-säkerhet .

Ange URL-variabler

När du lägger till variabler i en URL-sträng direkt kan det vara lättare att använda klassen URLVariables för att definiera de variabler som krävs för en begäran.

Du kan lägga till parametrar i ett URLVariables-objekt på tre sätt:

  • I URLVariables-konstruktorn

  • Med metoden URLVariables.decode()

  • Som dynamiska egenskaper för själva URLVariables-objektet

I följande exempel visas alla tre metoder och också hur du tilldelar variablerna till ett URLRequest-objekt:

var urlVar:URLVariables = new URLVariables( "one=1&two=2" ); 
urlVar.decode("amp=" + encodeURIComponent( "&" ) ); 
urlVar.three = 3; 
urlVar.amp2 = "&&"; 
trace(urlVar.toString()); //amp=%26&amp2=%26%26&one=1&two=2&three=3 
 
var urlRequest:URLRequest = new URLRequest( "http://www.example.com/test.cfm" ); 
urlRequest.data = urlVar;

När du definierar variabler inom URLVariables-konstruktorn eller i metoden URLVariables.decode() , ska du se till att du URL-kodar alla tecken som har en särskild betydelse i en URI-sträng. Om du till exempel använder ett &-tecken i ett parameternamn eller värde måste du koda &-tecknet genom att ändra det från & till %26 eftersom &-tecknet fungerar som en avgränsare för parametrar. Du kan använda högnivåfunktionen encodeURIComponent() för detta.

Använda klassen URLLoader

Med klassen URLLoader kan du skicka en begäran till en server och få åtkomst till den information som skickas tillbaka. Du kan också använda klassen URLLoader för att få åtkomst till filer på det lokala filsystemet om lokal filåtkomst tillåts (till exempel i sandlådan lokal-med-filsystem i Flash Player och i AIR-programsandlådan). Med klassen URLLoader laddas data ned från en URL som text, binära data eller URL-kodade variabler. Klassen URLLoader skickar händelser som complete , httpStatus , ioError , open , progress och securityError .

Händelsehanteringsmodellen i ActionScript 3.0 skiljer sig väsentligen från ActionScript 2.0-modellen, som använde händelsehanterarna LoadVars.onData , LoadVars.onHTTPStatus och LoadVars.onLoad . Mer information om hur du hanterar händelser i ActionScript 3.0 finns i Hantera händelser

Hämtade data är inte tillgängliga förrän hämtningen har slutförts. Du kan följa hämtningsförloppet (inlästa byte av totalt antal byte) genom att avlyssna när händelsen progress skickas. Men om det går tillräckligt fort att läsa in en fil kanske inte någon progress -händelse skickas. När en fil har laddats ned skickas händelsen complete . Genom att ange URLLoader-egenskapen dataFormat kan du välja att ta emot data som text, binära rådata eller som ett URLVariables-objekt.

Metoden URLLoader.load() (och eventuellt konstruktorn för klassen URLLoader) har en enda parameter, request , som är ett URLRequest-objekt. Ett URLRequest-objekt innehåller all information för en enskild HTTP-begäran, till exempel mål-URL, begärandemetod ( GET eller POST ), annan huvudinformation samt MIME-typ.

Om du till exempel vill överföra ett XML-paket till ett skript på en server kan du använda följande kod:

var secondsUTC:Number = new Date().time; 
var dataXML:XML =  
    <clock> 
        <time>{secondsUTC}</time> 
    </clock>; 
var request:URLRequest = new URLRequest("http://www.yourdomain.com/time.cfm"); 
request.contentType = "text/xml"; 
request.data = dataXML.toXMLString(); 
request.method = URLRequestMethod.POST; 
var loader:URLLoader = new URLLoader(); 
loader.load(request); 

Ovanstående kodutdrag skapar ett XML-dokument med namnet dataXML som innehåller det XML-paket som ska skickas till servern. I exemplet anges att URLRequest-egenskapen contentType ska vara "text/xml" och XML-dokumentet tilldelas URLRequest-egenskapen data . Slutligen skapar exemplet ett URLLoader-objekt och skickar begäran till fjärrskriptet med metoden load() .

Använda klassen URLStream

Klassen URLStream ger åtkomst till hämtade data samtidigt som de hämtas. Med klassen URLStream kan du även stänga en ström innan hämtningen har slutförts. De data som hämtats är tillgängliga som binära rådata.

Vid läsning av data från ett URLStream-objekt använder du egenskapen bytesAvailable om du vill avgöra om tillräcklig mängd data finns tillgänglig för inläsningen. Ett EOFError-undantag genereras om du försöker att läsa mer data än vad som finns tillgängligt.

Händelsen httpResponseStatus (AIR)

I Adobe AIR skickar klassen URLStream en httpResponseStatus -händelse tillsammans med händelsen httpStatus . Händelsen httpResponseStatus levereras före alla eventuella svarsdata. Händelsen httpResponseStatus (som representeras av klassen HTTPStatusEvent) innehåller en responseURL -egenskap, som är den URL som svaret returnerades från, och en responseHeaders -egenskap, som är en array med URLRequestHeader-objekt som representerar de svarshuvuden som svaret returnerade.

Läsa in data från externa dokument

När du skapar dynamiska program kan det vara användbart att läsa in data från externa filer eller från skript på servern. På det sättet kan du skapa dynamiska program utan att behöva redigera eller kompilera om programmet. Om du till exempel skapar ett program för ”dagens tips” kan du skriva ett skript på servern som hämtar ett slumpmässigt tips från en databas och sparar det i en textfil en gång om dagen. Då kan programmet läsa in innehållet från en statisk textfil i stället för att varje gång skicka en begäran till databasen.

Följande kodfragment skapar ett URLRequest- och ett URLLoader-objekt, som läser in innehållet i en extern textfil med namnet params.txt:

var request:URLRequest = new URLRequest("params.txt"); 
var loader:URLLoader = new URLLoader(); 
loader.load(request);
Standardinställningen innebär, att om du inte definierar någon förfrågningsmetod, läser Flash Player och Adobe AIR in innehållet med hjälp av HTTP GET -metoden. Om du vill skicka begäran med hjälp av POST -metoden anger du POST för egenskapen request.method med hjälp av den statiska konstanten URLRequestMethod.POST enligt koden nedan:
var request:URLRequest = new URLRequest("sendfeedback.cfm"); 
request.method = URLRequestMethod.POST;

Det externa dokumentet params.txt som läses in under körningen innehåller följande data:

monthNames=January,February,March,April,May,June,July,August,September,October,November,December&dayNames=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday

Filen innehåller två parametrar: monthNames och dayNames . Varje parameter innehåller en kommaavgränsad lista som analyseras som strängar. Du kan dela in listan i en array med hjälp av metoden String.split() .

Undvik reserverade ord eller språkkonstruktioner som variabelnamn i externa datafiler, eftersom det försvårar läsningen och felsökningen av din kod.
När data har lästs in skickas händelsen complete och innehållet i det externa dokumentet blir tillgängligt för användning i data -egenskapen för URLLoader som i följande kod:
function completeHandler(event) 
{ 
    var loader2 = event.target; 
    air.trace(loader2.data); 
}

Om fjärrdokumentet innehåller namnvärdespar kan du analysera data med hjälp av klassen URLVariables genom att ange innehållet i den inlästa filen enligt följande:

private function completeHandler(event:Event):void 
{ 
    var loader2:URLLoader = URLLoader(event.target); 
    var variables:URLVariables = new URLVariables(loader2.data); 
    trace(variables.dayNames); 
}

Varje namnvärdespar från den externa filen skapas som en egenskap i URLVariables-objektet. Varje egenskap i variabelobjektet i ovanstående kodexempel behandlas som en sträng. Om värdet i namnvärdesparet är en lista över objekt, kan du konvertera strängen till en array genom att anropa metoden String.split() enligt följande:

var dayNameArray:Array = variables.dayNames.split(",");
Om du läser in numeriska data från externa datafiler konverterar du värden till numeriska värden med hjälp av en högnivåfunktion, till exempel int() , uint() eller Number() .

I stället för att läsa in innehållet i fjärrfilen som en sträng och skapa ett nytt URLVariables-objekt, kan du ställa in egenskapen URLLoader.dataFormat på en av de statiska egenskaperna som finns i klassen URLLoaderDataFormat. Det finns tre möjliga värden för egenskapen URLLoader.dataFormat :

  • URLLoaderDataFormat.BINARY : Egenskapen URLLoader.data kommer att innehålla binära data lagrade i ett ByteArray-objekt.

  • URLLoaderDataFormat.TEXT : Egenskapen URLLoader.data kommer att innehålla text i ett String-objekt.

  • URLLoaderDataFormat.VARIABLES : Egenskapen URLLoader.data kommer att innehålla URL-kodade variabler lagrade i ett URLVariables-objekt.

Följande kod visar hur inställning av egenskapen URLLoader.dataFormat URLLoaderDataFormat.VARIABLES gör att du automatiskt kan analysera inlästa data till ett URLVariables-objekt:

package 
{ 
    import flash.display.Sprite; 
    import flash.events.*; 
    import flash.net.URLLoader; 
    import flash.net.URLLoaderDataFormat; 
    import flash.net.URLRequest; 
 
    public class URLLoaderDataFormatExample extends Sprite 
    { 
        public function URLLoaderDataFormatExample() 
        { 
            var request:URLRequest = new URLRequest("http://www.[yourdomain].com/params.txt"); 
            var variables:URLLoader = new URLLoader(); 
            variables.dataFormat = URLLoaderDataFormat.VARIABLES; 
            variables.addEventListener(Event.COMPLETE, completeHandler); 
            try 
            { 
                variables.load(request); 
            }  
            catch (error:Error) 
            { 
                trace("Unable to load URL: " + error); 
            } 
        } 
        private function completeHandler(event:Event):void 
        { 
        var loader:URLLoader = URLLoader(event.target); 
        trace(loader.data.dayNames); 
        } 
    } 
}
Obs! Standardvärdet för URLLoader.dataFormat är URLLoaderDataFormat.TEXT .

Som nedanstående exempel visar är inläsning av XML från en extern fil detsamma som att läsa in URLVariables. Du kan skapa en URLRequest-instans och en URLLoader-instans och sedan använda dem för att ladda ned ett XML-fjärrdokument. När filen har laddats ned skickas händelsen Event.COMPLETE och innehållet i den externa filen konverteras till en XML-instans, som du kan analysera med hjälp av XML-metoder och -egenskaper.

package 
{ 
    import flash.display.Sprite; 
    import flash.errors.*; 
    import flash.events.*; 
    import flash.net.URLLoader; 
    import flash.net.URLRequest; 
 
    public class ExternalDocs extends Sprite 
    { 
        public function ExternalDocs() 
        { 
            var request:URLRequest = new URLRequest("http://www.[yourdomain].com/data.xml"); 
            var loader:URLLoader = new URLLoader(); 
            loader.addEventListener(Event.COMPLETE, completeHandler); 
            try 
            { 
                loader.load(request); 
            } 
            catch (error:ArgumentError) 
            { 
                trace("An ArgumentError has occurred."); 
            } 
            catch (error:SecurityError) 
            { 
                trace("A SecurityError has occurred."); 
            } 
        } 
        private function completeHandler(event:Event):void 
        { 
            var dataXML:XML = XML(event.target.data); 
            trace(dataXML.toXMLString()); 
        } 
    } 
}

Kommunicera med externa skript

Klassen URLVariables kan inte bara användas för att läsa in externa filer. Du kan även använda den för att skicka variabler till ett skript på servern och för att bearbeta serverns svar. Det här är användbart om du till exempel programmerar ett spel och vill skicka användarens resultat till en server för att beräkna om resultatet ska läggas in i listan med bästa resultat, eller om en användares inloggningsinformation ska skickas till en server för validering. Ett skript på en server kan bearbeta användarnamnet och lösenordet, validera informationen mot en databas och sedan returnera en bekräftelse som anger om informationen är giltig.

Nedanstående utdrag skapar ett URLVariables-objekt med namnet variables , som skapar en ny variabel med namnet name . Sedan skapas ett URLRequest-objekt som anger webbadressen för skriptet på servern som variablerna ska skickas till. Sedan anger du egenskapen method för URLRequest-objektet så att variablerna skickas som en HTTP POST -begäran. Om du vill lägga till URLVariables-objektet till URL-begäran anger du det tidigare skapade URLVariables-objektet för URLRequest-objektets data -egenskap. Slutligen skapas URLLoader-instansen och metoden URLLoader.load() anropas, vilket initierar begäran.

var variables:URLVariables = new URLVariables("name=Franklin"); 
var request:URLRequest = new URLRequest(); 
request.url = "http://www.[yourdomain].com/greeting.cfm"; 
request.method = URLRequestMethod.POST; 
request.data = variables; 
var loader:URLLoader = new URLLoader(); 
loader.dataFormat = URLLoaderDataFormat.VARIABLES; 
loader.addEventListener(Event.COMPLETE, completeHandler); 
try 
{ 
    loader.load(request); 
} 
catch (error:Error) 
{ 
    trace("Unable to load URL"); 
} 
 
function completeHandler(event:Event):void 
{ 
    trace(event.target.data.welcomeMessage); 
}

Följande kod rymmer innehållet i Adobe ColdFusion®-dokumentet greeting.cfm från föregående exempel:

<cfif NOT IsDefined("Form.name") OR Len(Trim(Form.Name)) EQ 0> 
    <cfset Form.Name = "Stranger" /> 
</cfif> 
<cfoutput>welcomeMessage=#UrlEncodedFormat("Welcome, " & Form.name)# 
</cfoutput>