microblog actionscript API

package com.sina.microblog
{
    import com.adobe.crypto.HMAC;
    import com.adobe.crypto.SHA1;
    import com.dynamicflash.util.Base64;
    import com.sina.microblog.data.MicroBlogComment;
    import com.sina.microblog.data.MicroBlogCount;
    import com.sina.microblog.data.MicroBlogDirectMessage;
    import com.sina.microblog.data.MicroBlogProfileUpdateParams;
    import com.sina.microblog.data.MicroBlogRateLimit;
    import com.sina.microblog.data.MicroBlogStatus;
    import com.sina.microblog.data.MicroBlogUser;
    import com.sina.microblog.data.MicroBlogUsersRelationship;
    import com.sina.microblog.events.MicroBlogErrorEvent;
    import com.sina.microblog.events.MicroBlogEvent;
    import com.sina.microblog.utils.GUID;
    import com.sina.microblog.utils.StringEncoders;
    import com.ut.nm_test_internal;

    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.events.IOErrorEvent;
    import flash.events.SecurityErrorEvent;
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.net.URLRequestHeader;
    import flash.net.URLRequestMethod;
    import flash.net.URLVariables;
    import flash.net.getClassByAlias;
    import flash.net.navigateToURL;
    import flash.system.ApplicationDomain;
    import flash.system.Capabilities;
    import flash.utils.ByteArray;
    import flash.utils.Dictionary;
    import flash.utils.Endian;
    import flash.utils.getDefinitionByName;

    use namespace nm_test_internal;

    /**
     *  当OAuth过程发生错误时触发该事件.
     *
     *  <p>当consumerKey和consumerSecret不为空时,使用OAuth方式进行认证</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="oauthCertifcateError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当加载公共微博消息成功时触发该事件.
     *
     *  <p>调用loadPublicTimeLine成功时,事件的<code>result</code>属性为一个<code>MicroBlogStatus</code>
     *  对象数组.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadPublicTimeLineResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当加载公共微博消息失败时触发该事件.
     *
     *  <p>调用loadPublicTimeLine失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadPublicTimeLineError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当加载用户所有关注的用户最新的n条微博消息成功时触发该事件.
     *
     *  <p>调用loadFriendsTimeLine成功时,事件的<code>result</code>属性为一个<code>MicroBlogStatus</code>
     *  对象数组.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadFriendsTimeLineResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当加载用户所有关注的用户最新的n条微博消息失败时触发该事件.
     *
     *  <p>调用loadFriendsTimeLine失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadFriendsTimeLineError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当加载指定用户的微博消息成功时触发该事件.
     *
     *  <p>调用loadUserTimeLine成功时,事件的<code>result</code>属性为一个<code>MicroBlogStatus</code>
     *  对象数组.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadUserTimeLineResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当加载指定用户的微博消息失败时触发该事件.
     *
     *  <p>调用loadUserTimeLine失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadUserTimeLineError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当加载提及博主的微博消息成功时触发该事件.
     *
     *  <p>调用loadMensions成功时,事件的<code>result</code>属性为一个<code>MicroBlogStatus</code>
     *  对象数组.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadMensionsResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当加载指定用户的微博消息失败时触发该事件.
     *
     *  <p>调用loadMensions失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadMensionsError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当加载对博主所发微博消息的评论成功时触发该事件.
     *
     *  <p>调用loadCommentsTimeline成功时,事件的<code>result</code>属性为一个<code>MicroBlogComment</code>
     *  对象数组.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadCommentsTimelineResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当加载指定用户的微博消息失败时触发该事件.
     *
     *  <p>调用loadMensions失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadCommentsTimelineError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当加载博主所发表评论成功时触发该事件.
     *
     *  <p>调用loadMyComments成功时,事件的<code>result</code>属性为一个<code>MicroBlogComment</code>
     *  对象数组.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadMyCommentsResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当加载博主所发表评论失败时触发该事件.
     *
     *  <p>调用loadMyComments失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadMyCommentsError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当加载对微博消息的评论成功时触发该事件.
     *
     *  <p>调用loadComments成功时,事件的<code>result</code>属性为一个<code>MicroBlogComment</code>
     *  对象数组.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadCommentsResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当加载对微博消息的评论失败时触发该事件.
     *
     *  <p>调用loadComments失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadCommentsError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当加载微博消息相关统计数据成功时触发该事件.
     *
     *  <p>调用loadStatusCounts成功时,事件的<code>result</code>属性为一个<code>MicroBlogCount</code>
     *  对象数组.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadStatusCountsResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当加载微博消息相关统计数据失败时触发该事件.
     *
     *  <p>调用loadStatusCounts失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadStatusCountsError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当发布微博消息成功时触发该事件.
     *
     *  <p>调用updateStatus成功时,事件的<code>result</code>属性为刚发布的<code>MicroBlogStatus</code>
     *  对象.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="updateStatusResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当发布微博消息失败时触发该事件.
     *
     *  <p>调用updateStatus失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="updateStatusError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当删除微博消息成功时触发该事件.
     *
     *  <p>调用deleteStatus成功时,事件的<code>result</code>属性为被删除的<code>MicroBlogStatus</code>
     *  对象.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="deleteStatusResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当删除微博消息失败时触发该事件.
     *
     *  <p>调用deleteStatus失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="deleteStatusError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当加载某个微博消息成功时触发该事件.
     *
     *  <p>调用loadStatusInfo成功时,事件的<code>result</code>属性为<code>MicroBlogStatus</code>
     *  对象.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadStatusInfoResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当加载某个微博消息失败时触发该事件.
     *
     *  <p>调用loadStatusInfo失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadStatusInfoError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当删除某个微博消息评论成功时触发该事件.
     *
     *  <p>调用deleteComment成功时,事件的<code>result</code>属性为<code>MicroBlogComment</code>
     *  对象.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="deleteCommentResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当删除某个微博消息评论失败时触发该事件.
     *
     *  <p>调用deleteComment失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="deleteCommentError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当评论某个微博消息成功时触发该事件.
     *
     *  <p>调用commentStatus成功时,事件的<code>result</code>属性为<code>MicroBlogComment</code>
     *  对象.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="commentStatusResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当评论某个微博消息失败时触发该事件.
     *
     *  <p>调用commentStatus失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="commentStatusError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当转发某个微博消息成功时触发该事件.
     *
     *  <p>调用repostStatus成功时,事件的<code>result</code>属性为<code>MicroBlogStatus</code>
     *  对象.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="repostStatusResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当转发某个微博消息失败时触发该事件.
     *
     *  <p>调用repostStatus失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="repostStatusError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当回复某个微博评论成功时触发该事件.
     *
     *  <p>调用replyStatus成功时,事件的<code>result</code>属性为<code>MicroBlogStatus</code>
     *  对象.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="replyStatusResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当回复某个微博评论失败时触发该事件.
     *
     *  <p>调用replyStatus失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="replyStatusError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当加载接收到的私信列表成功时触发该事件.
     *
     *  <p>调用loadDirectMessagesReceived成功时,事件的<code>result</code>属性为<code>MicroBlogDirectMessage</code>
     *  对象数组.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadDirectMessagesReceivedResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当加载接收到的私信列表失败时触发该事件.
     *
     *  <p>调用loadDirectMessagesReceived失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadDirectMessagesReceivedError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当加载发出的私信列表成功时触发该事件.
     *
     *  <p>调用loadDirectMessagesSent成功时,事件的<code>result</code>属性为<code>MicroBlogDirectMessage</code>
     *  对象数组.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadDicrectMessagesSentResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当加载发出的私信列表失败时触发该事件.
     *
     *  <p>调用loadDirectMessagesSent失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadDicrectMessagesSentError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当删除私信成功时触发该事件.
     *
     *  <p>调用deleteDirectMessage成功时,事件的<code>result</code>属性为被删除的<code>MicroBlogDirectMessage</code>
     *  对象.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="deleteDirectMessageResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当删除私信失败时触发该事件.
     *
     *  <p>调用deleteDirectMessage失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="deleteDirectMessageError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当发送私信成功时触发该事件.
     *
     *  <p>调用sendDirectMessage成功时,事件的<code>result</code>属性<code>MicroBlogDirectMessage</code>
     *  对象.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="sendDirectMessageResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当发送私信失败时触发该事件.
     *
     *  <p>调用deleteDirectMessage失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="sendDirectMessageSentError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当加载指定用户信息成功时触发该事件.
     *
     *  <p>调用loadUserInfo成功时,事件的<code>result</code>属性<code>MicroBlogUser</code>
     *  对象.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadUserInfoResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当加载指定用户信息失败时触发该事件.
     *
     *  <p>调用loadUserInfo失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadUserInfoError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当加载用户关注的博主列表成功时触发该事件.
     *
     *  <p>调用loadFriendsInfo成功时,事件的<code>result</code>属性<code>MicroBlogUser</code>
     *  对象数组.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadFriendsInfoResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当加载用户关注的博主列表失败时触发该事件.
     *
     *  <p>调用loadFriendsInfo失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadFriendsInfoError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当加载关注用户的博主列表成功时触发该事件.
     *
     *  <p>调用loadFollowersInfo成功时,事件的<code>result</code>属性<code>MicroBlogUser</code>
     *  对象数组.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadFollowersInfoResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当加载关注用户的博主列表失败时触发该事件.
     *
     *  <p>调用loadFollowersInfo失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadFollowersInfoError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当关注某博主成功时触发该事件.
     *
     *  <p>调用follow成功时,事件的<code>result</code>属性<code>MicroBlogUser</code>
     *  对象.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="followResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当关注某博主失败时触发该事件.
     *
     *  <p>调用follow失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="followError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当取消关注某博主成功时触发该事件.
     *
     *  <p>调用cancelFollowing成功时,事件的<code>result</code>属性<code>MicroBlogUser</code>
     *  对象.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="cancelFollowingResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当取消关注某博主失败时触发该事件.
     *
     *  <p>调用cancelFollowing失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="cancelFollowingError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当查询两个微博用户关系成功返回时触发该事件.
     *
     *  <p>调用checkIsFollowing成功时,事件的<code>result</code>属性<code>MicroBlogRelationship</code>
     *  对象.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="checkIsFollowingResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当查询两个微博用户关系失败时触发该事件.
     *
     *  <p>调用checkIsFollowing失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="checkIsFollowingError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当加载博主关注的用户id列表成功时触发该事件.
     *
     *  <p>调用loadFriendsIDList成功时,事件的<code>result</code>属性<code>uint</code>
     *  数组.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadFriendsIDListResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当加载博主关注的用户id列表失败时触发该事件.
     *
     *  <p>调用loadFriendsIDList失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadFriendsIDListError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当加关注载博主的用户id列表成功时触发该事件.
     *
     *  <p>调用loadFollowersIDList成功时,事件的<code>result</code>属性<code>uint</code>
     *  数组.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadFollowersIDListResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当加载关注博主的用户id列表失败时触发该事件.
     *
     *  <p>调用loadFollowersIDList失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadFollowersIDListError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当验证用户信息成功和登陆成功时触发该事件.
     *
     *  <p>调用verifyCrendentials成功时,事件的<code>result</code>属性<code>MicroBlogUser</code>
     *  对象.</p>
     *  <p>注意:当使用Basic方式验证的时候调用login成功时也会触发该事件</p>
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="verifyCredentialsResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当验证用户信息失败时触发该事件.
     *
     *  <p>调用verifyCrendentials失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="verifyCredentialsError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当获取调用速率限制信息成功时触发该事件.
     *
     *  <p>调用getRateLimitStatus成功时,事件的<code>result</code>属性<code>MicroBlogUser</code>
     *  数组.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="getRateLimitStatusResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当获取调用速率限制信息失败时触发该事件.
     *
     *  <p>调用getRateLimitStatus失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="getRateLimitStatusError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当用户成功注销时触发该事件.
     *
     *  <p>调用logout成功时,事件的<code>result</code>属性<code>MicroBlogRateLimit</code>
     *  数组.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="logoutResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当用户注销失败时触发该事件.
     *
     *  <p>调用logout失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="logoutError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当更新用户信息成功时触发该事件.
     *
     *  <p>调用updateProfile成功时,事件的<code>result</code>属性<code>MicroBlogUser</code>
     *  对象.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="updateProfileResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当更新用户信息失败时触发该事件.
     *
     *  <p>调用updateProfile失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="updateProfileError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当更新用户头像成功时触发该事件.
     *
     *  <p>调用updateProfileImage成功时,事件的<code>result</code>属性<code>MicroBlogUser</code>
     *  对象.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="updateProfileImageResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当更新用户头像失败时触发该事件.
     *
     *  <p>调用updateProfileImage失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="updateProfileImageError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当加载用户收藏列表成功时触发该事件.
     *
     *  <p>调用loadFavoriteList成功时,事件的<code>result</code>属性<code>MicroBlogStatus</code>
     *  对象数组.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadFavoriteListResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当加载用户收藏列表失败时触发该事件.
     *
     *  <p>调用loadFavoriteList失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadFavoriteListError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当收藏微博消息成功时触发该事件.
     *
     *  <p>调用addToFavorites成功时,事件的<code>result</code>属性<code>MicroBlogStatus</code>
     *  对象.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="addToFavoritesResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当收藏微博消息失败时触发该事件.
     *
     *  <p>调用addToFavorites失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="addToFavoritesError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当将微博消息移出收藏列表成功时触发该事件.
     *
     *  <p>调用removeFromFavorites成功时,事件的<code>result</code>属性<code>MicroBlogStatus</code>
     *  对象.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="removeFromFavoritesResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当将微博消息移出收藏列表失败时触发该事件.
     *
     *  <p>调用addToFavorites失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="removeFromFavoritesError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当允许/不允许某用户通知成功时触发该事件.
     *
     *  <p>调用enableNotification成功时,事件的<code>result</code>属性<code>MicroBlogUser</code>
     *  对象.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="enableNotificationResult", type="com.sina.microblog.events.MicroBlogEvent")]
    /**
     *  当允许/不允许某用户通知失败时触发该事件.
     *
     *  <p>调用enableNotification失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="enableNotificationError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当请求省份,城市与id对应列表成功时触发该事件.
     *
     *  <p>调用loadProvinceCityIDList成功时,事件的<code>result</code>属性<code>XML</code>
     *  对象.</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadProvinceCityIdListResult", type="flash.events.MicroBlogEvent")]
    /**
     *  当请求省份,城市与id对应列表失败时触发该事件.
     *
     *  <p>调用loadProvinceCityIDList失败时,事件的<code>message</code>为失败原因描述</p>
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="loadProvinceCityIdListError", type="com.sina.microblog.events.MicroBlogErrorEvent")]

    /**
     *  当请求未被验证,服务器调用产生安全错误时触发该事件.
     *
     *  @see flash.events.SecurityErrorEvent
     *
     *  @langversion 3.0
     *  @productversion MicroBlog-API
     */
    [Event(name="securityError", type="flash.events.SecurityErrorEvent")]

    /**
     * MicroBlog是新浪微博AS3 API的核心类.
     *
     * <p>其主要功能包括:</br>
     * <ul>
     * <li>封装核心的平台API</li>
     * <li>封装了两种用户认证方式:用户名/密码和OAuth方式</li>
     * <li>使用事件来返回API调用结果</li>
     * <li>对API调用的结果(XML)进行强类型的封装</li>
     * </ul>
     * 一般情况下,当一个API调用成功时,将会抛出一个<b>MicroBlogEvent</b>事件,而调用失败将会抛出<b>MicroBlogErrorEvent</b>事件。</br>
     * 具体事件类型请参照函数说明文档。
     * </p>
     * <p>
     * <b>例1 使用用户名密码进行用户认证</b>
     * <pre><br/>
     * private var mb:MicroBlog = new MicroBlog();
     * public function init():void
     * {
     *         mb.login(username, password);
     * }</pre>
     * </p>
     * <p>
     * <b>例2 使用OAuth进行认证</b>
     * <pre><br/>
     * private var mb:MicroBlog = new MicroBlog();
     * public function init():void
     * {
     *         mb.consumerKey = xxxxxx;
     *         mb.consumerSecret = xxxxxx;
     *         if ( accessTokenKey && accessTokenSecret )
     *         //如果保存了用户认证过的Token,则不需要登陆,也不需要pin_onClick的调用过程
     *         {
     *             mb.accessTokenKey = accessTokenKey;
     *             mb.accessTokenSecret = accessTokenSecret;
     *         } else
     *         {
     *             mb.login();
     *         }
     * }
     * //当用户在网页上认证了该请求以后
     * private function pin_onClick():void
     * {
     *         mb.pin = xxxxx;//如果不使用pin码,将pin置为空即可mb.pin="";
     * }
     * //然后就可以访问微博数据了
     * </pre>
     * </p>
     * <p>
     * <b>例3 一个典型的服务器调用过程,包括调用api,监听事件</b>
     * <pre><br/>
     * private var mb:MicroBlog = new MicroBlog();
     * private function initListeners():void
     * {
     *         mb.addEventListener(MicroBlogEvent.LOAD_PUBLIC_TIMELINE_RESULT, mb_onPublicTimeline, false, 0, true);
     *         mb.addEventListener(MicroBlogErrorEvent.LOAD_PUBLIC_TIMELINE_ERROR, mb_onError, false, 0, true);
     * }
     * public function loadPublicTimeline():void
     * {
     *         mb.loadPublicTimeline();
     * }
     * private function mb_onPublicTimeline(event:MicroBlogEvent):void
     * {
     *         //处理成功返回的数据
     *         var data:Array = event.result;
     *         xxxxxx
     * }
     * private function mb_onError(event:MicroBlogErrorEvent):void
     * {
     *         var msg:String = event.message;
     *         xxxxxxx
     * }
     * </pre>
     * </p>
     *
     */
    public class MicroBlog extends EventDispatcher
    {

        private static const API_BASE_URL:String="http://api.t.sina.com.cn/";

        private static const OAUTH_REQUEST_TOKEN_REQUEST_URL:String=API_BASE_URL + "oauth/request_token";
        //private static const OAUTH_REQUEST_TOKEN_REQUEST_URL:String="http://twitter.com/oauth/request_token";
        private static const OAUTH_AUTHORIZE_REQUEST_URL:String=API_BASE_URL + "oauth/authorize";
        private static const OAUTH_ACCESS_TOKEN_REQUEST_URL:String=API_BASE_URL + "oauth/access_token";

        private static const PUBLIC_TIMELINE_REQUEST_URL:String=API_BASE_URL + "statuses/public_timeline.xml";
        private static const FRIENDS_TIMELINE_REQUEST_URL:String=API_BASE_URL + "statuses/friends_timeline.xml";
        private static const USER_TIMELINE_REQUEST_URL:String=API_BASE_URL + "statuses/user_timeline$user.xml";
        private static const MENTIONS_REQUEST_URL:String=API_BASE_URL + "statuses/mentions.xml";
        private static const COMMENTS_TIMELINE_REQUEST_URL:String=API_BASE_URL + "statuses/comments_timeline.xml";
        private static const COMMENTS_BY_ME_REQUEST_URL:String=API_BASE_URL + "statuses/comments_by_me.xml";
        private static const COMMENTS_REQUEST_URL:String=API_BASE_URL + "statuses/comments.xml";
        private static const STATUS_COUNTS_REQUEST_URL:String=API_BASE_URL + "statuses/counts.xml";

        private static const UPDATE_STATUS_REQUEST_URL:String=API_BASE_URL + "statuses/update.xml";
        private static const UPDATE_STATUS_WITH_IMAGE_REQUEST_URL:String=API_BASE_URL + "statuses/upload.xml";
        private static const SHOW_STATUS_REQUEST_URL:String=API_BASE_URL + "statuses/show/$id.xml";
        private static const DELETE_STATUS_REQUEST_URL:String=API_BASE_URL + "statuses/destroy/$id.xml";
        private static const COMMENT_STATUS_REQUEST_URL:String=API_BASE_URL + "statuses/comment.xml";
        private static const DELETE_COMMENT_REQUEST_URL:String=API_BASE_URL + "statuses/comment_destroy/$id.xml";
        private static const REPOST_STATUS_REQUEST_URL:String=API_BASE_URL + "statuses/repost.xml";
        private static const REPLY_STATUS_REQUEST_URL:String=API_BASE_URL + "statuses/reply.xml";

        private static const LOAD_DIRECT_MESSAGES_RECEIVED_REQUEST_URL:String=API_BASE_URL + "direct_messages.xml";
        private static const LOAD_DIRECT_MESSAGES_SENT_REQUEST_URL:String=API_BASE_URL + "direct_messages/sent.xml";
        private static const SEND_DIRECT_MESSAGE_REQUEST_URL:String=API_BASE_URL + "direct_messages/new.xml";
        private static const DELETE_DIRECT_MESSAGE_REQUEST_URL:String=API_BASE_URL + "direct_messages/destroy/$id.xml";

        private static const LOAD_USER_INFO_REQUEST_URL:String=API_BASE_URL + "users/show$user.xml";
        private static const LOAD_FRIENDS_INFO_REQUEST_URL:String=API_BASE_URL + "statuses/friends$user.xml";
        private static const LOAD_FOLLOWERS_INFO_REQUEST_URL:String=API_BASE_URL + "statuses/followers$user.xml";

        private static const FOLLOW_REQUEST_URL:String=API_BASE_URL + "friendships/create$user.xml";
        private static const CANCEL_FOLLOWING_REQUEST_URL:String=API_BASE_URL + "friendships/destroy$user.xml";
        private static const CHECK_IS_FOLLOWING_REQUEST_URL:String=API_BASE_URL + "friendships/show.xml";

        private static const LOAD_FRIENDS_ID_LIST_REQUEST_URL:String=API_BASE_URL + "friends/ids$user.xml";
        private static const LOAD_FOLLOWERS_ID_LIST_REQUEST_URL:String=API_BASE_URL + "followers/ids$user.xml";

        private static const VERIFY_CREDENTIALS_REQUEST_URL:String=API_BASE_URL + "account/verify_credentials.xml";
        private static const GET_RATE_LIMIT_STATUS_REQUEST_URL:String=API_BASE_URL + "account/rate_limit_status.xml";
        private static const LOGOUT_REQUEST_URL:String=API_BASE_URL + "account/end_session.xml";
        private static const UPDATE_PROFILE_IMAGE_REQUEST_URL:String=API_BASE_URL + "account/update_profile_image.xml";
        private static const UPDATE_PROFILE_REQUEST_URL:String=API_BASE_URL + "account/update_profile.xml";

        private static const LOAD_FAVORITE_LIST_REQUEST_URL:String=API_BASE_URL + "favorites.xml";
        private static const ADD_TO_FAVORITES_REQUEST_URL:String=API_BASE_URL + "favorites/create.xml";
        private static const REMOVE_FROM_FAVORITES_REQUEST_URL:String=API_BASE_URL + "favorites/destroy/$id.xml";

        private static const ENABLE_NOTIFICATION_REQUEST_URL:String=API_BASE_URL + "notifications/$enabled$user.xml";

        private static const LOAD_PROVINCE_CITY_ID_LIST:String=API_BASE_URL + "provinces.xml";
//        private static const VERIFY_CREDENTIALS:String = "1";
//        private static const LOGOUT:String = "2";

        private static const USER_ID:String="user_id";
        private static const SCREEN_NAME:String="screen_name";
        private static const SINCE_ID:String="since_id";
        private static const MAX_ID:String="max_id";
        private static const COUNT:String="count";
        private static const PAGE:String="page";
        private static const ROLE:String="role";
        private static const ID:String="id";
        private static const CURSOR:String="cursor";
        private static const FOLLOW:String="follow";
        private static const SOURCE_ID:String="source_id";
        private static const SOURCE_SCREEN_NAME:String="source_screen_name";
        private static const TARGET_ID:String="target_id";
        private static const TARGET_SCREEN_NAME:String="target_screen_name";

        private static const MULTIPART_FORMDATA:String="multipart/form-data; boundary=";
        private static const CONTENT_DISPOSITION_BASIC:String=‘Content-Disposition: form-data; name="$name"‘;

        private static const CONTENT_TYPE_JPEG:String="Content-Type: image/pjpeg";
        private static const CONTENT_TRANSFER_ENCODING:String="Content-Transfer-Encoding: binary";

        private static const SOURCE_ADOBE_AIR_CLIENT:String = "Adobe Air Client";
        private var _consumerKey:String="";
        private var _consumerSecret:String="";
        private var _accessTokenKey:String="";
        private var _accessTokenSecret:String="";
        private var _pin:String="";
        private var _source:String = SOURCE_ADOBE_AIR_CLIENT;
        private var authHeader:URLRequestHeader;

        private var serviceLoader:Dictionary=new Dictionary();
        private var loaderMap:Dictionary=new Dictionary();

        private var oauthLoader:URLLoader;

        /**
         * @private Used for test purpose.
         */
        nm_test_internal var lastLoader:URLLoader;
        nm_test_internal var lastRequest:URLRequest;

        public function MicroBlog()
        {

        }

        /**
         * consumerKey是一个只写属性,用于验证客户端的合法性,
         * 必须在调用login之前将其设置为合适值.
         */
        public function set consumerKey(value:String):void
        {
            if ( value )
            {
                _consumerKey=value;
            } else
            {
                _consumerKey = "";
            }
        }

        /**
         * consumerSecret是一个只写属性,用于和consumerKey一起验证客户端的合法性,
         * 必须在调用login之前将其设置为合适值.
         */
        public function set consumerSecret(value:String):void
        {
            if ( value )
            {
                _consumerSecret=value;
            } else
            {
                _consumerSecret = "";
            }
        }
        /**
         * pin是用于OAuth认证用的属性,由登陆页面生成.仅在登陆时使用.
         *
         */
        public function set pin(value:String):void
        {
            _pin=value;
            //Case that the saved user come back.
            //The oauthLoader will not created before login
            //Actually, the application could save last token and
            //reset after the application restarted.
            if ( oauthLoader )
            {
                var url:String=OAUTH_ACCESS_TOKEN_REQUEST_URL;
                var req:URLRequest=signRequest(URLRequestMethod.GET, url, null);
                oauthLoader.load(req);
                _pin = ""; // Just use once.
            }
        }

        /**
         * accessTokenKey是用于OAuth认证的访问资源的token,由用户授权.
         *
         */
        public function set accessTokenKey(value:String):void
        {
            if (null != value)
            {
                _accessTokenKey=value;
            } else
            {
                _accessTokenKey = "";
            }
        }

        public function get accessTokenKey():String
        {
            return _accessTokenKey;
        }
        /**
         * accessTokenSecret是用于OAuth认证的访问资源的token的密钥.
         *
         */
        public function get accessTokenSecrect():String
        {
            return _accessTokenSecret;
        }
        public function set accessTokenSecrect(value:String):void
        {
            if (null != value)
            {
                _accessTokenSecret=value;
            } else
            {
                _accessTokenSecret = "";
            }
        }
        /**
         * source是标识客户端来源.必须设置为新浪认证的应用程序id
         *
         */
        public function set source(value:String):void
        {
            _source = StringEncoders.urlEncodeUtf8String(value);
        }
        public function get source():String
        {
            return _source;
        }
        /**
         * login函数封装了OAuth所要求的验证的三个步骤,
         * 调用者只需要将新浪微博的用户名和密码
         * (之前输入的consumerKey和consumerSecret)
         * 传入函数即可.
         *
         * @param userName 是合法的新浪微博用户名.
         * @param password 是与用户名对应的密码.
         *
         * login函数没有返回值,验证结果将采用消息的方式通知api调用者.
         * @see com.sina.microblog.events.MicroBlogEvent#LOGIN_RESULT
         *
         */
        public function login(userName:String=null, password:String=null):void
        {
            if (_accessTokenKey.length > 0 && _accessTokenSecret.length > 0)
            {
                return;
            }

            if (_consumerKey.length > 0 && _consumerSecret.length > 0)
            {
                if (null == oauthLoader)
                {
                    oauthLoader=new URLLoader();
                    oauthLoader.addEventListener(Event.COMPLETE, oauthLoader_onComplete, false, 0, true);
                    oauthLoader.addEventListener(IOErrorEvent.IO_ERROR, oauthLoader_onError, false, 0, true);
                    oauthLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, oauthLoader_onSecurityError, false, 0, true);
                }
                var req:URLRequest=signRequest(URLRequestMethod.GET, OAUTH_REQUEST_TOKEN_REQUEST_URL, null);
                oauthLoader.load(req);
            }
            else if (userName != null && password != null)
            {
                var creds:String=userName + ":" + password;
                var encodedCredentials:String=Base64.encode(creds);
                authHeader=new URLRequestHeader("Authorization", "Basic " + encodedCredentials);
                verifyCredentials();
            }

        }

        /**
         * 返回最新更新的20条公共微博消息.
         *
         * <b>有请求数限制</b>
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件<br/>
         * type为<b>MicroBlogEvent.STATUS_PUBLIC_TIMELINE_RESULT</b><br/>
         * success为<b>true</b>如果该属性为false,则表示该次操作失败<br/>
         * result为一个MicroBlogStatus数组,该数组包含了最新的20条微博消息.</p>
         *
         * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/>
         * type为<b>MicroErrorEvent.STATUS_PUBLIC_TIMELINE_ERROR</b></p>
         *
         */
        public function loadPublicTimeline():void
        {
            addProcessor(PUBLIC_TIMELINE_REQUEST_URL, processStatusArray, MicroBlogEvent.LOAD_PUBLIC_TIMELINE_RESULT, MicroBlogErrorEvent.LOAD_PUBLIC_TIMELINE_ERROR);
            executeRequest(PUBLIC_TIMELINE_REQUEST_URL, getMicroBlogRequest(PUBLIC_TIMELINE_REQUEST_URL, null, URLRequestMethod.GET));
        }

        /**
         * 返回用户所有关注的用户最新的n条微博消息.
         *
         * <b>有请求数限制</b>
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.STATUS_FRIENDS_TIMELINE_RESULT</b><br/>
         * result为一个MicroBlogStatus数组,该数组包含了所请求的微博消息.</p>
         *
         * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/>
         * type为<b>MicroErrorEvent.STATUS_FRIENDS_TIMELINE_ERROR</b><br/></p>
         *
         * @param sinceID 请求大于该id的所有消息更新,默认值为0,表示不限制.
         * @param maxID 请求小于该id的所有消息更新,默认为0,表示不限制.
         * @param count 请求的页大小,即一页包含多少条记录;默认值0,表示使用服务器默认分页大小.
         * @param page 请求的页序号,默认值0,返回第一页.
         *
         */
        public function loadFriendsTimeline(sinceID:uint=0, maxID:uint=0, count:uint=0, page:uint=0):void
        {
            addProcessor(FRIENDS_TIMELINE_REQUEST_URL, processStatusArray, MicroBlogEvent.LOAD_FRIENDS_TIMELINE_RESULT, MicroBlogErrorEvent.LOAD_FRIENDS_TIMELINE_ERROR);
            var url:String=FRIENDS_TIMELINE_REQUEST_URL;
            var params:Object=new Object();
            makeQueryCombinatory(params, sinceID, maxID, count, page);
            executeRequest(FRIENDS_TIMELINE_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET));
        }

        /**
         * 返回用户发布的最新的n条微博消息.
         *
         * <b>有请求数限制</b>
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.STATUS_USER_TIMELINE_RESULT</b><br/>
         * result为一个MicroBlogStatus数组,该数组包含了所请求的微博消息.
         * 由于分页限制,最多只能返回用户最新的300条微博信息</p>
         *
         * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/>
         * type为<b>MicroErrorEvent.STATUS_USER_TIMELINE_ERROR</b></p>
         *
         * @param id 可选参数. 根据指定用户UID或用户帐号来返回微博信息.
         * @param userID 可选参数. 指定用户UID来返回微博信息,主要是用来区分用户UID跟用户账号一样,产生歧义的时候,特别是在用户账号为数字导致和用户Uid发生歧义.
         * @param screenName 可选参数,指定用户的微博昵称,主要是用来区分用户UID跟用户账号一样,产生歧义的时候。
         * @param sinceID 请求大于该id的所有消息更新,默认值为0,表示不限制.
         * @param maxID 请求小于该id的所有消息更新,默认为0,表示不限制.
         * @param count 请求的页大小,即一页包含多少条记录;默认值0,表示使用服务器默认分页大小.
         * @param page 请求的页序号,默认值0,返回第一页.
         *
         *
         */
        public function loadUserTimeline(id:*=null, userID:uint=0, screenName:String=null, sinceID:uint=0, maxID:uint=0, count:uint=0, page:uint=0):void
        {
            //TO-DO: if the parameter equals to zero, don‘t include this parameter when build request url.
            addProcessor(USER_TIMELINE_REQUEST_URL, processStatusArray, MicroBlogEvent.LOAD_USER_TIMELINE_RESULT, MicroBlogErrorEvent.LOAD_USER_TIMELINE_ERROR);
            var user:String;
            if (id)
            {
                user="/" + String(id);
            }
            else
            {
                user="";
            }
            var url:String=USER_TIMELINE_REQUEST_URL.replace("$user", user);
            var params:Object=new Object();
            makeUserParams(params, userID, screenName, -1);
            makeQueryCombinatory(params, sinceID, maxID, count, page);

            executeRequest(USER_TIMELINE_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET));
        }

        /**
         * 返回最近n条提及我的微博消息.
         *
         * <b>有请求数限制</b>
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.STATUS_MENTIONS_RESULT</b><br/>
         * result为一个MicroBlogStatus数组,该数组包含了所请求的微博消息.</p>
         *
         * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/>
         * type为<b>MicroErrorEvent.STATUS_MENTIONS_ERROR</b></p>
         *
         * @param sinceID 请求大于该id的所有消息更新,默认值为0,表示不限制.
         * @param maxID 请求小于该id的所有消息更新,默认为0,表示不限制.
         * @param count 请求的页大小,即一页包含多少条记录;默认值0,表示使用服务器默认分页大小.
         * @param page 请求的页序号,默认值0,返回第一页.
         *
         */
        public function loadMentions(sinceID:uint=0, maxID:uint=0, count:uint=0, page:uint=0):void
        {
            //TO-DO: if the parameter equals to zero, don‘t include this parameter when build request url.
            addProcessor(MENTIONS_REQUEST_URL, processStatusArray, MicroBlogEvent.LOAD_MENSIONS_RESULT, MicroBlogErrorEvent.LOAD_MENSIONS_ERROR);
            var url:String=MENTIONS_REQUEST_URL;
            var params:Object=new Object();
            makeQueryCombinatory(params, sinceID, maxID, count, page);
            executeRequest(MENTIONS_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET));
        }

        /**
         * 返回最近n条评论.
         *
         * <b>有请求数限制</b>
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.STATUS_COMMENTS_TIMELINE_RESULT</b><br/>
         * result为一个MicroBlogStatus数组,该数组包含了所请求的微博消息.</p>
         *
         * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/>
         * type为<b>MicroErrorEvent.STATUS_COMMENTS_TIMELINE_ERROR</b></p>
         *
         * @param sinceID 请求大于该id的所有消息更新,默认值为0,表示不限制.
         * @param maxID 请求小于该id的所有消息更新,默认为0,表示不限制.
         * @param count 请求的页大小,即一页包含多少条记录;默认值0,表示使用服务器默认分页大小.
         * @param page 请求的页序号,默认值0,返回第一页.
         *
         */
        public function loadCommentsTimeline(sinceID:uint=0, maxID:uint=0, count:uint=0, page:uint=0):void
        {
            addProcessor(COMMENTS_TIMELINE_REQUEST_URL, processCommentArray, MicroBlogEvent.LOAD_COMMENTS_TIMELINE_RESULT, MicroBlogErrorEvent.LOAD_COMMENTS_TIMELINE_ERROR);
            var url:String=COMMENTS_TIMELINE_REQUEST_URL;
            var params:Object=new Object();
            makeQueryCombinatory(params, sinceID, maxID, count, page);
            executeRequest(COMMENTS_TIMELINE_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET));
        }

        /**
         * 返回我发表的评论.
         *
         * <b>有请求数限制</b>
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.STATUS_COMMENTS_BY_ME_RESULT</b><br/>
         * result为一个MicroBlogStatus数组,该数组包含了所请求的微博消息.</p>
         *
         * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/>
         * type为<b>MicroErrorEvent.STATUS_COMMENTS_TIMELINE_ERROR</b></p>
         *
         * @param sinceID 请求大于该id的所有消息更新,默认值为0,表示不限制.
         * @param maxID 请求小于该id的所有消息更新,默认为0,表示不限制.
         * @param count 请求的页大小,即一页包含多少条记录;默认值0,表示使用服务器默认分页大小.
         * @param page 请求的页序号,默认值0,返回第一页.
         *
         */
        public function loadMyComments(sinceID:uint=0, maxID:uint=0, count:uint=0, page:uint=0):void
        {
            addProcessor(COMMENTS_BY_ME_REQUEST_URL, processCommentArray, MicroBlogEvent.LOAD_MY_COMMENTS_RESULT, MicroBlogErrorEvent.LOAD_MY_COMMENTS_ERROR);
            var url:String=COMMENTS_BY_ME_REQUEST_URL;
            var params:Object=new Object();
            makeQueryCombinatory(params, sinceID, maxID, count, page);
            executeRequest(COMMENTS_BY_ME_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET));
        }

        /**
         * 返回指定微博的最新n条评论.
         *
         * <b>有请求数限制</b>
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.STATUS_COMMENTS_RESULT</b><br/>
         * result为一个MicroBlogStatus数组,该数组包含了所请求的微博消息.</p>
         *
         * @param id 必选参数,指定微博ID.
         * @param count 请求的页大小,即一页包含多少条记录;默认值0,表示使用服务器默认分页大小.
         * @param page 请求的页序号,默认值0,返回第一页.
         */
        public function loadCommentList(id:uint, count:uint=0, page:uint=0):void
        {
            addProcessor(COMMENTS_REQUEST_URL, processCommentArray, MicroBlogEvent.LOAD_COMMENTS_RESULT, MicroBlogErrorEvent.LOAD_COMMENTS_ERROR);
            var url:String=COMMENTS_REQUEST_URL;
            var params:Object=new Object();
            params[ID]=id;
            makeQueryCombinatory(params, 0, 0, count, page);
            executeRequest(COMMENTS_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET));
        }

        /**
         * 批量统计微薄的评论数,转发数.单次最多获取100个.
         *
         * <b>有请求数限制</b>
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.STATUS_COUNTS_RESULT</b><br/>
         * result为一个MicroBlogCounts实例.</p>
         *
         * @param ids 必选参数,指定微博ID数组.
         *
         */
        public function loadStatusCounts(ids:Array):void
        {
            addProcessor(STATUS_COUNTS_REQUEST_URL, processCounts, MicroBlogEvent.LOAD_STATUS_COUNTS_RESULT, MicroBlogErrorEvent.LOAD_STATUS_COUNTS_ERROR);
            var idsParam:String="";

            if (null == ids || ids.length == 0)
            {
                return;
            }
            var len:int=ids.length - 1;
            for (var i:int=0; i < len; ++i)
            {
                idsParam+=ids[i].toString() + ",";
            }
            idsParam+=ids[len].toString();
            var params:Object=new Object();
            params["ids"]=idsParam;
            var url:String=STATUS_COUNTS_REQUEST_URL;
            executeRequest(STATUS_COUNTS_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET));
        }

        /**
         * 获取单条ID的微博信息,作者信息将同时返回.
         *
         * <b>有请求数限制</b>
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.SHOW_STATUS_RESULT</b><br/>
         * result为一个MicroBlogStatus实例.</p>
         *
         * @param id 必选参数,指定微博消息ID.
         *
         */
        public function loadStatusInfo(id:uint):void
        {
            addProcessor(SHOW_STATUS_REQUEST_URL, processStatus, MicroBlogEvent.LOAD_STATUS_INFO_RESULT, MicroBlogErrorEvent.LOAD_STATUS_INFO_ERROR);
            var url:String=SHOW_STATUS_REQUEST_URL.replace("$id", id);
            executeRequest(SHOW_STATUS_REQUEST_URL, getMicroBlogRequest(url, null, URLRequestMethod.GET));
        }

        /**
         * 发布一条微博信息.为防止重复,发布的信息与当前最新信息一样话,将会被忽略.
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.UPDATE_STATUS_RESULT</b><br/>
         * result为一个MicroBlogStatus实例.</p>
         *
         * @param status 必选参数,要更新的微博信息,信息内容部超过140个汉字.
         * @param filename 可选参数,上传的jpeg文件名.
         * @param imgData 可选参数,为需要上传的jpeg文件数据,为空则不上传图片.
         *
         * 如果没有登录或超过发布上限,将返回错误
         * 系统将忽略重复发布的信息.每次发布将比较最后一条发布消息,如果一样将被忽略.因此用户不能连续提交相同信息.
         */
        public function updateStatus(status:String, filename:String=null, imgData:ByteArray=null):void
        {
            addProcessor(UPDATE_STATUS_REQUEST_URL, processStatus, MicroBlogEvent.UPDATE_STATUS_RESULT, MicroBlogErrorEvent.UPDATE_STATUS_ERROR);
            var req:URLRequest;
            var params:URLVariables=new URLVariables();

            if ( status )
            {
                params.status= encodeMsg(status);
            } else
            {
                if ( imgData == null )
                {
                    return;
                }
            }

            var url:String;

            if (imgData)
            {
                url=UPDATE_STATUS_WITH_IMAGE_REQUEST_URL;
                req=getMicroBlogRequest(url, params, URLRequestMethod.POST);
                var boundary:String=makeBoundary();
                req.contentType=MULTIPART_FORMDATA + boundary;
                req.data=makeMultipartPostData(boundary, "pic", filename, imgData, params);
            }
            else
            {

                url=UPDATE_STATUS_REQUEST_URL;
                req=getMicroBlogRequest(url, params, URLRequestMethod.POST);
                req.data=params;
            }
            executeRequest(UPDATE_STATUS_REQUEST_URL, req);

        }

        /**
         * 返回发布一条带图片的微博信息的<code>URLRequest对象</code>.
         *
         *
         * <p>如果消息成功发送,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.UPDATE_STATUS_RESULT</b><br/>
         * result为一个MicroBlogStatus实例.</p>
         *
         *
         * @return <code>URLRequest</code>对象,用于在flash中用File对象上传图片,在调用File对象的upload时uploadDataFieldName必须为pic。
         *
         * 如果没有登录或超过发布上限,将返回错误
         * 系统将忽略重复发布的信息.每次发布将比较最后一条发布消息,如果一样将被忽略.因此用户不能连续提交相同信息.
         *
         * @see #updateStatus()
         */
        public function getUploadImageRequest(status:String):URLRequest
        {
            var req:URLRequest;

            var url:String=UPDATE_STATUS_WITH_IMAGE_REQUEST_URL;
            var data:URLVariables=new URLVariables();
            data.status=encodeMsg(status);
            req=getMicroBlogRequest(url, data, URLRequestMethod.POST);
            req.data=data;
            return req;
        }

        /**
         * 删除微博信息.注意:只能删除自己发布的信息.
         *
         * <p> 如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.DELETE_STATUS_RESULT</b><br/>
         * result为一个MicroBlogStatus实例.</p>
         *
         * @param id 必填参数,要删除的微博信息ID.
         *
         */
        public function deleteStatus(id:uint):void
        {
            addProcessor(DELETE_STATUS_REQUEST_URL, processStatus, MicroBlogEvent.DELETE_STATUS_RESULT, MicroBlogErrorEvent.DELETE_STATUS_ERROR);
            var url:String=DELETE_STATUS_REQUEST_URL.replace("$id", id);
            var postData:URLVariables = new URLVariables();
            var req:URLRequest = getMicroBlogRequest(url, postData, URLRequestMethod.POST);
            req.data = postData;
            executeRequest(DELETE_STATUS_REQUEST_URL, req);

        }

        /**
         * 转发一条微博信息.为防止重复,发布的信息与当前最新信息一样话,将会被忽略.
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.REPOST_STATUS_RESULT</b><br/>
         * result为一个MicroBlogStatus实例.</p>
         *
         * @param id 必填参数,转发的微博ID.
         * @param status 可选参数,要更新的微博信息,信息内容部超过140个汉字.
         *
         * <p>如果没有登录或超过发布上限,将返回错误
         * 系统将忽略重复发布的信息.每次发布将比较最后一条发布消息,如果一样将被忽略.因此用户不能连续提交相同信息.
         * </p>
         */
        public function repostStatus(id:uint, status:String=null):void
        {
            addProcessor(REPOST_STATUS_REQUEST_URL, processStatus, MicroBlogEvent.REPOST_STATUS_RESULT, MicroBlogErrorEvent.REPOST_STATUS_ERROR);

            var variable:URLVariables=new URLVariables();
            variable.id=id;
            if (status && status.length > 0)
            {
                variable.status=encodeMsg(status);
            }
            var req:URLRequest=getMicroBlogRequest(REPOST_STATUS_REQUEST_URL, variable, URLRequestMethod.POST);
            req.data=variable;
            executeRequest(REPOST_STATUS_REQUEST_URL, req);
        }

        /**
         * 对一条微博信息进行评论.为防止重复,发布的信息与当前最新信息一样话,将会被忽略.
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件
         * type为<b>MicroBlogEvent.COMMENT_STATUS_RESULT</b><br/>
         * result为一个MicroBlogComment实例.</p>
         *
         * <p>如果没有登录或超过发布上限,将返回错误<br/>
         * 系统将忽略重复发布的信息.每次发布将比较最后一条发布消息,如果一样将被忽略.因此用户不能连续提交相同信息.</p>
         *
         * @param id 必填参数, 要评论的微博ID.
         * @param comment 必选参数,要更新的微博信息,信息内容部超过140个汉字.
         * @param cid 选填参数,要评论的评论ID.
         *
         */
        public function commentStatus(id:uint, comment:String, cid:uint=0):void
        {
            addProcessor(COMMENT_STATUS_REQUEST_URL, processComment, MicroBlogEvent.COMMENT_STATUS_RESULT, MicroBlogErrorEvent.COMMENT_STATUS_ERROR);

            var variable:URLVariables=new URLVariables();
            variable.id=id;
            if (comment )
            {
                variable.comment=encodeMsg(comment);
            }
            if (cid > 0)
            {
                variable.cid=cid;
            }
            var req:URLRequest=getMicroBlogRequest(COMMENT_STATUS_REQUEST_URL, variable, URLRequestMethod.POST);
            req.data=variable;
            executeRequest(COMMENT_STATUS_REQUEST_URL, req);
        }

        /**
         * 删除评论.注意:只能删除自己发布的信息.
         *
         * <p> 如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.DELETE_STATUS_COMMENT_RESULT</b><br/>
         * result为一个MicroBlogComment实例.</p>
         *
         * @param id 必填参数,要删除的微博评论信息ID.
         *
         */
        public function deleteComment(id:uint):void
        {
            addProcessor(DELETE_COMMENT_REQUEST_URL, processComment, MicroBlogEvent.DELETE_COMMENT_RESULT, MicroBlogErrorEvent.DELETE_COMMENT_ERROR);
            var url:String=DELETE_COMMENT_REQUEST_URL.replace("$id", id);
            var postData:URLVariables = new URLVariables();
            var req:URLRequest = getMicroBlogRequest(url, postData, URLRequestMethod.POST);
            req.data = postData;
            executeRequest(DELETE_COMMENT_REQUEST_URL, req);
        }

        /**
         * 对一条微博评论信息进行回复.为防止重复,发布的信息与当前最新信息一样话,将会被忽略.
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.REPLY_STATUS_RESULT</b><br/>
         * result为一个MicroBlogStatus实例.</p>
         *
         * @param id 必填参数, 要评论的微博消息ID.
         * @param comment 必选参数,要更新的微博信息,信息内容部超过140个汉字.
         * @param cid 必选参数,要评论的评论ID.
         *
         * <p>如果没有登录或超过发布上限,将返回错误
         * 系统将忽略重复发布的信息.每次发布将比较最后一条发布消息,如果一样将被忽略.因此用户不能连续提交相同信息.
         * </p>
         */
        public function replyStatus(id:uint, comment:String, cid:uint):void
        {
            addProcessor(REPLY_STATUS_REQUEST_URL, processComment, MicroBlogEvent.REPLY_STATUS_RESULT, MicroBlogErrorEvent.REPLY_STATUS_ERROR);
            var variable:URLVariables=new URLVariables();
            variable.id=id;
            if ( comment )
            {
                variable.comment=encodeMsg(comment);
            }
            variable.cid=cid;
            var req:URLRequest=getMicroBlogRequest(REPLY_STATUS_REQUEST_URL, variable, URLRequestMethod.POST);
            req.data=variable;
            executeRequest(REPLY_STATUS_REQUEST_URL, req);
        }

        /**
         * 按用户UID或昵称返回用户资料,同时也将返回用户的最新发布的微博.
         *
         * <b>有请求数限制</b>
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.SHOW_USERS_RESULT</b><br/>
         * result为一个MicroBlogUser实例.</p>
         *
         * @param user 用户UID或用户帐号.
         * @param userID 指定用户UID,主要是用来区分用户UID跟用户账号一样,产生歧义的时候,特别是在用户账号为数字导致和用户Uid发生歧义.
         * @param screenName 指定微博昵称,主要是用来区分用户UID跟用户账号一样,产生歧义的时候.
         *
         * <br/>
         * <b>以上三个参数必须至少给一个</b>
         * 为了保护用户隐私,只有用户设置了公开或对粉丝设置了公开的数据才会返回.
         */
        public function loadUserInfo(user:String=null, userID:uint=0, screenName:String=null):void
        {
            addProcessor(LOAD_USER_INFO_REQUEST_URL, processUser, MicroBlogEvent.LOAD_USER_INFO_RESULT, MicroBlogErrorEvent.LOAD_USER_INFO_ERROR);
            if (user && user.length > 0)
            {
                user="/" + user;
            }
            else
            {
                user="";
            }
            var url:String=LOAD_USER_INFO_REQUEST_URL.replace("$user", user);
            var params:Object=new Object();
            makeUserParams(params, userID, screenName, -1);
            executeRequest(LOAD_USER_INFO_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET));

        }

        /**
         * 返回用户关注实例列表,并返回最新微博文章.按关注人的关注时间倒序返回,
         * 每次返回100个,通过cursor参数来取得多于100的关注人.
         * 也可以通过ID,nickname,user_id参数来获取其他人的关注人列表.
         *
         * <b>有请求数限制</b>
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.FRIENDS_RESULT</b><br/>
         * result为一个MicroBlogUser数组.</p>
         *
         * @param user 用户UID或用户帐号.
         * @param userID 指定用户UID,主要是用来区分用户UID跟用户账号一样,产生歧义的时候,特别是在用户账号为数字导致和用户Uid发生歧义.
         * @param screenName 指定微博昵称,主要是用来区分用户UID跟用户账号一样,产生歧义的时候.
         * @param cursor 选填参数. 单页只能包含100个关注列表,为了获取更多则cursor默认从-1开始,通过增加或减少cursor来获取更多的关注列表.
         *
         * <p>为了保护用户隐私,只有用户设置了公开或对粉丝设置了公开的数据才会返回.</p>
         */
        public function loadFriendsInfo(user:String=null, userID:uint=0, screenName:String=null, cursor:Number=-1):void
        {
            addProcessor(LOAD_FRIENDS_INFO_REQUEST_URL, processUserArray, MicroBlogEvent.LOAD_FRIENDS_INFO_RESULT, MicroBlogErrorEvent.LOAD_FRIENDS_INFO_ERROR);
            if (user && user.length > 0)
            {
                user="/" + user;
            }
            else
            {
                user="";
            }
            var url:String=LOAD_FRIENDS_INFO_REQUEST_URL.replace("$user", user);
            var params:Object=new Object();
            makeUserParams(params, userID, screenName, cursor);
            executeRequest(LOAD_FRIENDS_INFO_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET));
        }

        /**
         * 返回用户的粉丝列表,并返回粉丝的最新微博.按粉丝的关注时间倒序返回,
         * 每次返回100个,通过cursor参数来取得多于100的粉丝.
         *
         * <b>有请求数限制</b>
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.FOLLOWERS_RESULT</b><br/>
         * result为一个MicroBlogUser数组.</p>
         *
         * @param user 用户UID或用户帐号.
         * @param userID 指定用户UID,主要是用来区分用户UID跟用户账号一样,产生歧义的时候,特别是在用户账号为数字导致和用户Uid发生歧义.
         * @param screenName 指定微博昵称,主要是用来区分用户UID跟用户账号一样,产生歧义的时候.
         * @param cursor 选填参数. 单页只能包含100个关注列表,为了获取更多则cursor默认从-1开始,通过增加或减少cursor来获取更多的关注列表.
         *
         * <p>为了保护用户隐私,只有用户设置了公开或对粉丝设置了公开的数据才会返回.</p>
         */
        public function loadFollowersInfo(user:String=null, userID:uint=0, screenName:String=null, cursor:int=-1):void
        {
            addProcessor(LOAD_FOLLOWERS_INFO_REQUEST_URL, processUserArray, MicroBlogEvent.LOAD_FOLLOWERS_INFO_RESULT, MicroBlogErrorEvent.LOAD_FOLLOWERS_INFO_ERROR);
            if (user && user.length > 0)
            {
                user="/" + user;
            }
            else
            {
                user="";
            }
            var url:String=LOAD_FOLLOWERS_INFO_REQUEST_URL.replace("$user", user);
            var params:Object=new Object();
            makeUserParams(params, userID, screenName, cursor);
            executeRequest(LOAD_FOLLOWERS_INFO_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET));
        }

        /**
         * 返回用户的最新n条私信.
         *
         * <b>有请求数限制</b>
         *
         * <p> 如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.DIRECT_MESSAGES_RESULT</b><br/>
         * result为一个MicroBlogDirectMessage数组.</p>
         *
         * @param sinceID 请求大于该id的所有消息更新,默认值为0,表示不限制.
         * @param maxID 请求小于该id的所有消息更新,默认为0,表示不限制.
         * @param count 请求的页大小,即一页包含多少条记录;默认值0,表示使用服务器默认分页大小.
         * @param page 请求的页序号,默认值0,返回第一页.
         *
         * <p>为了保护用户隐私,只有用户设置了公开或对粉丝设置了公开的数据才会返回.</p>
         */
        public function loadDirectMessagesReceived(sinceID:uint=0, maxID:uint=0, count:uint=0, page:uint=0):void
        {
            addProcessor(LOAD_DIRECT_MESSAGES_RECEIVED_REQUEST_URL, processDirectMessageArray, MicroBlogEvent.LOAD_DIRECT_MESSAGES_RECEIVED_RESULT, MicroBlogErrorEvent.LOAD_DIRECT_MESSAGES_RECEIVED_ERROR);
            var url:String=LOAD_DIRECT_MESSAGES_RECEIVED_REQUEST_URL;
            var params:Object=new Object();
            makeQueryCombinatory(params, sinceID, maxID, count, page);
            executeRequest(LOAD_DIRECT_MESSAGES_RECEIVED_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET));
        }

        /**
         * 返回登录用户已发送最新n条私信.
         *
         * <b>有请求数限制</b>
         *
         * <p> 如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.SENT_DIRECT_MESSAGES_RESULT</b><br/>
         * result为一个MicroBlogDirectMessage数组.</p>
         *
         * @param sinceID 请求大于该id的所有消息更新,默认值为0,表示不限制.
         * @param maxID 请求小于该id的所有消息更新,默认为0,表示不限制.
         * @param count 请求的页大小,即一页包含多少条记录;默认值0,表示使用服务器默认分页大小.
         * @param page 请求的页序号,默认值0,返回第一页.
         *
         * <p>为了保护用户隐私,只有用户设置了公开或对粉丝设置了公开的数据才会返回.</p>
         */
        public function loadDirectMessagesSent(sinceID:uint=0, maxID:uint=0, count:uint=0, page:uint=0):void
        {
            addProcessor(LOAD_DIRECT_MESSAGES_SENT_REQUEST_URL, processDirectMessageArray, MicroBlogEvent.LOAD_DIRECT_MESSAGES_SENT_RESULT, MicroBlogErrorEvent.LOAD_DIRECT_MESSAGES_SENT_ERROR);
            var url:String=LOAD_DIRECT_MESSAGES_SENT_REQUEST_URL;
            var params:Object=new Object();
            makeQueryCombinatory(params, sinceID, maxID, count, page);

            executeRequest(LOAD_DIRECT_MESSAGES_SENT_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET));
        }

        /**
         * 返发送一条私信.必须包含参数user和message,
         * userID和screenName必须选一个.
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.NEW_DIRECT_MESSAGES_RESULT</b><br/>
         * result为一个MicroBlogDirectMessage实例.</p>
         *
         * @param user 用户UID或用户帐号.
         * @param message 必须参数. 要发生的消息内容,文本大小必须小于140个汉字.
         * @param userID 指定用户UID,主要是用来区分用户UID跟用户账号一样,产生歧义的时候,特别是在用户账号为数字导致和用户Uid发生歧义.
         * @param screenName 指定微博昵称,主要是用来区分用户UID跟用户账号一样,产生歧义的时候.
         *
         */
        public function sendDirectMessage(user:String, message:String, userID:uint=0, screenName:String=null):void
        {
            //curl -u user:password -d "text=all your bases are belong to us&user=user_2" http://api.t.sina.com.cn/direct_messages/new.xml
            addProcessor(SEND_DIRECT_MESSAGE_REQUEST_URL, processDirectMessage, MicroBlogEvent.SEND_DIRECT_MESSAGE_RESULT, MicroBlogErrorEvent.SEND_DIRECT_MESSAGE_ERROR);
            if (userID == 0 && screenName == null)
            {
                var e:MicroBlogErrorEvent=new MicroBlogErrorEvent(MicroBlogErrorEvent.SEND_DIRECT_MESSAGE_ERROR);
                e.message="参数错误";
                dispatchEvent(e);
            }

            var data:URLVariables=new URLVariables();
            if (userID > 0)
            {
                data.user_id=userID;
            }
            if (screenName)
            {
                data.screen_name=screenName;
            }
            data.id = user;
            data.text = encodeMsg(message);
            var req:URLRequest=getMicroBlogRequest(SEND_DIRECT_MESSAGE_REQUEST_URL, data, URLRequestMethod.POST);
            req.data=data;
            executeRequest(SEND_DIRECT_MESSAGE_REQUEST_URL, req);
        }

        /**
         * 按ID删除私信.操作用户必须为私信的接收人.
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.DELETE_DIRECT_MESSAGES_RESULT</b><br/>
         * result为一个MicroBlogDirectMessage实例.</p>
         *
         * @param id 必填参数,要删除的私信主键ID.
         *
         */
        public function deleteDirectMessage(id:uint):void
        {
            //curl -u user:password --http-request DELETE http://api.t.sina.com.cn/direct_messages/destroy/88619848.xml
            addProcessor(DELETE_DIRECT_MESSAGE_REQUEST_URL, processDirectMessage, MicroBlogEvent.DELETE_DIRECT_MESSAGE_RESULT, MicroBlogErrorEvent.DELETE_DIRECT_MESSAGE_ERROR);
            var url:String=DELETE_DIRECT_MESSAGE_REQUEST_URL.replace("$id", id);
            var postData:URLVariables = new URLVariables();
            var req:URLRequest = getMicroBlogRequest(url, postData, URLRequestMethod.POST);
            req.data = postData;
            executeRequest(DELETE_DIRECT_MESSAGE_REQUEST_URL, req);
        }

        /**
         * 关注一个用户.成功则返回关注人的资料,
         * 失败则返回一条字符串的说明.
         *
         * <p> 如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.CREATE_FRIENDSHIPS_RESULT</b><br/>
         * result为一个MicroBlogUser实例.</p>
         *
         * @param user 用户UID或用户帐号.
         * @param userID 主要是用来区分用户UID跟用户账号一样,产生歧义的时候,特别是在用户账号为数字导致和用户Uid发生歧义.
         * @param screenName 指定微博昵称,主要是用来区分用户UID跟用户账号一样,产生歧义的时候.
         * @param isFollow 可选参数.将是自己粉丝的用户加为关注.
         *
         */
        public function follow(user:String, userID:uint, screenName:String, isFollow:Boolean=true):void
        {
            //TO-DO: if the parameter equals to zero, don‘t include this parameter when build request url.
            addProcessor(FOLLOW_REQUEST_URL, processUser, MicroBlogEvent.FOLLOW_RESULT, MicroBlogErrorEvent.FOLLOW_ERROR);
            if (user && user.length > 0)
            {
                user="/" + user;
            } else
            {
                user="";
            }
            var url:String=FOLLOW_REQUEST_URL.replace("$user", user);
            var params:URLVariables=new URLVariables();
            if ( userID > 0 )
            {
                params.user_id = userID;
            }
            if ( screenName && screenName.length > 0 )
            {
                params.screen_name = screenName;
            }
            params.follow = isFollow;

            var req:URLRequest=getMicroBlogRequest(url, params, URLRequestMethod.POST);
            req.data = params;
            executeRequest(FOLLOW_REQUEST_URL, req);
        }

        /**
         * 取消关注某用户.成功则返回被取消关注人的资料,
         * 失败则返回一条字符串的说明.
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.DESTROY_FRIENDSHIPS_RESULT</b><br/>
         * result为一个MicroBlogUser实例.</p>
         *
         * @param user 用户UID或用户帐号.
         * @param userID 主要是用来区分用户UID跟用户账号一样,产生歧义的时候,特别是在用户账号为数字导致和用户Uid发生歧义.
         * @param screenName 指定微博昵称,主要是用来区分用户UID跟用户账号一样,产生歧义的时候.
         *
         */
        public function cancelFollowing(user:String, userID:uint, screenName:String):void
        {
            //TO-DO: if the parameter equals to zero, don‘t include this parameter when build request url.
            addProcessor(CANCEL_FOLLOWING_REQUEST_URL, processUser, MicroBlogEvent.CANCEL_FOLLOWING_RESULT, MicroBlogErrorEvent.CANCEL_FOLLOWING_ERROR);
            if (user && user.length > 0)
            {
                user="/" + user;
            } else
            {
                user="";
            }
            var url:String=CANCEL_FOLLOWING_REQUEST_URL.replace("$user", user);
            var params:URLVariables=new URLVariables();
            if ( userID > 0 )
            {
                params.user_id = userID;
            }
            if ( screenName && screenName.length > 0 )
            {
                params.screen_name = screenName;
            }

            var req:URLRequest=getMicroBlogRequest(url, params, URLRequestMethod.POST);
            req.data = params;
            executeRequest(CANCEL_FOLLOWING_REQUEST_URL, req);
        }

        /**
         * 返回两个用户关系的详细情况.
         *
         * <b>有请求数限制</b>
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.CHECK_FRIENDSHIPS_RESULT</b><br/>
         * result为<code>MicroBlogUsersRelationship</code>值.</p>
         *
         * @param targetID 选填参数,要判断的目标用户的uid.
         * @param targetScreenName  选填参数,要判断的目标用户的昵称.targetID和targetScreenName两个参数必须填一个.
         * @param sourceID 选填参数,要判断的源用户的uid
         * @param sourceScreenName 选填参数,要判断的源用户的昵称.如果sourceID和sourceScreenName均未填,则以当前用户为源用户
         *
         */
        public function checkIsFollowing(targetID:uint=0, targetScreenName:String=null, sourceID:uint=0, sourceScreenName:String=null):void
        {
            addProcessor(CHECK_IS_FOLLOWING_REQUEST_URL, processRelationship, MicroBlogEvent.CHECK_IS_FOLLOWING_RESULT, MicroBlogErrorEvent.CHECK_IS_FOLLOWING_ERROR);
            var params:Object=new Object();
            var needExecute:Boolean=false;
            if (targetID > 0)
            {
                params[TARGET_ID]=targetID;
                needExecute=true;
            }
            if (targetScreenName && targetScreenName.length > 0)
            {
                params[TARGET_SCREEN_NAME]=StringEncoders.urlEncodeUtf8String(targetScreenName);
                needExecute=true;
            }
            if (!needExecute)
            {
                return;
            }
            if (sourceID > 0)
            {
                params[SOURCE_ID]=sourceID;
            }
            if (sourceScreenName && sourceScreenName.length > 0)
            {
                params[SOURCE_SCREEN_NAME]=StringEncoders.urlEncodeUtf8String(sourceScreenName);
            }
            var url:String=CHECK_IS_FOLLOWING_REQUEST_URL;
            executeRequest(CHECK_IS_FOLLOWING_REQUEST_URL,getMicroBlogRequest(url, params, URLRequestMethod.GET));
        }

        /**
         * 返回用户关注对象的user_id列表.
         *
         * <b>有请求数限制</b>
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.LOAD_FRIENDS_ID_LIST_RESULT</b><br/>
         * result为<code>uint数组</code>实例.</p>
         *
         * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/>
         * type为<b>MicroErrorEvent.LOAD_FRIENDS_ID_LIST_ERROR</b><br/>
         * message为错误描述.</p>
         *
         * @param user 用户UID或用户帐号.
         * @param userID 主要是用来区分用户UID跟用户账号一样,产生歧义的时候,特别是在用户账号为数字导致和用户Uid发生歧义.
         * @param screenName 指定微博昵称,主要是用来区分用户UID跟用户账号一样,产生歧义的时候.
         * @param cursor 选填参数. 单页只能包含5000个id,为了获取更多则cursor默认从-1开始,通过增加或减少cursor来获取更多的关注列表.
         * @param count 可选参数. 每次返回的最大记录数(即页面大小),不大于5000。
         */
        public function loadFriendsIDList(user:String, userID:uint=0, screenName:String=null, cursor:Number=-1, count:uint=5000):void
        {
            addProcessor(LOAD_FRIENDS_ID_LIST_REQUEST_URL, processIDSArray, MicroBlogEvent.LOAD_FRIENDS_ID_LIST_RESULT, MicroBlogErrorEvent.LOAD_FRIENDS_ID_LIST_ERROR);
            if (user && user.length > 0)
            {
                user="/" + user;
            }
            else
            {
                user="";
            }
            var url:String=LOAD_FRIENDS_ID_LIST_REQUEST_URL.replace("$user", user);
            var params:Object=new Object();
            makeUserParams(params, userID, screenName, cursor);
            params["count"] = count;
            executeRequest(LOAD_FRIENDS_ID_LIST_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET));
        }

        /**
         * 返回用户粉丝的user_id列表.
         *
         * <b>有请求数限制</b>
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.LOAD_FOLLOWERS_ID_LIST_RESULT</b><br/>
         * result为<code>uint数组</code>实例.</p>
         *
         * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/>
         * type为<b>MicroErrorEvent.LOAD_FOLLOWERS_ID_LIST_ERROR</b><br/>
         * message为错误描述.</p>
         *
         * @param user 用户UID或用户帐号.
         * @param userID 主要是用来区分用户UID跟用户账号一样,产生歧义的时候,特别是在用户账号为数字导致和用户Uid发生歧义.
         * @param screenName 指定微博昵称,主要是用来区分用户UID跟用户账号一样,产生歧义的时候.
         * @param cursor 选填参数. 单页只能包含5000个id,为了获取更多则cursor默认从-1开始,通过增加或减少cursor来获取更多的关注列表.
         * @param count 可选参数. 每次返回的最大记录数(即页面大小),不大于5000。
         */
        public function loadFollowersIDList(user:String, userID:uint=0, screenName:String=null, cursor:Number=-1, count:uint=5000):void
        {
            addProcessor(LOAD_FOLLOWERS_ID_LIST_REQUEST_URL, processIDSArray, MicroBlogEvent.LOAD_FOLLOWERS_ID_LIST_RESULT, MicroBlogErrorEvent.LOAD_FOLLOWERS_ID_LIST_ERROR);
            if (user && user.length>0)
            {
                user="/" + user;
            }
            else
            {
                user="";
            }
            var url:String=LOAD_FOLLOWERS_ID_LIST_REQUEST_URL.replace("$user", user);
            var params:Object=new Object();
            makeUserParams(params, userID, screenName, cursor);
            params["count"]=count;
            executeRequest(LOAD_FOLLOWERS_ID_LIST_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET));
        }

        /**
         * 判断用户身份是否合法.
         *
         * <b>有请求数限制</b>
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.VERIFY_CREDENTIALS_RESULT</b><br/>
         * result为<code>MicroBlogUser</code>实例.</p>
         *
         * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/>
         * type为<b>MicroErrorEvent.VERIFY_CREDENTIALS_ERROR</b><br/>
         * message为错误描述.</p>
         *
         */
        public function verifyCredentials():void
        {
            //TO-DO: if the parameter equals to zero, don‘t include this parameter when build request url.
            //curl -u user:password http://api.t.sina.com.cn/account/verify_credentials.xml
            addProcessor(VERIFY_CREDENTIALS_REQUEST_URL, processUser, MicroBlogEvent.VERIFY_CREDENTIALS_RESULT, MicroBlogErrorEvent.VERIFY_CREDENTIALS_ERROR);
            executeRequest(VERIFY_CREDENTIALS_REQUEST_URL, getMicroBlogRequest(VERIFY_CREDENTIALS_REQUEST_URL, null));
        }

        /**
         * 获取当前的API调用次数限制.
         *
         * <b>有请求数限制</b>
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.RATE_LIMIT_INFO_RESULT</b><br/>
         * result为<code>MicroBlogRateInfo</code>实例.</p>
         *
         * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/>
         * type为<b>MicroErrorEvent.RATE_LIMIT_INFO_ERROR</b><br/>
         * message为错误描述.</p>
         *
         */
        public function getRateLimitInfo():void
        {
            //curl -u user:password http://api.t.sina.com.cn/account/rate_limit_status.xml
            addProcessor(GET_RATE_LIMIT_STATUS_REQUEST_URL, processRateLimit, MicroBlogEvent.GET_RATE_LIMIT_STATUS_RESULT, MicroBlogErrorEvent.GET_RATE_LIMIT_STATUS_ERROR);
            executeRequest(GET_RATE_LIMIT_STATUS_REQUEST_URL, getMicroBlogRequest(GET_RATE_LIMIT_STATUS_REQUEST_URL, null) );
        }

        /**
         * 登陆用户退出.
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.LOGOUT_RESULT</b><br/></p>
         *
         * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/>
         * type为<b>MicroErrorEvent.LOGOUT_ERROR</b><br/>
         * message为错误描述.</p>
         *
         */
        public function logout():void
        {
            //curl -u user:password -d "" http://api.t.sina.com.cn/account/end_session.xml
            addProcessor(LOGOUT_REQUEST_URL, processLogout, MicroBlogEvent.LOGOUT_RESULT, MicroBlogErrorEvent.LOGOUT_ERROR);
            var postData:URLVariables = new URLVariables();
            postData.source = "air client";
            var req:URLRequest = getMicroBlogRequest(LOGOUT_REQUEST_URL, postData, URLRequestMethod.POST);
            req.data = postData;
            executeRequest(LOGOUT_REQUEST_URL, req );
        }

        /**
         * 用户可以通过此接口来更新头像.
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.UPDATE_PROFILE_IMAGE_RESULT</b><br/>
         * result为一个MicroBlogUser实例.</p>
         *
         * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/>
         * type为<b>MicroErrorEvent.UPDATE_PROFILE_IMAGE_ERROR</b><br/>
         * message为错误描述.</p>
         *
         * @param imgData  必须为小于700K的有效的GIF, JPG, 或 PNG 图片. 如果图片大于500像素将按比例缩放
         *
         */
        public function updateProfileImage(imgData:ByteArray, filename:String):void
        {
            //TO-DO: Need to be verified.
            addProcessor(UPDATE_PROFILE_IMAGE_REQUEST_URL, processUser, MicroBlogEvent.UPDATE_PROFILE_IMAGE_RESULT, MicroBlogErrorEvent.UPDATE_PROFILE_IMAGE_ERROR);
            var boundary:String=makeBoundary();
            var postData:Object = {image:imgData};
            var req:URLRequest=getMicroBlogRequest(UPDATE_PROFILE_IMAGE_REQUEST_URL, postData, URLRequestMethod.POST);
            delete postData["image"];
            req.contentType=MULTIPART_FORMDATA + boundary;
            req.data=makeMultipartPostData(boundary, "image", filename, imgData, postData);
            executeRequest(UPDATE_PROFILE_IMAGE_REQUEST_URL, req);
        }

        /**
         * 用户可以通过此接口来更改微博信息的来源.用于无法传递ByteArray为参数的情况.
         *
         * <p>如果图片上传成功,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.UPDATE_DELIVERY_DEVICE_RESULT</b><br/>
         * result为一个MicroBlogUser实例.</p>
         *
         * <p>如果图片上传失败,将会抛出MicroBlogErrorEvent事件,该事件<br/>
         * type为<b>MicroErrorEvent.UPDATE_DELIVERY_DEVICE_ERROR</b><br/>
         * message为错误描述.</p>
         *
         * @return 返回用于上传图片的URLRequest.用于在flash中用File对象上传图片,在调用File对象的upload时uploadDataFieldName必须为image
         *
         */
        public function getUpdateProfileImageRequest():URLRequest
        {
            addProcessor(UPDATE_PROFILE_IMAGE_REQUEST_URL, processUser, MicroBlogEvent.UPDATE_PROFILE_IMAGE_RESULT, MicroBlogErrorEvent.UPDATE_PROFILE_IMAGE_ERROR);
            var postData:URLVariables = new URLVariables();
            var req:URLRequest=getMicroBlogRequest(UPDATE_PROFILE_IMAGE_REQUEST_URL, postData, URLRequestMethod.POST);
            req.data=postData;
            return req;
        }

        /**
         * 用户可以通过此接口来更新微博页面参数.
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.UPDATE_PROFILE_RESULT</b><br/>
         * result为一个MicroBlogUser实例.</p>
         *
         * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/>
         * type为<b>MicroErrorEvent.UPDATE_PROFILE_ERROR</b><br/>
         * message为错误描述.</p>
         *
         * @param params MicroBlogProfileUpdateParams对象,用于更新个人设置@see com.sina.microblog.data.MicroBlogProfileUpdateParams.
         *
         *
         */
        public function updateProfile(params:MicroBlogProfileUpdateParams):void
        {
            //curl -u user:password -d "update_delivery_device=none" http://api.t.sina.com.cn/account/update_profile_colors.xml
            addProcessor(UPDATE_PROFILE_REQUEST_URL, processUser, MicroBlogEvent.UPDATE_PROFILE_RESULT, MicroBlogErrorEvent.UPDATE_PROFILE_ERROR);
            if (null==params || params.isEmpty)
            {
                return;
            }
            var postData:URLVariables = params.postData;
            var req:URLRequest=getMicroBlogRequest(UPDATE_PROFILE_REQUEST_URL, postData, URLRequestMethod.POST);
            req.data=postData;
            executeRequest(UPDATE_PROFILE_REQUEST_URL, req);
        }

        /**
         * 返回用户的最近20条收藏信息,和用户收藏页面返回内容是一致的.
         *
         * <b>有请求数限制</b>
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.LOAD_FAVORIT_LIST_RESULT</b><br/>
         * result为一个MicroBlogStatus对象数组.</p>
         *
         * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/>
         * type为<b>MicroErrorEvent.LOAD_FAVORIT_LIST_ERROR</b><br/>
         * message为错误描述.</p>
         *
         * @param page  可选参数. 返回结果的页序号。注意:有分页限制.
         *
         *
         */
        public function loadFavoriteList(page:uint=0):void
        {
            addProcessor(LOAD_FAVORITE_LIST_REQUEST_URL, processStatusArray, MicroBlogEvent.LOAD_FAVORITE_LIST_RESULT, MicroBlogErrorEvent.LOAD_FAVORITE_LIST_ERROR);

            var url:String=LOAD_FAVORITE_LIST_REQUEST_URL;
            var params:Object=new Object();
            if ( page > 0 )
            {
                params["page"]=page.toString();
            }
            executeRequest(LOAD_FAVORITE_LIST_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET));
        }

        /**
         * 收藏一条微博信息.
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.ADD_TO_FAVORITES_RESULT</b><br/>
         * result为一个MicroBlogStatus对象.</p>
         *
         * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/>
         * type为<b>MicroErrorEvent.ADD_TO_FAVORITES_ERROR</b><br/>
         * message为错误描述.</p>
         *
         * @param statusID 必填参数, 要收藏的微博id.
         *
         */
        public function addToFavorites(statusID:uint):void
        {
            if ( statusID <= 0 )
            {
                return;
            }
            addProcessor(ADD_TO_FAVORITES_REQUEST_URL, processStatus, MicroBlogEvent.ADD_TO_FAVORITES_RESULT, MicroBlogErrorEvent.ADD_TO_FAVORITES_ERROR);

            var postData:URLVariables=new URLVariables();
            postData.id=statusID.toString();
            var req:URLRequest=getMicroBlogRequest(ADD_TO_FAVORITES_REQUEST_URL, postData, URLRequestMethod.POST);
            req.data=postData;
            executeRequest(ADD_TO_FAVORITES_REQUEST_URL, req);
        }

        /**
         * 从收藏列表里删除一条微博信息.
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.ADD_TO_FAVORITES_RESULT</b><br/>
         * result为一个MicroBlogStatus对象.</p>
         *
         * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/>
         * type为<b>MicroErrorEvent.ADD_TO_FAVORITES_ERROR</b><br/>
         * message为错误描述.</p>
         *
         * @param statusID 必填参数, 要收藏的微博id.
         *
         */
        public function removeFromFavorites(statusID:uint):void
        {
            if ( statusID <= 0)
            {
                return;
            }
            addProcessor(REMOVE_FROM_FAVORITES_REQUEST_URL, processStatus, MicroBlogEvent.REMOVE_FROM_FAVORITES_RESULT, MicroBlogErrorEvent.REMOVE_FROM_FAVORITES_ERROR);
            var postData:URLVariables = new URLVariables();
            var req:URLRequest=getMicroBlogRequest(REMOVE_FROM_FAVORITES_REQUEST_URL.replace("$id", statusID), postData, URLRequestMethod.POST);
            req.data = postData;
            executeRequest(REMOVE_FROM_FAVORITES_REQUEST_URL, req);
        }

//        /**
//         * 允许/禁止通知更新给指定用户.
//         *
//         * <b>有请求数限制</b>
//         *
//         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
//         * type为<b>MicroBlogEvent.FOLLOW_NOTIFICATION_RESULT</b><br/>
//         * result为一个MicroBlogUser对象.</p>
//         *
//         * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/>
//         * type为<b>MicroErrorEvent.FOLLOW_NOTIFICATION_ERROR</b><br/>
//         * message为错误描述.</p>
//         *
//         * @param isEnable 必选参数
//         * @param user 指定的用户ID或用户帐号.
//         * @param page  指定的用户UID.
//         * @param screenName 指定的用户帐号
//         *
//         * 以上三个可选参数必须设置一个
//         *
//         */
//        public function enableNotification(isEnable:Boolean, user:String=null, userID:uint=0, screenName:String=null):void
//        {
//            addProcessor(ENABLE_NOTIFICATION_REQUEST_URL, processUser, MicroBlogEvent.ENABLE_NOTIFICATION_RESULT, MicroBlogErrorEvent.ENABLE_NOTIFICATION_ERROR);
//            var hasParam:Boolean=false;
//            if (user && user.length > 0)
//            {
//                user="/" + user;
//                hasParam=true;
//            }
//            else
//            {
//                user="";
//            }
//            var url:String;
//            if (isEnable)
//            {
//                url=ENABLE_NOTIFICATION_REQUEST_URL.replace("$enabled", "follow");
//            }
//            else
//            {
//                url=ENABLE_NOTIFICATION_REQUEST_URL.replace("$enabled", "leave");
//            }
//            url=url.replace("$user", user);
//            var postData:URLVariables=new URLVariables();
//            if (userID > 0)
//            {
//                postData.user_id=userID;
//                hasParam=true;
//            }
//            if (screenName && screenName.length > 0)
//            {
//                postData.screen_name=StringEncoders.urlEncodeUtf8String(screenName);
//                hasParam=true;
//            }
//            if (!hasParam)
//            {
//                return;
//            }
//            var req:URLRequest=getMicroBlogRequest(url, postData, URLRequestMethod.POST);
//            req.data=postData;
//            executeRequest(ENABLE_NOTIFICATION_REQUEST_URL, req);
//        }
//
        /**
         * 返回省份,城市的名字对应id的列表,为xml格式.
         *
         * <b>有请求数限制</b>
         *
         * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/>
         * type为<b>MicroBlogEvent.LOAD_PROVINCE_CITY_ID_LIST_RESULT</b><br/>
         * result为一个XML对象.</p>
         *
         * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/>
         * type为<b>MicroErrorEvent.LOAD_PROVINCE_CITY_ID_LIST_ERROR</b><br/>
         * message为错误描述.</p>
         *
         * <p>返回的xml数据格式请参看新浪微博开放平台 http://open.t.sina.com.cn
         * </p>
         *
         * <p>要想获取省份id为11,城市id为1的地址信息可以参考以下方法<br/>
         * <pre>
         * var prov:XML = provinces.province.(@id == "11")[0];
         * province = prov.@name;
         * city = prov.city.(@id == "1")[0].@name;
         * </pre>
         * 通过名字得到id可以参考如下方法<br/>
         * <pre>
         * var prov:XML = provinces.province.(@name == "北京")[0];
         * provinceID = prov.@id;
         * cityID = prov.city.(@name == "东城区")[0].@id;
         * </pre>
         * </p>
         */
        public function loadProvinceCityIDList():void
        {
            addProcessor(LOAD_PROVINCE_CITY_ID_LIST, processProvincesXML, MicroBlogEvent.LOAD_PROVINCE_CITY_ID_LIST_RESULT, MicroBlogErrorEvent.LOAD_PROVINCE_CITY_ID_LIST_ERROR);
            executeRequest(LOAD_PROVINCE_CITY_ID_LIST, getMicroBlogRequest(LOAD_PROVINCE_CITY_ID_LIST, null) );
        }
        //Event handler

        private function addProcessor(name:String, dataProcess:Function, resultEventType:String, errorEventType:String):void
        {
            if (null == serviceLoader[name])
            {
                var loader:URLLoader=new URLLoader();
                loader.addEventListener(Event.COMPLETE, loader_onComplete);
                loader.addEventListener(IOErrorEvent.IO_ERROR, loader_onError);
                loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, loader_onSecurityError);
                serviceLoader[name]=loader;
                loaderMap[loader]={dataFunc: dataProcess, resultEvent: resultEventType, errorEvent: errorEventType};
            }
        }

        private function executeRequest(name:String, req:URLRequest):void
        {
            var urlLoader:URLLoader = serviceLoader[name] as URLLoader;
            lastLoader = urlLoader;
            lastRequest = req;
            urlLoader.load(req);
        }

        private function loader_onComplete(event:Event):void
        {
            var loader:URLLoader=event.target as URLLoader;
            var processor:Object=loaderMap[loader];
            var dataStr:String = loader.data as String;
            if ( dataStr.length  <= 0 )
            {
                var ioError:MicroBlogErrorEvent = new MicroBlogErrorEvent(MicroBlogErrorEvent.NET_WORK_ERROR);
                ioError.message = "The network error";
                dispatchEvent(ioError);
                return;
            }
            var result:XML=new XML(loader.data);

            if (result.child("error").length() > 0)
            {
                var error:MicroBlogErrorEvent=new MicroBlogErrorEvent(processor.errorEvent);
                error.message="Error " + result.error_code + " : " + result.error;
                dispatchEvent(error);
            }
            else
            {
                var e:MicroBlogEvent=new MicroBlogEvent(processor.resultEvent);
                e.result=processor.dataFunc(result);
                e.nextCursor=Number(result.next_cursor);
                e.previousCursor=Number(result.previous_cursor);
                dispatchEvent(e);
            }
            //trace(loader.data);
        }

        private function loader_onError(event:IOErrorEvent):void
        {
            var loader:URLLoader=event.target as URLLoader;
            var processor:Object=loaderMap[loader];
            var error:MicroBlogErrorEvent=new MicroBlogErrorEvent(processor.errorEvent);
            error.message=event.text;
            dispatchEvent(error);
        }

        private function loader_onSecurityError(event:SecurityErrorEvent):void
        {
            dispatchEvent(event);
        }

        private function getMicroBlogRequest(url:String, params:Object, requestMethod:String="GET"):URLRequest
        {
            var req:URLRequest;

            if ( null == params )
            {
                params = new Object();
            }
            params["source"] = source;
            if ( accessTokenKey.length > 0)
            {
                req=signRequest(requestMethod, url, params, false);
            }
            else
            {
                if (requestMethod == URLRequestMethod.GET)
                {
                    url+=makeGETParamString(params);
                }
                req=new URLRequest(url);
                if ( authHeader )
                {
                    req.requestHeaders.push(authHeader);
                }
            }
            req.method=requestMethod;
            return req;
        }

        private function processStatusArray(statuses:XML):Array
        {
            var microBlogStatus:MicroBlogStatus;
            var statusArray:Array=[];
            for each (var status:XML in statuses.status)
            {
                microBlogStatus=new MicroBlogStatus(status);
                statusArray.push(microBlogStatus);
            }
            return statusArray;
        }

        private function processStatus(status:XML):MicroBlogStatus
        {
            return new MicroBlogStatus(status);
        }

        private function processCommentArray(comments:XML):Array
        {
            var microBlogComment:MicroBlogComment;
            var commentArray:Array=[];
            for each (var comment:XML in comments.comment)
            {
                microBlogComment=new MicroBlogComment(comment);
                commentArray.push(microBlogComment);
            }
            return commentArray;
        }

        private function processComment(comment:XML):MicroBlogComment
        {
            return new MicroBlogComment(comment);
        }

        private function processCounts(counts:XML):Array
        {
            var countArray:Array=[];
            var count:MicroBlogCount;
            for each (var countValue:XML in counts.children())
            {
                count=new MicroBlogCount(countValue);
                countArray.push(count);
            }
            return countArray;
        }

        private function processUser(user:XML):MicroBlogUser
        {
            return new MicroBlogUser(user);
        }

        private function processUserArray(users:XML):Array
        {
            var userArray:Array=[];
            var mbUser:MicroBlogUser;
            for each (var userValue:XML in users.user)
            {
                mbUser=new MicroBlogUser(userValue);
                userArray.push(mbUser);
            }
            return userArray;
        }

        private function processDirectMessageArray(messages:XML):Array
        {
            var messageArray:Array=[];
            var mbMessage:MicroBlogDirectMessage;
            for each (var messageValue:XML in messages.direct_message)
            {
                mbMessage=new MicroBlogDirectMessage(messageValue);
                messageArray.push(mbMessage);
            }
            return messageArray;
        }

        private function processDirectMessage(message:XML):MicroBlogDirectMessage
        {
            return new MicroBlogDirectMessage(message);
        }

//        private function processBoolean(message:XML):Boolean
//        {
//            return message.toString() == "true";
//        }

        private function processRelationship(message:XML):MicroBlogUsersRelationship
        {
            return new MicroBlogUsersRelationship(message);
        }

        private function processIDSArray(message:XML):Array
        {
            var ar:Array=[];
            for each (var id:XML in message.ids[0].children())
            {
                ar.push(uint(id.toString()));
            }
            return ar;
        }
        private function processRateLimit(message:XML):MicroBlogRateLimit
        {
            return new MicroBlogRateLimit(message);
        }
        private function processLogout(user:XML):MicroBlogUser
        {
            _accessTokenKey = "";
            _accessTokenSecret = "";
            authHeader = null;
            return new MicroBlogUser(user);
        }
        private function processProvincesXML(result:XML):XML
        {
            return result;
        }
        private function makeGETParamString(parameters:Object):String
        {
            var paramStr:String=makeParamsToUrlString(parameters);
            if (paramStr.length > 0)
            {
                paramStr="?" + paramStr;
            }
            return paramStr;
        }

        private function makeQueryCombinatory(params:Object, sinceID:uint, maxID:uint, count:uint, page:uint):void
        {

            if (sinceID > 0)
            {
                params[SINCE_ID]=sinceID;

            }
            if (maxID > 0)
            {
                params[MAX_ID]=maxID;

            }
            if (count > 0)
            {
                params[COUNT]=count;

            }
            if (page > 0)
            {
                params[PAGE]=page;
            }

        }

        private function makeUserParams(params:Object, userID:uint, screenName:String, cursor:Number):void
        {

            if (userID > 0)
            {
                params[USER_ID]=userID;

            }
            if (screenName)
            {
                params[SCREEN_NAME]=screenName;

            }
            if (cursor >= 0)
            {
                params[CURSOR]=cursor;

            }

        }

        private function makeBoundary():String
        {
            var boundary:String="";

            for (var i:int=0; i < 13; i++)
            {
                boundary+=String.fromCharCode(int(97 + Math.random() * 25));
            }
            boundary="---------------------------" + boundary;

            return boundary;
        }

        private function encodeMsg(status:String):String
        {
            return StringEncoders.urlEncodeSpecial(status);
        }

        private function makeMultipartPostData(boundary:String, imgFieldName:String, filename:String, imgData:ByteArray, params:Object):Object
        {
            var req:URLRequest=new URLRequest();
            var postData:ByteArray=new ByteArray();
            postData.endian=Endian.BIG_ENDIAN;
            var value:String;

            //add params to the post data.
            if (params)
            {
                for (var name:String in params)
                {
                    boundaryPostData(postData, boundary);
                    addLineBreak(postData);
                    //writeStringToByteArray(postData, CONTENT_DISPOSITION_BASIC.replace("$name", name));
                    postData.writeUTFBytes(CONTENT_DISPOSITION_BASIC.replace("$name", name));
                    addLineBreak(postData);
                    addLineBreak(postData);
                    postData.writeUTFBytes(params[name]);
                    addLineBreak(postData);
                }
            }
            //add image;
//            --BbC04y
//            Content-Disposition: file; filename="file2.jpg"
//            Content-Type: image/jpeg
//            Content-Transfer-Encoding: binary
//
//            ...contents of file2.jpg...
//            --BbC04y--

            boundaryPostData(postData, boundary);
            addLineBreak(postData);
            //writeStringToByteArray(postData, CONTENT_DISPOSITION_BASIC.replace("$name", "files") + ‘; filename="‘+filename + ‘"‘);
            postData.writeUTFBytes(CONTENT_DISPOSITION_BASIC.replace("$name", imgFieldName) + ‘; filename="‘ + filename + ‘"‘);
            addLineBreak(postData);
            //writeStringToByteArray(postData, CONTENT_TYPE_JPEG);
            postData.writeUTFBytes(CONTENT_TYPE_JPEG);
            addLineBreak(postData);
            //writeStringToByteArray(postData,CONTENT_TRANSFER_ENCODING);
            //postData.writeUTFBytes(CONTENT_TRANSFER_ENCODING);
            //addLineBreak(postData);
            addLineBreak(postData);
            postData.writeBytes(imgData, 0, imgData.length);
            addLineBreak(postData);

            boundaryPostData(postData, boundary);
            addDoubleDash(postData);

            trace(postData.toString());
            postData.position=0;
            return postData;
        }

        private function boundaryPostData(data:ByteArray, boundary:String):void
        {
            var len:int=boundary.length;
            addDoubleDash(data);
            for (var i:int=0; i < len; ++i)
            {
                data.writeByte(boundary.charCodeAt(i));
            }
        }

        private function addDoubleDash(data:ByteArray):void
        {
            data.writeShort(0x2d2d);
        }

        private function addLineBreak(data:ByteArray):void
        {
            data.writeShort(0x0d0a);
        }

        private function signRequest(requestMethod:String, url:String, requestParams:Object, useHead:Boolean=false):URLRequest
        {
            var method:String=requestMethod.toUpperCase();
            var oauthParams:Object=getOAuthParams();
            var params:Object=new Object;
            for (var key:String in oauthParams)
            {
                params[key]=oauthParams[key];
            }
            for (var key1:String in requestParams)
            {
                params[key1]=requestParams[key1];
            }

            var req:URLRequest=new URLRequest();
            req.method=method;
            req.url=url;
            var paramsStr:String=makeSignableParamStr(params);
            var msgStr:String=StringEncoders.urlEncodeUtf8String(requestMethod.toUpperCase()) + "&";
            msgStr+=StringEncoders.urlEncodeUtf8String(url);
            msgStr+="&";
            msgStr+=StringEncoders.urlEncodeUtf8String(paramsStr);

            var secrectStr:String=_consumerSecret + "&";
            if (_accessTokenSecret.length > 0 && _accessTokenKey.length > 0)
            {
                secrectStr+=_accessTokenSecret;
            }
            var sig:String=Base64.encode(HMAC.hash(secrectStr, msgStr, SHA1));
            // The matchers are specified in OAuth only.
            sig = sig.replace(/\+/g, "%2B");

            oauthParams["oauth_signature"]=sig;
            trace("BaseString:::::", msgStr);
            trace("signature::::", sig);

            if (method == URLRequestMethod.GET)
            {
                if (useHead)
                {
                    req.url+=("?" + makeSignableParamStr(requestParams));
                    req.requestHeaders.push(makeOauthHeaderFromArray(oauthParams));
                }
                else
                {
                    req.url+=("?" + paramsStr + ‘&oauth_signature=‘ + sig);
                }
            }
            else if (requestMethod == URLRequestMethod.POST)
            {
                req.requestHeaders.push(makeOauthHeaderFromArray(oauthParams));
            }
            return req;
        }

        private function makeSignableParamStr(params:Object):String
        {
            var retParams:Array=[];

            for (var param:String in params)
            {
                if (param != "oauth_signature")
                {
                    retParams.push(param + "=" + StringEncoders.urlEncodeUtf8String(params[param].toString()));
                    //retParams.push(param + "=" +params[param].toString());
                }    

            }

            retParams.sort();

            return retParams.join("&");
        }

        private function makeParamsToUrlString(params:Object):String
        {
            var retParams:Array=[];

            for (var param:String in params)
            {
                retParams.push(param + "=" + params[param].toString());
            }

            retParams.sort();

            return retParams.join("&");
        }

        private function makeOauthHeaderFromArray(params:Object):URLRequestHeader
        {
            var oauthHeaderValue:String=‘OAuth realm="‘ + API_BASE_URL + ‘",‘;
            var parseParams:Array=[];
            for (var key:String in params)
            {
                parseParams.push(key + ‘="‘ + params[key] + ‘"‘);
            }
            oauthHeaderValue+=parseParams.join(",");

            var reqHeader:URLRequestHeader=new URLRequestHeader("Authorization", oauthHeaderValue);
            return reqHeader;
        }

        private function getOAuthParams():Object
        {
            var params:Object=new Object;
            var now:Date=new Date();

            params["oauth_consumer_key"]=_consumerKey;
            if (_accessTokenKey.length > 0)
            {
                params["oauth_token"]=_accessTokenKey;
            }
            if ( _pin && _pin.length > 0 )
            {
                params["oauth_verifier"] = _pin;
            }
            params["oauth_signature_method"]="HMAC-SHA1";
            params["oauth_timestamp"]=now.time.toString().substr(0, 10);
            params["oauth_nonce"]=GUID.createGUID();
            params["oauth_version"]="1.0";
            params["oauth_callback"]="oob";
            return params;
        }

        private function oauthLoader_onComplete(event:Event):void
        {
            trace(oauthLoader.data);
            var needRequestAuthorize:Boolean=_accessTokenKey.length == 0;
            var result:String=oauthLoader.data as String;

            if (result.length > 0)
            {
                var urlVar:URLVariables=new URLVariables(oauthLoader.data);
                _accessTokenKey=urlVar.oauth_token;
                _accessTokenSecret=urlVar.oauth_token_secret;
                if (needRequestAuthorize)
                {
                    requestAuthorize();
                    needRequestAuthorize=false;
                }
                else
                {
                    var e:MicroBlogEvent=new MicroBlogEvent(MicroBlogEvent.OAUTH_CERTIFICATE_RESULT);
                    e.result={oauthTokenKey: _accessTokenKey, oauthTokenSecrect: _accessTokenSecret};
                    dispatchEvent(e);
                    verifyCredentials();
                }
            }

        }

        private function oauthLoader_onError(event:IOErrorEvent):void
        {
            //var urlData:URLVariables = new URLVariables(oauthLoader.data);
            var e:MicroBlogErrorEvent = new MicroBlogErrorEvent(MicroBlogErrorEvent.OAUTH_CERTIFICATE_ERROR);
            e.message = oauthLoader.data;
            dispatchEvent(e);
        }

        private function oauthLoader_onSecurityError(event:SecurityErrorEvent):void
        {
            dispatchEvent(event);
        }

        private function requestAuthorize():void
        {
            var url:String=OAUTH_AUTHORIZE_REQUEST_URL;
            url+="?oauth_token=" + StringEncoders.urlEncodeUtf8String(_accessTokenKey);
            url+="&oauth_callback=oob";
            navigateToURL(new URLRequest(url));
        }
    }
}
时间: 2024-10-22 16:03:05

microblog actionscript API的相关文章

ActionScript 3操作XML 详解

AS3引入了E4X ,它是根据ECMAScript标准处理XML 数据的全新机制.这使得程序员在程序中无缝地操作XML.在AS3中可以使用XML字面值将XML数据直接写入代码,该字面值将被自动解析. 一.AS3中的XML入门 1.可以将XML直接写入代码 public var employeelist:XML=<employeelist> <employee> <name first="Conan" last="O'Brien" /&g

Flash的视频神奇StageVideo

在过去的几年里,视频已经成为web网页上最主流的趋势之一,这主要是由Adobe Flash Player来推动的.2007年Flash Player 9中引入了H.264和全屏支持技术,通过在web页面上的沉浸式高清视频体验,实实在在地改变了局面.最近,在移动设备上实现的Flash Player已经为Adobe公司的Flash Player项目组带来了新的思路,这些新的思路将帮助项目组解决如何在Flash中播放视频以及如何持续增强用户体验等问题.Stage video便是这些投入所得的成果. F

[译林军] 译~CrossBridge 简介

本文由 9ria 社区译林军翻译,转载请注明出处.加入译林军 :http://bbs.9ria.com/thread-286920-1-1.html CrossBridge 是  Adobe  FlasCC 的开源版本(原 Alchemy 项目). 结合强大.熟悉和高性能的 C/C++ 到 Web.用 CrossBridge 可以把游戏机和电脑的 C/C++ 带到超过十亿人的网络上 - 跨浏览器,无需额外安装. 令人惊叹的原生游戏,欢迎来到 Web . <ignore_js_op>观看 Epi

Flex回声消除的最佳方法

Adobe Flash Player 已经成为音频和视频播放的非常流行的工具.实际上,目前大多数因特网视频均使用 Flash Player观看. Flash Player 通过将许多技术进行组合可以提供具有丰富视觉体验和效率的高质量的播放功能,这些技术包括高级音频和视频压缩方法 (H.264.MP3和 AAC codecs).通用媒体功能 (多速率流媒体.播放列表.搜寻和其它功能) 和高效的播放机制 (硬件解码和直接渲染)等. 由于Flash Player 在桌面计算机上的广泛应用已经在移动设备

Adobe Scout 使用参考说明

Adobe Scout 用于优化 Flash 内容,是一款极为强大的工具,因为它能让您看到 Flash Player 幕后正在发生的事情.但是若明白 Flash Player 为什么做这些事情,您看到这些事情才会最有用.只有这样,您才能有效地找到修复 Scout 所告知的问题的方法! 本文的目的是让您大致了解 Flash Player 的工作原理,并将之与您在 Scout 中看到的信息相关联.本文也是 Scout 中所用术语的参考指南,因此您可以从中查找 Flash Player 执行的各种活动

Actionscript,AS3,MXML,Flex,Flex Builder,Flash Builder,Flash,AIR,Flash Player之关系

转自zrong's blog:http://zengrong.net/post/1295.htm ActionScript ActionScript通常简称为AS,它是Flash平台的语言.AS编写的程序,最终可以编译成SWF.SWC.SWF就是我们常说的Flash动画.但是现在SWF已经不仅仅是动画,而是RIA的载体. ActionScript有3个版本,分别是1.0版(AS1),2.0版(AS2)和3.0版(AS3).只有Flash Player 9及以上播放器才支持AS3编译的SWF.这三

国内值得关注的官方API集合

项目地址:https://github.com/marktony/Awesome_API 本页仅收集国内部分官方API,如需查看其他版本,请点击这里. 目录 笔记 出行 词典 电商 地图 电影 后端云 即时通讯 开发者网站 快递查询 旅游 社交 视频 天气 图片与图像处理 外卖 消息推送 音乐 云 语音识别 综合 笔记 为知笔记 - 为知笔记Windows客户端开放了大量的API,其中绝大部分,都通过COM提供,可以在javascript, C#, C++, Delphi等语言中使用.接口通过I

不写画面的网页程序设计,Web API、Web Service、WCF Service

客户有一个系统,经常要连上我方,查询数据 以前的作法是给对方一个账号,让他可以连上我们的DB来查询. 所以,早期的同仁,真的给他们DB链接字符串 客户的Windows程序.网站就真的靠这么危险的方式,连上我们公司的DB. 但怎么想都觉得危险,而且...... 如果对方SQL指令乱下,把效能搞得更烂,岂不是惨兮兮? 如果对方不小心,配置文件被偷走,看到我方DB Connection String怎么办? 几年前的 Internet还没有那么大的带宽,所以还得种种限制,避免他们一次查询太多数据 我接

FlashPaper组件——api

属性摘要 属性 说明 documentPath:String FlashPaper文件的路径. borderThickness:Number 边框宽度. borderColor:String 边框颜色. UIElements:Object 外观元素的可见性. currentZoom:Object 默认缩放比例. width:Number FlashPaper文件的宽度. height:Number FlashPaper文件的高度. UIElements属性的图示 事件摘要 事件 说明 onLoa