<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>blog.log2e.com &#187; Twitter</title>
	<atom:link href="http://blog.log2e.com/tag/twitter/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.log2e.com</link>
	<description>Tutorials and Code Snippets</description>
	<lastBuildDate>Tue, 25 May 2010 12:47:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Twitter, Flex and JSON</title>
		<link>http://blog.log2e.com/2008/05/25/twitter-flex-and-json/</link>
		<comments>http://blog.log2e.com/2008/05/25/twitter-flex-and-json/#comments</comments>
		<pubDate>Sun, 25 May 2008 16:36:19 +0000</pubDate>
		<dc:creator>Stefan Schmalhaus</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://blog.log2e.com/?p=32</guid>
		<description><![CDATA[There are libraries in several programming languages that provide access to the Twitter API. Although there&#8217;s an ActionScript 3 library for Twitter, in this tutorial we will be looking at how you can retrieve Twitter&#8217;s public timeline with a little help from another collection of ActionScript 3 utilities, the corelib library. The result of this [...]]]></description>
			<content:encoded><![CDATA[<p>There are libraries in several programming languages that provide access to the <a title="Twitter API" onclick="pageTracker._trackPageview('/outgoing/groups.google.com/group/twitter-development-talk/web/api-documentation?referer=');pageTracker._trackPageview('/outgoing/groups.google.com/group/twitter-development-talk/web/api-documentation?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=32&amp;message=4');" href="http://groups.google.com/group/twitter-development-talk/web/api-documentation" target="_blank">Twitter API</a>. Although there&#8217;s an ActionScript 3 library for Twitter, in this tutorial we will be looking at how you can retrieve Twitter&#8217;s public timeline with a little help from another collection of ActionScript 3 utilities, the <a title="corelib" onclick="pageTracker._trackPageview('/outgoing/code.google.com/p/as3corelib/?referer=');pageTracker._trackPageview('/outgoing/code.google.com/p/as3corelib/?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=32&amp;message=4');" href="http://code.google.com/p/as3corelib/" target="_blank">corelib</a> library. </p>
<p>The result of this tutorial can be <a title="Twitter Demo" onclick="pageTracker._trackPageview('/outgoing/blog.log2e.com/demos/twitter-flex-json/?referer=http://blog.log2e.com/wp-admin/edit.php');" href="http://blog.log2e.com/demos/twitter-flex-json/" target="_blank">seen here</a> (&#8220;View Source&#8221; is enabled).<br />
<span id="more-32"></span></p>
<h3>Twitter&#8217;s Public Timeline</h3>
<p>Twitter&#8217;s public timeline returns the 20 most recent statuses from non-protected users. The result is offered in four different formats (XML, JSON, RSS, Atom). The structure of the data can best be explored when we look at the XML representation of the &#8220;tweets&#8221; (Twitter speak for messages). Here&#8217;s a simplified view where the child nodes inside the status nodes have been removed:</p>
<div class="geshi no xml">
<ol>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span> <span class="re2">?&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;statuses</span> <span class="re0">type</span>=<span class="st0">&quot;array&quot;</span><span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;status<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;&#8230;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;/status<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;status<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;&#8230;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;/status<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;status<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;&#8230;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;/status<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;status<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;&#8230;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;/status<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;&#8230;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/statuses<span class="re2">&gt;</span></span></span></div>
</li>
</ol>
</div>
<p>A single status node looks like this:</p>
<div class="geshi no xml">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;status<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;created_at<span class="re2">&gt;</span></span></span>Sat May 24 17:29:46 +0000 2008<span class="sc3"><span class="re1">&lt;/created_at<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;id<span class="re2">&gt;</span></span></span>819102544<span class="sc3"><span class="re1">&lt;/id<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;text<span class="re2">&gt;</span></span></span>I also won interview in the pageant<span class="sc3"><span class="re1">&lt;/text<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;source<span class="re2">&gt;</span></span></span>web<span class="sc3"><span class="re1">&lt;/source<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;truncated<span class="re2">&gt;</span></span></span>false<span class="sc3"><span class="re1">&lt;/truncated<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;in_reply_to_status_id<span class="re2">&gt;</span></span></span><span class="sc3"><span class="re1">&lt;/in_reply_to_status_id<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;in_reply_to_user_id<span class="re2">&gt;</span></span></span><span class="sc3"><span class="re1">&lt;/in_reply_to_user_id<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;favorited<span class="re2">&gt;</span></span></span>false<span class="sc3"><span class="re1">&lt;/favorited<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;user<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;id<span class="re2">&gt;</span></span></span>3725701<span class="sc3"><span class="re1">&lt;/id<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;name<span class="re2">&gt;</span></span></span>Kelly King Anderson<span class="sc3"><span class="re1">&lt;/name<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;screen_name<span class="re2">&gt;</span></span></span>startupprincess<span class="sc3"><span class="re1">&lt;/screen_name<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;location<span class="re2">&gt;</span></span></span>Utah County<span class="sc3"><span class="re1">&lt;/location<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;description<span class="re2">&gt;</span></span></span>Mentor and Friend, Make a Wish, Make it Happen!<span class="sc3"><span class="re1">&lt;/description<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;profile_image_url<span class="re2">&gt;</span></span></span>http://s3.amazonaws.com/twitter_production/profile_images/19834292/7355f_web_normal.jpg<span class="sc3"><span class="re1">&lt;/profile_image_url<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;url<span class="re2">&gt;</span></span></span>http://www.startupprincess.com<span class="sc3"><span class="re1">&lt;/url<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;protected<span class="re2">&gt;</span></span></span>false<span class="sc3"><span class="re1">&lt;/protected<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;followers_count<span class="re2">&gt;</span></span></span>206<span class="sc3"><span class="re1">&lt;/followers_count<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/user<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;/status<span class="re2">&gt;</span></span></span></div>
</li>
</ol>
</div>
<p>As you can see, the status node contains a user node which itself has several child nodes.</p>
<h3><em>corelib</em>&#8216;s JSON Class</h3>
<p>Of course, you could use ActionScript&#8217;s XML capabilities to manipulate and further process the XML data. In this tutorial though, we want to make use of the JSON class which is part of the ActionScript 3 <em>corelib</em> library and which facilitates both serialization and deserialization of JSON data.</p>
<p><a title="corelib" onclick="pageTracker._trackPageview('/outgoing/code.google.com/p/as3corelib/?referer=');pageTracker._trackPageview('/outgoing/code.google.com/p/as3corelib/?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=32&amp;message=4');" href="http://code.google.com/p/as3corelib/" target="_blank">Download the corelib library</a> and make the <em>corelib.swc</em> file available to your Flex project. The JSON class is inside the <em>com.adobe.serialization.json</em> package. The class provides two static methods, <code>encode()</code> and <code>decode()</code>. The <code>decode()</code> method reads a JSON string and returns a native object as specified by the input string.</p>
<h3>Creating the Demo Application</h3>
<p>Our demo displays the public timeline in a datagrid. Here&#8217;s the code with some explanations below:</p>
<div class="geshi actionscript">
<ol>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>mx:Application xmlns:mx=<span class="st0">&quot;http://www.adobe.com/2006/mxml&quot;</span> xmlns=<span class="st0">&quot;*&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;layout=<span class="st0">&quot;absolute&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;creationComplete=<span class="st0">&quot;onCreationComplete()&quot;</span><span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sy0">&lt;</span>mx:Script<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="sy0">&lt;!</span><span class="br0">&#91;</span>CDATA<span class="br0">&#91;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">import</span> mx.<span class="me1">collections</span>.<span class="me1">ArrayCollection</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">import</span> mx.<span class="me1">rpc</span>.<span class="me1">http</span>.<span class="me1">HTTPService</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">import</span> mx.<span class="me1">rpc</span>.<span class="me1">events</span>.<span class="me1">ResultEvent</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">import</span> mx.<span class="me1">rpc</span>.<span class="me1">events</span>.<span class="me1">FaultEvent</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">import</span> mx.<span class="me1">formatters</span>.<span class="me1">DateFormatter</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">import</span> com.<span class="me1">adobe</span>.<span class="me1">serialization</span>.<span class="me1">json</span>.<span class="me1">JSON</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>Bindable<span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">private</span> <span class="kw2">var</span> publicTimeline:ArrayCollection;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">private</span> <span class="kw2">function</span> onCreationComplete<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; loadPublicTimeline<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">private</span> <span class="kw2">function</span> loadPublicTimeline<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; twitterService.<span class="kw3">send</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">private</span> <span class="kw2">function</span> onPublicTimelineResult<span class="br0">&#40;</span> event:ResultEvent <span class="br0">&#41;</span>:<span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> rawData:<span class="kw3">String</span> = <span class="kw3">String</span><span class="br0">&#40;</span> event.<span class="me1">result</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> arr:<span class="kw3">Array</span> = JSON.<span class="me1">decode</span><span class="br0">&#40;</span> rawData <span class="br0">&#41;</span> as <span class="kw3">Array</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; publicTimeline = <span class="kw2">new</span> ArrayCollection<span class="br0">&#40;</span> arr <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">private</span> <span class="kw2">function</span> onPublicTimelineFault<span class="br0">&#40;</span> event:FaultEvent <span class="br0">&#41;</span>:<span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">trace</span><span class="br0">&#40;</span> event.<span class="me1">fault</span>.<span class="kw3">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">private</span> <span class="kw2">function</span> getFormattedDate<span class="br0">&#40;</span> item:<span class="kw3">Object</span>, column:DataGridColumn <span class="br0">&#41;</span>:<span class="kw3">String</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> dateFormatter:DateFormatter = <span class="kw2">new</span> DateFormatter<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dateFormatter.<span class="me1">formatString</span> = <span class="st0">&quot;MMMM D, YYYY, J:NN:SS&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> dateFormatter.<span class="me1">format</span><span class="br0">&#40;</span> item.<span class="me1">created_at</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">private</span> <span class="kw2">function</span> getScreenName<span class="br0">&#40;</span> item:<span class="kw3">Object</span>, column:DataGridColumn <span class="br0">&#41;</span>:<span class="kw3">String</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> item.<span class="me1">user</span>.<span class="me1">screen_name</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span> &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#93;</span><span class="br0">&#93;</span><span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sy0">&lt;/</span>mx:Script<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sy0">&lt;</span>mx:HTTPService</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; id=<span class="st0">&quot;twitterService&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">url</span>=<span class="st0">&quot;http://twitter.com/statuses/public_timeline.json&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; resultFormat=<span class="st0">&quot;text&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; result=<span class="st0">&quot;onPublicTimelineResult(event)&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; fault=<span class="st0">&quot;onPublicTimelineFault(event)&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; showBusyCursor=<span class="st0">&quot;true&quot;</span> <span class="sy0">/&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sy0">&lt;</span>mx:VBox <span class="kw3">width</span>=<span class="st0">&quot;100%&quot;</span> <span class="kw3">height</span>=<span class="st0">&quot;100%&quot;</span> paddingBottom=<span class="st0">&quot;20&quot;</span> paddingLeft=<span class="st0">&quot;20&quot;</span> paddingRight=<span class="st0">&quot;20&quot;</span> paddingTop=<span class="st0">&quot;20&quot;</span><span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="sy0">&lt;</span>mx:Label <span class="kw3">text</span>=<span class="st0">&quot;Twitter Demo&quot;</span> fontSize=<span class="st0">&quot;20&quot;</span> fontWeight=<span class="st0">&quot;bold&quot;</span> <span class="sy0">/&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="sy0">&lt;</span>mx:DataGrid dataProvider=<span class="st0">&quot;{ publicTimeline }&quot;</span> <span class="kw3">width</span>=<span class="st0">&quot;100%&quot;</span> rowCount=<span class="st0">&quot;20&quot;</span><span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">&lt;</span>mx:columns<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">&lt;</span>mx:DataGridColumn <span class="kw3">width</span>=<span class="st0">&quot;200&quot;</span> headerText=<span class="st0">&quot;Created&quot;</span> labelFunction=<span class="st0">&quot;getFormattedDate&quot;</span> <span class="sy0">/&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">&lt;</span>mx:DataGridColumn <span class="kw3">width</span>=<span class="st0">&quot;200&quot;</span> headerText=<span class="st0">&quot;Screen Name&quot;</span> labelFunction=<span class="st0">&quot;getScreenName&quot;</span> <span class="sy0">/&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">&lt;</span>mx:DataGridColumn headerText=<span class="st0">&quot;Tweet&quot;</span> dataField=<span class="st0">&quot;text&quot;</span> <span class="sy0">/&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">&lt;/</span>mx:columns<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="sy0">&lt;/</span>mx:DataGrid<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="sy0">&lt;</span>mx:<span class="kw3">Button</span> label=<span class="st0">&quot;Refresh&quot;</span> <span class="kw3">width</span>=<span class="st0">&quot;100&quot;</span> <span class="kw3">height</span>=<span class="st0">&quot;30&quot;</span> click=<span class="st0">&quot;loadPublicTimeline()&quot;</span> <span class="sy0">/&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sy0">&lt;/</span>mx:VBox<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;/</span>mx:Application<span class="sy0">&gt;</span></div>
</li>
</ol>
</div>
<p><strong>Lines 14-15</strong>: Twitter&#8217;s public timeline data is converted into an <code>ArrayCollection</code> which in turn serves as a bindable dataprovider that is used to populate the datagrid.</p>
<p><strong>Lines 22-25</strong>: The <code>loadPublicTimeline()</code> method invokes the <code>send()</code> method on the <code>HTTPService</code> object <code>twitterService</code>.</p>
<p><strong>Lines 27-32</strong>: The payload of the result event contains the JSON string that has been returned by the Twitter API. The <code>decode()</code> method converts it into an array of generic objects. The array itself is wrapped into an <code>ArrayCollection</code>.</p>
<p><strong>Lines 39-44</strong>: This is a helper function that formats the date/time value of the <code>created_at</code> field.</p>
<p><strong>Lines 46-49</strong>: This is another helper function that retrieves the <code>screen_name</code> value from the Twitter user. Please note that the <code>user</code> object is nested inside the <code>status</code> object (see the XML code above). The <code>user</code> object can be accessed with the usual dot syntax.</p>
<p><strong>Lines 54-60</strong>: The <code>HTTPService</code> instance that retrieves the public timeline from Twitter&#8217;s official API URL (for more details please refer to the <a title="Twitter API" onclick="pageTracker._trackPageview('/outgoing/groups.google.com/group/twitter-development-talk/web/api-documentation?referer=');pageTracker._trackPageview('/outgoing/groups.google.com/group/twitter-development-talk/web/api-documentation?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=32&amp;message=4');" href="http://groups.google.com/group/twitter-development-talk/web/api-documentation" target="_blank">Twitter API documentation</a>).</p>
<p><a title="Twitter Demo" onclick="pageTracker._trackPageview('/outgoing/blog.log2e.com/demos/twitter-flex-json/?referer=http://blog.log2e.com/wp-admin/edit.php');" href="http://blog.log2e.com/demos/twitter-flex-json/" target="_blank">View the demo application.</a></p>
<h3>Security Restrictions</h3>
<p>If you recreate this demo application in FlexBuilder, everything should be working fine as long as you run it from your local machine. If you put the files on your server though, you will be experiencing the &#8220;Security error accessing url&#8221; error. The reason is Twitter&#8217;s cross-domain policy. If you look at <a title="crossdomain.xml" onclick="pageTracker._trackPageview('/outgoing/twitter.com/crossdomain.xml?referer=');pageTracker._trackPageview('/outgoing/twitter.com/crossdomain.xml?referer=http://blog.log2e.com/wp-admin/post.php?action=edit&amp;post=32&amp;message=4');" href="http://twitter.com/crossdomain.xml" target="_blank">Twitter&#8217;s crossdomain.xml file</a>, you notice that it allows access only from a very few domains.</p>
<p>Here&#8217;s what you have to do to get around this restriction: Replace the URL in line 56 </p>
<p><em>http://twitter.com/statuses/public_timeline.json</em></p>
<p>with a URL that points to a PHP proxy file on your server:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Cache-Control: no-cache, must-revalidate&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> </div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Expires: Mon, 26 Jul 1997 05:00:00 GMT&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> </div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$dataUrl</span> <span class="sy0">=</span> <span class="st0">&quot;http://twitter.com/statuses/public_timeline.json?&quot;</span> <span class="sy0">.</span> <span class="kw3">microtime</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">readfile</span><span class="br0">&#40;</span><span class="re1">$dataUrl</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<p>The PHP script simply reads the data from Twitter and writes it to the output buffer (the file header settings and <code>microtime()</code> are used to prevent caching).</p>
<p>I hope you enjoyed the tutorial. If you have any thoughts or suggestions, feel free to leave a comment below.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.log2e.com/2008/05/25/twitter-flex-and-json/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
	</channel>
</rss>

