百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

C# HttpWebRequest HttpHelper 类

yuyutoo 2024-10-11 23:57 13 浏览 0 评论

HttpHelper老早的一个类,使用中有些地方还需要调整,整体大概可用。

 public class HttpHelper<T> where T : class //限制转换T为一个类
    {
        /// <summary>
        /// 判断是否是一个正确格式的URL
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public static bool IsUrl(string url)
        {
            url = url.Trim().ToLower();
            if (url.StartsWith("http://") || url.StartsWith("https://"))
            {
                return true;
            }
            return false;
        }

        /// <summary>
        /// 用Get取得页面信息
        /// </summary>
        /// <param name="url"></param>
        /// <param name="requestConfig"></param>
        /// <param name="proxyConfig"></param>
        /// <returns></returns>
        public static string HttpGetString(string url, RequestConfig requestConfig = null, WebProxyConfig proxyConfig = null)
        {
            string ret = "";
            try
            {
                if (requestConfig == null)
                {
                    requestConfig = new RequestConfig();
                }
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.Method = "Get";
                request.UserAgent = requestConfig.UserAgent;
                request.Accept = requestConfig.Accept;
                request.ContentType = requestConfig.ContentType;
                request.Timeout = requestConfig.Timeout;
                request.AllowAutoRedirect = requestConfig.AllowAutoRedirect;
                request.KeepAlive = requestConfig.KeepAlive;
                request.Headers = requestConfig.Headers;
                if (proxyConfig != null)
                {
                    WebProxy wp = new WebProxy(proxyConfig.address, true);
                    wp.Credentials = new NetworkCredential(proxyConfig.user, proxyConfig.password);
                    request.Proxy = wp;
                }
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream stream = response.GetResponseStream();
                StreamReader sr = new StreamReader(stream, requestConfig.ContentEncoding);
                ret = sr.ReadToEnd();
                sr.Close();
                stream.Close();
                response.Close();
                return ret;
            }
            catch (Exception ex)
            {
                //输出日志
            }
            return ret;
        }

        /// <summary>
        /// Post表单信息
        /// </summary>
        /// <param name="url"></param>
        /// <param name="postData"></param>
        /// <param name="requestConfig"></param>
        /// <param name="proxyConfig"></param>
        /// <returns></returns>
        public static string HttpPostString(string url, string postData, RequestConfig requestConfig = null, WebProxyConfig proxyConfig = null)
        {
            string ret = "";
            try
            {
                if (requestConfig == null)
                {
                    requestConfig = new RequestConfig();
                }
                byte[] data = requestConfig.ContentEncoding.GetBytes(postData);
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                CookieContainer cookie = new CookieContainer();
                request.CookieContainer = cookie;
                request.AllowAutoRedirect = requestConfig.AllowAutoRedirect;
                request.UserAgent = requestConfig.UserAgent;
                request.Method = "Post";
                request.Accept = requestConfig.Accept;
                request.ContentType = requestConfig.ContentType;
                request.Timeout = requestConfig.Timeout;
                request.ContentLength = data.Length;
                if (proxyConfig != null)
                {
                    WebProxy wp = new WebProxy(proxyConfig.address, true);
                    wp.Credentials = new NetworkCredential(proxyConfig.user, proxyConfig.password);
                    request.Proxy = wp;
                }
                Stream outStream = request.GetRequestStream();
                outStream.Write(data, 0, data.Length);
                outStream.Close();
                HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                Stream inStream = response.GetResponseStream();
                StreamReader sr = new StreamReader(inStream, requestConfig.ContentEncoding);
                ret = sr.ReadToEnd();
                sr.Close();
                inStream.Close();
                response.Close();
                return ret;
            }
            catch (Exception ex)
            {
                //输出日志
            }
            return ret;
        }

        /// <summary>
        /// 下载一个文件
        /// </summary>
        /// <param name="url"></param>
        /// <param name="outFile"></param>
        /// <param name="requestConfig"></param>
        /// <param name="proxyConfig"></param>
        /// <returns></returns>
        public static bool DownloadFile(string url, string outFile, RequestConfig requestConfig = null, WebProxyConfig proxyConfig = null)
        {
            bool ret = false;
            FileStream fs = null;
            try
            {
                if (requestConfig == null)
                {
                    requestConfig = new RequestConfig();
                }
                HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
                request.Method = "Get";
                request.ContentType = requestConfig.ContentType;
                request.Accept = requestConfig.Accept;
                request.UserAgent = requestConfig.UserAgent;
                if (proxyConfig != null)
                {
                    WebProxy wp = new WebProxy(proxyConfig.address, true);
                    wp.Credentials = new NetworkCredential(proxyConfig.user, proxyConfig.password);
                }
                HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                Stream stream = response.GetResponseStream();
                fs = new FileStream(outFile, FileMode.Create);
                int bufferSize = 1024;
                byte[] data = new byte[bufferSize];
                int length = 0;
                while ((length = stream.Read(data, 0, bufferSize)) > 0)
                {
                    fs.Write(data, 0, length);
                }
                fs.Close();
                stream.Close();
                response.Close();
                ret = true;
            }
            catch (Exception ex)
            {
                //输出日志
            }
            finally
            {
                if (fs != null)
                {
                    fs.Close();
                }
            }
            return ret;
        }

        /// <summary>
        /// 用Get取得一个Json数据,将其转换为类
        /// </summary>
        /// <param name="url"></param>
        /// <param name="requestConfig"></param>
        /// <param name="proxyConfig"></param>
        /// <returns></returns>
        public static T HttpGetObject(string url, RequestConfig requestConfig = null, WebProxyConfig proxyConfig = null)
        {
            T item;
            try
            {
                if (requestConfig == null)
                {
                    requestConfig = new RequestConfig();
                }
                HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
                request.Method = "Get";
                request.UserAgent = requestConfig.UserAgent;
                request.Accept = requestConfig.Accept;
                request.ContentType = requestConfig.ContentType;
                request.Timeout = requestConfig.Timeout;
                request.AllowAutoRedirect = requestConfig.AllowAutoRedirect;
                request.KeepAlive = requestConfig.KeepAlive;
                if (proxyConfig != null)
                {
                    WebProxy wp = new WebProxy(proxyConfig.address, true);
                    wp.Credentials = new NetworkCredential(proxyConfig.user, proxyConfig.password);
                    request.Proxy = wp;
                }
                HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                Stream stream = response.GetResponseStream();
                StreamReader sr = new StreamReader(stream, requestConfig.ContentEncoding);
                string content = sr.ReadToEnd();
                sr.Close();
                stream.Close();
                response.Close();
                item = JsonConvert.DeserializeObject<T>(content);
                return item;
            }
            catch (Exception ex)
            {
                //输出日志
            }
            return null;
        }

        /// <summary>
        /// Post取得JSON转换为列表对像
        /// </summary>
        /// <param name="url"></param>
        /// <param name="postData"></param>
        /// <param name="contentType"></param>
        /// <param name="timeout"></param>
        /// <param name="config"></param>
        /// <returns></returns>
        public static T HttpPostObject(string url, string postData, RequestConfig requestConfig = null
            , WebProxyConfig proxyConfig = null)
        {
            T item;
            Stream outstream = null;
            Stream instream = null;
            StreamReader sr = null;
            HttpWebResponse response = null;
            HttpWebRequest request = null;
            Encoding encoding = Encoding.UTF8;
            byte[] data = encoding.GetBytes(postData);
            //准备请求...
            try
            {
                if (requestConfig == null)
                {
                    requestConfig = new RequestConfig();
                }
                //设置参数
                request = WebRequest.Create(url) as HttpWebRequest;
                CookieContainer cookieContainer = new CookieContainer();
                request.CookieContainer = cookieContainer;
                request.AllowAutoRedirect = requestConfig.AllowAutoRedirect;
                request.UserAgent = requestConfig.UserAgent;
                request.Method = "POST";
                request.Accept = requestConfig.Accept;
                request.ContentType = requestConfig.ContentType;
                request.Timeout = requestConfig.Timeout;
                request.KeepAlive = requestConfig.KeepAlive;
                request.ContentLength = data.Length;
                if (proxyConfig != null)
                {
                    WebProxy wp = new WebProxy(proxyConfig.address, true);
                    wp.Credentials = new NetworkCredential(proxyConfig.user, proxyConfig.password);
                    request.Proxy = wp;
                }
                outstream = request.GetRequestStream();
                outstream.Write(data, 0, data.Length);
                outstream.Close();
                //发送请求并获取相应回应数据
                response = request.GetResponse() as HttpWebResponse;
                //直到request.GetResponse()程序才开始向目标网页发送Post请求
                instream = response.GetResponseStream();
                sr = new StreamReader(instream, encoding);
                //返回数据
                string content = sr.ReadToEnd();
                item = JsonConvert.DeserializeObject<T>(content);
                return item;
            }
            catch (Exception ex)
            {
                return null;
            }
        }
    }
    /// <summary>
    /// Web代理配制信息
    /// </summary>
    public class WebProxyConfig
    {
        public string address { get; set; }
        public string user { get; set; }

        public string password { get; set; }

        public WebProxyConfig()
        {

        }

        public WebProxyConfig(string address, string user, string password)
        {
            this.address = address;
            this.user = user;
            this.password = password;
        }
    }
    public class RequestConfig
    {
        private bool _AllowAutoRedirect = true;
        /// <summary>
        /// 自动跳转
        /// </summary>
        public bool AllowAutoRedirect
        {
            get
            {
                return _AllowAutoRedirect;
            }
            set
            {
                AllowAutoRedirect = value;
            }
        }

        private string _UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36";
        /// <summary>
        /// 指定浏览器
        /// </summary>
        public string UserAgent
        {
            get
            {
                return _UserAgent;
            }
            set
            {
                _UserAgent = value;
            }
        }

        private string _Accept = "*/*";
        /// <summary>
        /// 资源的媒体类型
        /// </summary>
        public string Accept
        {
            get
            {
                return _Accept;
            }
            set
            {
                _Accept = value;
            }
        }

        private int _Timeout = 10 * 1000;
        /// <summary>
        /// 指定超时
        /// </summary>
        public int Timeout
        {
            get
            {
                return _Timeout;
            }
            set
            {
                _Timeout = value;
            }
        }

        private bool _KeepAlive = true;
        /// <summary>
        /// 资源建立持久性连接
        /// </summary>
        public bool KeepAlive
        {
            get
            {
                return _KeepAlive;
            }
            set
            {
                _KeepAlive = value;
            }
        }

        private string _ContentType = "application/x-www-form-urlencoded";
        /// <summary>
        /// 资源的媒体类型
        /// </summary>
        public string ContentType
        {
            get
            {
                return _ContentType;
            }
            set
            {
                _ContentType = value;
            }
        }

        /// <summary>
        /// 内容编码
        /// </summary>
        public Encoding _ContentEncoding = System.Text.Encoding.UTF8;
        public Encoding ContentEncoding
        {
            get
            {
                return _ContentEncoding;
            }
            set
            {
                _ContentEncoding = value;
            }
        }

        public WebHeaderCollection _Headers = new WebHeaderCollection();
        public WebHeaderCollection Headers
        {
            get
            {
                return _Headers;
            }
            set
            {
                _Headers = value;
            }
        }
    }

HttpWebResponse请求状态代码标识

成员名称

说明

Continue

等效于 HTTP 状态 100。Continue 指示客户端可能继续其请求。

SwitchingProtocols

等效于 HTTP 状态 101。SwitchingProtocols 指示正在更改协议版本或协议。

OK

等效于 HTTP 状态 200。OK 指示请求成功,且请求的信息包含在响应中。这是最常接收的状态代码。

Created

等效于 HTTP 状态 201。Created 指示请求导致在响应被发送前创建新资源。

Accepted

等效于 HTTP 状态 202。Accepted 指示请求已被接受做进一步处理。

NonAuthoritativeInformation

等效于 HTTP 状态 203。NonAuthoritativeInformation 指示返回的元信息来自缓存副本而不是原始服务器,因此可能不正确。

NoContent

等效于 HTTP 状态 204。NoContent 指示已成功处理请求并且响应已被设定为无内容。

ResetContent

等效于 HTTP 状态 205。ResetContent 指示客户端应重置(或重新加载)当前资源。

PartialContent

等效于 HTTP 状态 206。PartialContent 指示响应是包括字节范围的 GET 请求所请求的部分响应。

MultipleChoices

等效于 HTTP 状态 300。MultipleChoices 指示请求的信息有多种表示形式。默认*作是将此状态视为重定向,并遵循与此相应关联的 Location 头的内容。

Ambiguous

等效于 HTTP 状态 300。Ambiguous 指示请求的信息有多种表示形式。默认*作是将此状态视为重定向,并遵循与此相应关联的 Location 头的内容。

MovedPermanently

等效于 HTTP 状态 301。MovedPermanently 指示请求的信息已移到 Location 头中指定的 URI 处。接收到此状态时的默认*作为遵循与响应关联的 Location 头。

Moved

等效于 HTTP 状态 301。Moved 指示请求的信息已移到 Location 头中指定的 URI 处。接收到此状态时的默认*作为遵循与响应关联的 Location 头。原始请求方法为 POST 时,重定向的请求将使用 GET 方法。

Found

等效于 HTTP 状态 302。Found 指示请求的信息位于 Location 头中指定的 URI 处。接收到此状态时的默认*作为遵循与响应关联的 Location 头。原始请求方法为 POST 时,重定向的请求将使用 GET 方法。

Redirect

等效于 HTTP 状态 302。Redirect 指示请求的信息位于 Location 头中指定的 URI 处。接收到此状态时的默认*作为遵循与响应关联的 Location 头。原始请求方法为 POST 时,重定向的请求将使用 GET 方法。

SeeOther

等效于 HTTP 状态 303。作为 POST 的结果,SeeOther 将客户端自动重定向到 Location 头中指定的 URI。用 GET 生成对 Location 头所指定的资源的请求。

RedirectMethod

等效于 HTTP 状态 303。作为 POST 的结果,RedirectMethod 将客户端自动重定向到 Location 头中指定的 URI。用 GET 生成对 Location 头所指定的资源的请求。

NotModified

等效于 HTTP 状态 304。NotModified 指示客户端的缓存副本是最新的。未传输此资源的内容。

UseProxy

等效于 HTTP 状态 305。UseProxy 指示请求应使用位于 Location 头中指定的 URI 的代理服务器。

Unused

等效于 HTTP 状态 306。Unused 是未完全指定的 HTTP/1.1 规范的建议扩展。

TemporaryRedirect

等效于 HTTP 状态 307。TemporaryRedirect 指示请求信息位于 Location 头中指定的 URI 处。接收到此状态时的默认*作为遵循与响应关联的 Location 头。原始请求方法为 POST 时,重定向的请求还将使用 POST 方法。

RedirectKeepVerb

等效于 HTTP 状态 307。RedirectKeepVerb 指示请求信息位于 Location 头中指定的 URI 处。接收到此状态时的默认*作为遵循与响应关联的 Location 头。原始请求方法为 POST 时,重定向的请求还将使用 POST 方法。

BadRequest

等效于 HTTP 状态 400。BadRequest 指示服务器未能识别请求。如果没有其他适用的错误,或者如果不知道准确的错误或错误没有自己的错误代码,则发送 BadRequest

Unauthorized

等效于 HTTP 状态 401。Unauthorized 指示请求的资源要求身份验证。WWW-Authenticate 头包含如何执行身份验证的详细信息。

PaymentRequired

等效于 HTTP 状态 402。保留 PaymentRequired 以供将来使用。

Forbidden

等效于 HTTP 状态 403。Forbidden 指示服务器拒绝满足请求。

NotFound

等效于 HTTP 状态 404。NotFound 指示请求的资源不在服务器上。

MethodNotAllowed

等效于 HTTP 状态 405。MethodNotAllowed 指示请求的资源上不允许请求方法(POST 或 GET)。

NotAcceptable

等效于 HTTP 状态 406。NotAcceptable 指示客户端已用 Accept 头指示将不接受资源的任何可用表示形式。

ProxyAuthenticationRequired

等效于 HTTP 状态 407。ProxyAuthenticationRequired 指示请求的代理要求身份验证。Proxy-authenticate 头包含如何执行身份验证的详细信息。

RequestTimeout

等效于 HTTP 状态 408。RequestTimeout 指示客户端没有在服务器期望请求的时间内发送请求。

Conflict

等效于 HTTP 状态 409。Conflict 指示由于服务器上的冲突而未能执行请求。

Gone

等效于 HTTP 状态 410。Gone 指示请求的资源不再可用。

LengthRequired

等效于 HTTP 状态 411。LengthRequired 指示缺少必需的 Content-length 头。

PreconditionFailed

等效于 HTTP 状态 412。PreconditionFailed 指示为此请求设置的条件失败,且无法执行此请求。条件是用条件请求标头(如 If-Match、If-None-Match 或 If-Unmodified-Since)设置的。

RequestEntityTooLarge

等效于 HTTP 状态 413。RequestEntityTooLarge 指示请求太大,服务器无法处理。

RequestUriTooLong

等效于 HTTP 状态 414。RequestUriTooLong 指示 URI 太长。

UnsupportedMediaType

等效于 HTTP 状态 415。UnsupportedMediaType 指示请求是不支持的类型。

RequestedRangeNotSatisfiable

等效于 HTTP 状态 416。RequestedRangeNotSatisfiable 指示无法返回从资源请求的数据范围,因为范围的开头在资源的开头之前,或因为范围的结尾在资源的结尾之后。

ExpectationFailed

等效于 HTTP 状态 417。ExpectationFailed 指示服务器未能符合 Expect 头中给定的预期值。

InternalServerError

等效于 HTTP 状态 500。InternalServerError 指示服务器上发生了一般错误。

NotImplemented

等效于 HTTP 状态 501。NotImplemented 指示服务器不支持请求的函数。

BadGateway

等效于 HTTP 状态 502。BadGateway 指示中间代理服务器从另一代理或原始服务器接收到错误响应。

ServiceUnavailable

等效于 HTTP 状态 503。ServiceUnavailable 指示服务器暂时不可用,通常是由于过多加载或维护。

GatewayTimeout

等效于 HTTP 状态 504。GatewayTimeout 指示中间代理服务器在等待来自另一个代理或原始服务器的响应时已超时。

HttpVersionNotSupported

等效于 HTTP 状态 505。HttpVersionNotSupported 指示服务器不支持请求的 HTTP 版本。

相关推荐

电脑 CMD 命令大全:简单粗暴收藏版

电脑CMD命令大全包括了许多常用的命令,这些命令可以帮助用户进行各种系统管理和操作任务。以下是一些常用的CMD命令及其功能:1、系统信息和管理...

电脑维修高手必备!8个神奇DOS命令,自己动手不求人

我相信搞电脑维修或者维护的基本都会些DOS的命令。就算Windows操作系统是可视化的界面,但很多维护检查是离不开DOS命令的。掌握好这些命令,你不仅能快速诊断问题,还能解决90%的常见电脑故障。下...

一个互联网产品总监的设计技巧总结 - 技术篇

古语:工欲善其事必先利其器。往往在利其器后我们才能事半功倍。从这个角度出发成为一个合格的产品经理你需要的是“利其器”,这样你才能产品的设计过程中如鱼得水,得心应手。有些产品经理刚入职,什么都感觉自己欠...

超详解析Flutter渲染引擎|业务想创新,不了解底层原理怎么行?

作者|万红波(远湖)出品|阿里巴巴新零售淘系技术部前言Flutter作为一个跨平台的应用框架,诞生之后,就被高度关注。它通过自绘UI,解决了之前RN和weex方案难以解决的多端一致性...

瑞芯微RK3568|SDK开发之环境安装及编译操作

1.SDK简介一个通用LinuxSDK工程目录包含有buildroot、app、kernel、device、docs、external等目录。其中一些特性芯片如RK3308/RV1108/R...

且看L-MEM ECC如何守护i.MXRT1170从核CM4

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是恩智浦i.MXRT1170上Cortex-M4内核的L-MEMECC功能。本篇是《简析i.MXRT1170Cortex-M7F...

ECC给i.MXRT1170 FlexRAM带来了哪些变化?

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是恩智浦i.MXRT1170上Cortex-M7内核的FlexRAMECC功能。ECC是“ErrorCorrectingCode”...

PHP防火墙代码,防火墙,网站防火墙,WAF防火墙,PHP防火墙大全

PHP防火墙代码,防火墙,网站防火墙,WAF防火墙,PHP防火墙大全资源宝整理分享:https://www.htple.net...

从零开始移植最新版本(2023.10)主线Uboot到Orange Pi 3(全志H6)

本文将从零开始通过一步一步操作来实现将主线U-Boot最新代码移植到OrangePi3(全志H6)开发板上并正常运行起来。本文从通用移植思路的角度,展现是思考的过程,通过这种方式希望能让读者一通百...

可视化编程工具Blockly——定制工具箱

1概述本文重点讲解如何定制Blocklytoolbox上,主要包含如下几点目标:如何为toolbox不同类别添加背景色如何改变选中的类别的外观如何为toolbox类别添加定制化的css如何改变类别...

用户界面干货盘点(用户界面的基本操作方法)

DevExpressDevExpressWPF的DXSplashScreen控件在应用加载的时候显示一个启动界面。添加DXSplashScreen后,会默认生成一个XAML文件,当然,你也可...

Vue3+Bootstrap5整合:企业级后台管理系统实战

简洁而不简单,优雅而不失强大在当今快速发展的企业数字化进程中,高效、美观的后台管理系统已成为企业运营的核心支撑。作为前端开发者,我们如何选择技术栈,才能既保证开发效率,又能打造出专业级的用户体验?答案...

什么?这三款i.MXRT型号也开放了IAP API?

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT1050/1020/1015系列ROM中的FlexSPI驱动API使用。今天痞子衡去4S店给爱车做保养了,...

OneCode基础组件介绍——表格组件(Grid)

在企业级应用开发中,表格组件是数据展示与交互的核心载体。OneCode平台自研的Grid表格组件,以模型驱动设计...

开源无线LoRa传感器(光照温湿度甲醛Tvoc)

本开源项目基于ShineBlinkC2M低代码单片机实现,无需复杂单片机C语言开发。即使新手也可很容易用FlexLua零门槛开发各种功能丰富稳定可靠的IoT硬件,更多学习教程可参考Flex...

取消回复欢迎 发表评论: