博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
开源中国动弹客户端实践(三)
阅读量:5751 次
发布时间:2019-06-18

本文共 13763 字,大约阅读时间需要 45 分钟。

  hot3.png

我们只知道通讯的请求和结果,逻辑结构并不是完全明白。

在这里我想将每条动弹的信息原封不动的显示在界面中。
所以需要控件做一些扩展,来将HTML标记转换为视图。
WPF可以很完美的实现自定义控件,开发者的Idea可以很简洁的被呈现,这是我选择WPF的原因。
接下来将构筑控件,这里利用到了WebBrowser,HtmlAgilityPack

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ComponentModel;using System.Net;using System.IO;namespace OCMove{    public enum HttpMethodType    {        [Description("GET")]        GET = 0,        [Description("POST")]        POST = 1,        [Description("PUT")]        PUT = 2,    }    public class HttpObject    {        public virtual string Send(HttpMethodType method,             string hostUrl,             string queryString,             WebHeaderCollection header,             byte[] requestBody,             IWebProxy proxy,             CookieContainer cc,            int timeout,             AsyncCallback callback)        {            string methodType = "GET";            string url = hostUrl;            string referer = "";            Uri uriRequest = null;            bool bkeeplive = true;            string useragent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)";            string contenttype = "application/x-www-form-urlencoded";            #region Method            switch (method)            {                case HttpMethodType.POST:                    {                        methodType = "POST";                        break;                    }                case HttpMethodType.PUT:                    {                        methodType = "PUT";                        break;                    }                case HttpMethodType.GET:                default:                    {                        methodType = "GET";                        break;                    }            }            #endregion //Method            #region URL            if (!string.IsNullOrEmpty(queryString))            {                url = string.Format("{0}?{1}", hostUrl, queryString);            }            uriRequest = new Uri(url);            if (uriRequest.ToString().ToLower().StartsWith("https"))            {                ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);            }            System.Net.ServicePointManager.Expect100Continue = false;            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uriRequest);            #endregion //URL            #region Headers            if (header != null)            {                                referer = header[HttpRequestHeader.Referer] as string;                bkeeplive = Convert.ToBoolean(header[HttpRequestHeader.KeepAlive]);                                useragent = header[HttpRequestHeader.UserAgent] as string;                contenttype = header[HttpRequestHeader.ContentType] as string;                //request.Headers = header;            }            #endregion //Headers            #region Settings            if (!string.IsNullOrEmpty(referer))            {                request.Referer = referer;            }            request.Proxy = proxy == null ? HttpWebRequest.DefaultWebProxy : proxy;            request.CookieContainer = cc;            request.KeepAlive = bkeeplive==null ? true : bkeeplive;            request.UserAgent = string.IsNullOrEmpty(useragent) ? "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)" : useragent;            request.Timeout = timeout;            request.Method = methodType;            #endregion //Settings            if (method == HttpMethodType.POST ||                method == HttpMethodType.PUT)            {                request.ContentType = string.IsNullOrEmpty(contenttype) ? "application/x-www-form-urlencoded" : contenttype;                request.ContentLength = requestBody.Length;                Stream newStream = request.GetRequestStream();                newStream.Write(requestBody, 0, requestBody.Length);                newStream.Close();            }            try            {                if (callback == null)                {                    HttpWebResponse response = (HttpWebResponse)request.GetResponse();                    Encoding encoding = !string.IsNullOrEmpty(response.ContentEncoding) ? Encoding.GetEncoding(response.ContentEncoding) : Encoding.UTF8;                    Stream stream = response.GetResponseStream();                    using (StreamReader reader = new StreamReader(stream, encoding))                    {                      return  reader.ReadToEnd();                    }                                   }                else                {//使用异步方式                    request.BeginGetResponse(callback, request);                }                return HttpStatusCode.OK.ToString();            }            catch (Exception ex)            {                return ex.Message;            }        }        //https        private static bool CheckValidationResult(object sender,            System.Security.Cryptography.X509Certificates.X509Certificate certificate,            System.Security.Cryptography.X509Certificates.X509Chain chain,            System.Net.Security.SslPolicyErrors errors)        { // Always accept            return true;        }    }    public class HttpAction : HttpObject    {        #region Constructors        public HttpAction()        {         }        public HttpAction(HttpMethodType mode,string url)            : this(mode, url, null, null)        {        }        public HttpAction(HttpMethodType mode, string url,string bodydata)            : this(mode, url, null, bodydata)        {        }        public HttpAction(HttpMethodType mode, string url, WebHeaderCollection headers)            :this(mode,url,headers,null)        {        }        public HttpAction(HttpMethodType mode, string url,WebHeaderCollection headers ,string bodydata)        {            this.ActionMode = mode;            this.Url = url;            if (headers != null)            {                this.RequestHeaders = headers;            }            if (!string.IsNullOrEmpty(bodydata))            {                this.BodyData = bodydata;            }            this.Encoding = Encoding.UTF8;            RequestHeaders = new WebHeaderCollection();        }        #endregion         private CookieContainer m_Cookies = new CookieContainer();        private int m_TimeOut = 3000;        private string m_ContentType = "application/x-www-form-urlencoded";        private WebHeaderCollection m_ResponseHeaders = new WebHeaderCollection();        public HttpMethodType ActionMode{get;set;}        public string Url { get; set; }        public string QueryText { get; set; }        public WebHeaderCollection RequestHeaders { get; set; }        public string BodyData { get; set; }        public Encoding Encoding { get; set; }        ///         /// 设置连接超时时间(ms)        ///         public int TimeOut        {            set { m_TimeOut = value; }            get { return m_TimeOut; }        }        ///         /// 设置/获取CookieContainer        ///         public CookieContainer Cookies        {            get { return m_Cookies; }            set { m_Cookies = value; }        }                ///         /// 设置请求的内容类型        ///         public string ContentType        {            set { m_ContentType = value; }            get {return m_ContentType;}        }                ///         /// 获取或者设置请求返回的HTTP标头        ///         public WebHeaderCollection ResponseHeaders        {            get { return m_ResponseHeaders; }        }        ///         /// 回调事件(声明了回调函数则使用异步请求)        ///         public event EventHandler
ResponseComplate;        private void RespCallback(IAsyncResult result)        {             string responseText  ="";            HttpStatusCode code = HttpStatusCode.Unused;             try             {                 HttpWebRequest request = (HttpWebRequest)result.AsyncState;                 HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);                 this.m_ResponseHeaders = response.Headers;                 code = response.StatusCode;                 Encoding encoding = !string.IsNullOrEmpty(response.ContentEncoding) ? Encoding.GetEncoding(response.ContentEncoding) : Encoding.UTF8;                 Stream stream = response.GetResponseStream();                 using (StreamReader reader = new StreamReader(stream, encoding))                 {                     responseText = reader.ReadToEnd();                 }             }             catch (Exception ex)             { responseText = ex.Message; }            if (this.ResponseComplate != null)            {                this.ResponseComplate(this, new ResponseComplatedArgs(responseText, m_ResponseHeaders, code));            }        }        public void Invoke()        {            base.Send(this.ActionMode, this.Url, this.QueryText, this.RequestHeaders, this.Encoding.GetBytes(this.BodyData), null, this.Cookies, this.TimeOut, new AsyncCallback(RespCallback));        }    }    public class ResponseComplatedArgs:EventArgs    {        private string m_Data ="";        public string ResponseData{get{return m_Data;}}        private WebHeaderCollection m_Headers = new WebHeaderCollection();        public WebHeaderCollection ResponseHeaders { get { return m_Headers; } }        public HttpStatusCode StatusCode { get; private set; }        public ResponseComplatedArgs()        {}        public ResponseComplatedArgs(string data, WebHeaderCollection headers,HttpStatusCode code)        {             m_Data=data;             m_Headers = headers;             this.StatusCode = code;         }    }}
 

对开源中国的通信进行实装(未完成)。

using System;using System.Text;using System.Net;using System.IO;using System.Collections.Generic;using System.ComponentModel;namespace OCMove{       public class OSChina    {        #region Actions        private HttpAction ACTION_LOGIN = new HttpAction(HttpMethodType.POST, "https://www.oschina.net/action/user/hash_login");        private HttpAction ACTION_DONGTAN = new HttpAction(HttpMethodType.POST, "http://www.oschina.net/action/tweet/pub");        private HttpAction ACTION_REFRESH = new HttpAction(HttpMethodType.GET, "http://www.oschina.net/widgets/check-top-log?last=undefined");        private HttpAction ACTION_ANSWER = new HttpAction(HttpMethodType.POST, "http://my.oschina.net/action/tweet/rpl");        private HttpAction ACTION_MY_INFO = new HttpAction(HttpMethodType.POST, "http://www.oschina.net/action/api/my_information");        #endregion//Actions        #region Constructors               public OSChina()        {            Init();        }        public OSChina(string email,string pwd)        {            this.Email = email;            this.Pwd = pwd;            Init();        }        private void Init()        {            ACTION_LOGIN.ResponseComplate += new EventHandler
(ACTION_LOGIN_ResponseComplate);            ACTION_MY_INFO.ResponseComplate += new EventHandler
(ACTION_MY_INFO_ResponseComplate);        }        #endregion //        #region Properties        public bool HasLogined        {            get;            private set;        }        public string Email        {            get;            set;        }        public string Pwd        {            get;private set;        }        public int UserCode        {            get;            private set;        }        public string UserName        {            get;            private set;        }        public Uri HomePage        {            get;            private set;        }        public CookieCollection Cookies        {            get;            private set;        }        public Cookie OscidCookie        {            get;            private set;        }                   #endregion //Properties        #region Methods        #region LoginAction        public event EventHandler
LoginComplated;                public virtual void Login()        {            ACTION_LOGIN.RequestHeaders.Add(HttpRequestHeader.Referer, "https://www.oschina.net/home/login?goto_page=http%3A%2F%2Fwww.oschina.net%2F");            ACTION_LOGIN.BodyData = string.Format("email={0}&pwd={1}&keep_login=1",this.Email,this.Pwd);            ACTION_LOGIN.Cookies = new CookieContainer();            ACTION_LOGIN.Invoke();        }        void ACTION_LOGIN_ResponseComplate(object sender, ResponseComplatedArgs e)        {           if( e.StatusCode == HttpStatusCode.OK)           {               this.HasLogined = true;               this.Cookies = ACTION_LOGIN.Cookies.GetCookies(new Uri("https://www.oschina.net"));               foreach (Cookie c in this.Cookies)               {                   if ("oscid".Equals(c.Name))                   {                       this.OscidCookie = c;                       break;                   }               }           }            if (this.LoginComplated != null)            {                this.LoginComplated(this,e);            }        }        #endregion //Login        public virtual void GetMyInformation()        {            ACTION_MY_INFO.Cookies = new CookieContainer();            ACTION_LOGIN.Cookies.Add( this.OscidCookie);            ACTION_MY_INFO.Invoke();        }        void ACTION_MY_INFO_ResponseComplate(object sender, ResponseComplatedArgs e)        {        }        #endregion//Methods    }}

现在进行下简单验证,首先是登录。

string email = "******@gmail.com";            string pwd = "****";            OSChina osc = new OSChina(email,pwd.ToSHA1());            osc.LoginComplated += new EventHandler
(osc_LoginComplated); osc.Login();

转载于:https://my.oschina.net/jickie/blog/149125

你可能感兴趣的文章
【React】为什么我不再使用setState?
查看>>
Git原理与高级使用(3)
查看>>
从JDK源码看Writer
查看>>
Express 结合 Webpack 实现HMRwi
查看>>
基于protobuf的RPC实现
查看>>
坚信每个人都能成为品牌
查看>>
JAVA的对象复制
查看>>
jquery要怎么写才能速度最快?(转)
查看>>
cisco设备IOS上传、备份、设置启动IOS
查看>>
打开Office报错
查看>>
我的友情链接
查看>>
AsyncTask简易使用
查看>>
关于PHP sessions的超时设置
查看>>
HAProxy负载均衡原理及企业级实例部署haproxy集群
查看>>
开源中国动弹客户端实践(三)
查看>>
Win 8创造颠覆性体验:预览版关键更新
查看>>
vim在多文件中复制粘贴内容
查看>>
Android ContentObserver
查看>>
文章“关于架构优化和设计,架构师必须知道的事情”
查看>>
疯狂java学习笔记1002---非静态内部类
查看>>