首页 > Web开发 > 详细

HttpWebRequest

时间:2015-06-29 19:21:38      阅读:328      评论:0      收藏:0      [点我收藏+]

Request 

封装一个请求信息类

    /// <summary>
    /// The request.
    /// </summary>
    public class Request
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="Request"/> class.
        /// </summary>
        /// <param name="url">
        /// The url.
        /// </param>
        public Request(string url)
        {
            this.Url = url;
        }

        /// <summary>
        /// 请求目标地址
        /// </summary>
        public string Url { get; private set; }

        /// <summary>
        /// Referer HTTP 标头的值
        /// </summary>
        public string Referer { get; set; }

        /// <summary>
        /// Cookie
        /// </summary>
        public CookieContainer Cookie { get; set; }

        /// <summary>
        /// 代理
        /// </summary>
        public WebProxy Proxy { get; set; }

        /// <summary>
        /// 请求方式
        /// </summary>
        public HttpMethod HttpMethod { get; set; }

        /// <summary>
        /// 参数编码格式
        /// </summary>
        private Encoding encoding = Encoding.UTF8;

        /// <summary>
        /// 参数编码格式
        /// </summary>
        public Encoding Encoding
        {
            get
            {
                return this.encoding;
            }

            set
            {
                this.encoding = value;
            }
        }

        /// <summary>
        /// 是否与 Internet 资源建立持久性连接。
        /// </summary>
        public bool KeepAlive { get; set; }

        /// <summary>
        /// 请求超时时间
        /// </summary>
        private int timeout = 30 * 0x3e8;

        /// <summary>
        /// 请求超时时间(单位毫秒)
        /// </summary>
        public int Timeout
        {
            get
            {
                return this.timeout;
            }

            set
            {
                this.timeout = value;
            }
        }

        /// <summary>
        /// 请求参数
        /// </summary>
        public IDictionary<string, string> Parameters { get; set; }
    }

请求类返回一个Stream 对象

GetStream

该方法主要创建 一个http请求 和响应http内容处理

 var httpWebRequest = GetHttpWebRequest(request);

创建http请求 和响应参数设置

 response = (HttpWebResponse)httpWebRequest.GetResponse();

响应http内容

    /// <summary>
    /// The http utility.
    /// </summary>
    internal static class HttpRequestUtility
    {
        /// <summary>
        /// GetStream
        /// </summary>
        /// <param name="request">request</param>
        /// <returns>Stream</returns>
        internal static Stream GetStream(Request request)
        {
            HttpWebResponse response = null;
            Stream responseStream = null;
            try
            {
                var httpWebRequest = GetHttpWebRequest(request);
                response = (HttpWebResponse)httpWebRequest.GetResponse();
                responseStream = response.GetResponseStream();
                byte[] buffer = StreamToBytes(responseStream);
                Stream memoryStream = new MemoryStream(buffer);
                request.Cookie = httpWebRequest.CookieContainer;
                return memoryStream;
            }
            catch (System.Exception)
            {
                return null;
            }
            finally
            {
                if (responseStream != null)
                {
                    responseStream.Dispose();
                    responseStream.Close();
                }

                if (response != null)
                {
                    response.Dispose();
                    response.Close();
                }
            }
        }

        /// <summary>
        /// GteParameters
        /// </summary>
        /// <param name="parameters">parameters</param>
        /// <returns>string</returns>
        private static string GteParameters(IDictionary<string, string> parameters)
        {
            if (parameters == null || !parameters.Any())
            {
                return string.Empty;
            }

            return parameters.Join("&", p => p.Key + "=" + p.Value);
        }

        /// <summary>
        /// CreateUri
        /// </summary>
        /// <param name="request">url</param>
        /// <returns>Uri</returns>
        private static Uri CreateUri(Request request)
        {
            if (string.IsNullOrEmpty(request.Url))
            {
                throw new ArgumentNullException("url");
            }

            string url = request.Url;
            if (request.HttpMethod == HttpMethod.Get)
            {
                string parameters = GteParameters(request.Parameters);
                url = url + "?" + parameters;
            }

            Uri uri;
            if (Uri.TryCreate(url, UriKind.RelativeOrAbsolute, out uri))
            {
                return uri;
            }
            else
            {
                throw new ArgumentException("请求目标地址格式错误");
            }
        }

        /// <summary>
        /// 设置请求基本信息
        /// </summary>
        /// <param name="request">request</param>
        /// <returns>HttpWebRequest</returns>
        private static HttpWebRequest GetHttpWebRequest(Request request)
        {
            Uri uri = CreateUri(request);
            HttpWebRequest webRequest = WebRequest.CreateHttp(uri);
            HttpRequestCachePolicy policy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
            webRequest.CachePolicy = policy;
            webRequest.Timeout = request.Timeout;
            webRequest.KeepAlive = request.KeepAlive;
            webRequest.Method = request.HttpMethod.ToString();
            webRequest.CookieContainer = request.Cookie;
            webRequest.Referer = request.Referer;
            webRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 2.0.1124)";
            webRequest.Headers.Add("Cache-Control", "no-cache");
            webRequest.Accept = "*/*";
            webRequest.Credentials = CredentialCache.DefaultCredentials;
            if (request.Proxy != null)
            {
                webRequest.Proxy = request.Proxy;
            }

            if (request.HttpMethod == HttpMethod.Post)
            {
                SetPostParameters(webRequest, request);
            }

            return webRequest;
        }

        /// <summary>
        /// 设置请求Post信息
        /// </summary>
        /// <param name="webRequest">httpWebRequest</param>
        /// <param name="request">request</param>
        private static void SetPostParameters(WebRequest webRequest, Request request)
        {
            string parameters = GteParameters(request.Parameters);
            byte[] bytes = request.Encoding.GetBytes(parameters);
            webRequest.ContentType = "application/x-www-form-urlencoded";
            webRequest.ContentLength = bytes.Length;
            using (Stream requestStream = webRequest.GetRequestStream())
            {
                requestStream.Write(bytes, 0, bytes.Length);
            }
        }

        /// <summary>
        /// 数据流转换
        /// </summary>
        /// <param name="stream">数据流</param>
        /// <returns>字节数组</returns>
        private static byte[] StreamToBytes(Stream stream)
        {
            List<byte> bytes = new List<byte>();
            int temp = stream.ReadByte();
            while (temp != -1)
            {
                bytes.Add((byte)temp);
                temp = stream.ReadByte();
            }

            return bytes.ToArray();
        }
    }

对应请求的内容处理

返回的内容可能是 超文本内容 或者 是图片等

    /// <summary>
    /// The http request html.
    /// </summary>
    public class HttpRequestService
    {
        /// <summary>
        /// 获取一个文本内容
        /// </summary>
        /// <param name="request">
        /// 请求信息
        /// </param>
        /// <returns>
        /// 结果
        /// </returns>
        public static string GetHttpRequest(Request request)
        {
            try
            {
                var stream = HttpRequestUtility.GetStream(request);
                using (StreamReader sr = new StreamReader(stream, request.Encoding))
                {
                    StringBuilder builder = new StringBuilder();
                    while (sr.Peek() != -1)
                    {
                        builder.Append(sr.ReadLine());
                    }

                    return builder.ToString();
                }
            }
            catch (System.Exception)
            {
                return null;
            }
        }

        /// <summary>
        /// 获取一张图片
        /// </summary>
        /// <param name="request">请求信息</param>
        /// <returns>图片</returns>
        public static Bitmap GetImage(Request request)
        {
            Bitmap map = null;
            Stream stream = null;
            try
            {
                stream = HttpRequestUtility.GetStream(request);
                byte[] buf = new byte[stream.Length];
                stream.Read(buf, 0, (int)stream.Length);
                map = new Bitmap(System.Drawing.Image.FromStream(stream));
                return map;
            }
            catch (System.Exception)
            {
                return null;
            }
            finally
            {
                if (stream != null)
                {
                    stream.Close();
                }

                if (map != null)
                {
                    map.Dispose();
                }
            }
        }
    }

 

4.5处理方法

HttpWebRequest

原文:http://www.cnblogs.com/liuxiaoji/p/4607806.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!