Net HttpClient 扩展方法

这个博客介绍了如何扩展HttpClient类以方便进行HTTP请求,包括设置默认请求头、执行GET和POST请求,并提供了内容类型为JSON和表单的POST方法。同时,定义了一个HttpStatusCodeEx类,用于将Http状态码转换为中文描述,便于理解和调试HTTP响应。
摘要由CSDN通过智能技术生成
public static class HttpClientEx
{
        #region Public Methods

        /// <summary>
        /// 设置请求头部
        /// </summary>
        /// <param name="key"> 
        /// <param name="value"> 
        public static void AddDefaultRequestHeaders(this HttpClient httpClient, string key, string value)
        {
            httpClient.DefaultRequestHeaders.Add(key, value);
        }

        /// <summary>
        /// Get请求
        /// </summary>
        /// <param name="url"> 请求url 
        /// <returns> 响应状态在200-300 返回HttpResponseMessage 否则null </returns>
        public static HttpResponseMessage DoGet(this HttpClient httpClient, string url)
        {
            Task<httpresponsemessage> taskResponse = httpClient.GetAsync(url);
            taskResponse.Wait();
            var response = taskResponse.Result;
            //200-299
            if (response.IsSuccessStatusCode)
            {
                return response;
            }
            return null;
        }

        /// <summary>
        /// Post请求 内容类型:application/json
        /// </summary>
        /// <param name="url"> 请求url 
        /// <param name="postData"> json内容 
        /// <param name="ContentEncoding"> 内容编码 
        /// <param name="headers"> 请求头设置 
        /// <returns> 响应状态在200-300 返回HttpResponseMessage 否则null </returns>
        public static HttpResponseMessage DoPost(this HttpClient httpClient, string url, string postData, string ContentEncoding = null, Dictionary<string string> headers = null)
        {
            HttpContent httpContent = new StringContent(postData);
            httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
            if (ContentEncoding != null)
            {
                httpContent.Headers.ContentEncoding.Add(ContentEncoding);
            }
            if (headers != null)
            {
                foreach (var head in headers)
                {
                    httpContent.Headers.Add(head.Key, head.Value);
                }
            }
            Task<httpresponsemessage> taskResponse = httpClient.PostAsync(url, httpContent);
            taskResponse.Wait();
            HttpResponseMessage response = taskResponse.Result;
            if (response.IsSuccessStatusCode)
            {
                return response;
            }
            return null;
        }

        /// <summary>
        /// Post请求 内容类型:application/x-www-form-urlencoded
        /// </summary>
        /// <param name="url"> 请求url 
        /// <param name="data"> 数据参数 
        /// <param name="ContentEncoding"> 内容编码 
        /// <param name="headers"> 请求头设置 
        /// <returns> 响应状态在200-300 返回HttpResponseMessage 否则null </returns>
        /// <returns> </returns>
        public static HttpResponseMessage DoPost(this HttpClient httpClient, string url, IEnumerable<keyvaluepair string>&gt; data, Dictionary<string string> headers = null, string ContentEncoding = null)
        {
            HttpContent httpContent = new FormUrlEncodedContent(data);
            httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
            if (ContentEncoding != null)
            {
                httpContent.Headers.ContentEncoding.Add(ContentEncoding);
            }
            if (headers != null)
            {
                foreach (var head in headers)
                {
                    httpContent.Headers.Add(head.Key, head.Value);
                }
            }
            Task<httpresponsemessage> taskResponse = httpClient.PostAsync(url, httpContent);
            taskResponse.Wait();
            HttpResponseMessage response = taskResponse.Result;
            if (response.IsSuccessStatusCode)
            {
                return response;
            }
            return null;
        }

        /// <summary>
        /// 设置UserAgent
        /// </summary>
        /// <param name="httpClient"> 
        /// <param name="value"> 
        public static void SetUserAgent(this HttpClient httpClient, string value)
        {
            httpClient.DefaultRequestHeaders.UserAgent.ParseAdd(value);
        }

        #endregion Public Methods
}
public static class HttpStatusCodeEx
{
        #region Public Methods

        /// <summary>
        /// 将Http状态码翻译为对应的中文
        /// </summary>
        /// <param name="code"> Http状态码 
        /// <returns> 中文解析 </returns>
        public static string ToChsText(this HttpStatusCode code)
        {
            switch (code)
            {
                case HttpStatusCode.Continue:
                    return "请求者应继续进行请求";

                case HttpStatusCode.SwitchingProtocols:
                    return "请求者已要求服务器切换协议,服务器已确认并准备进行切换";

                case HttpStatusCode.OK:
                    return "服务器成功处理了相应请求";

                case HttpStatusCode.Created:
                    return "请求成功且服务器已创建了新的资源";

                case HttpStatusCode.Accepted:
                    return "服务器已接受相应请求,但尚未对其进行处理";

                case HttpStatusCode.NonAuthoritativeInformation:
                    return "服务器已成功处理相应请求,但返回了可能来自另一来源的信息";

                case HttpStatusCode.NoContent:
                    return "服务器已成功处理相应请求,但未返回任何内容";

                case HttpStatusCode.ResetContent:
                    return "服务器已成功处理相应请求,但未返回任何内容,但要求请求者重置文档视图";

                case HttpStatusCode.PartialContent:
                    return "服务器成功处理了部分 GET 请求";

                case HttpStatusCode.MultipleChoices:
                    return "服务器可以根据请求来执行多项操作";

                case HttpStatusCode.Moved:
                    return "请求的网页已永久移动到新位置";

                case HttpStatusCode.Redirect:
                    return "服务器目前正从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求";

                case HttpStatusCode.RedirectMethod:
                    return "当请求者应对不同的位置进行单独的 GET 请求以检索响应时,服务器会返回此代码";

                case HttpStatusCode.NotModified:
                    return "请求的网页自上次请求后再也没有修改过";

                case HttpStatusCode.UseProxy:
                    return "请求者只能使用代理访问请求的网页";

                case HttpStatusCode.Unused:
                    return "Unused 是未完全指定的 HTTP/1.1 规范的建议扩展";

                case HttpStatusCode.RedirectKeepVerb:
                    return "服务器目前正从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求";

                case HttpStatusCode.BadRequest:
                    return "服务器未能识别请求";

                case HttpStatusCode.Unauthorized:
                    return "请求要求进行身份验证";

                case HttpStatusCode.PaymentRequired:
                    return "保留 PaymentRequired 以供将来使用";

                case HttpStatusCode.Forbidden:
                    return "服务器拒绝相应请求";

                case HttpStatusCode.NotFound:
                    return "服务器找不到请求的资源";

                case HttpStatusCode.MethodNotAllowed:
                    return "禁用相应请求中所指定的方法";

                case HttpStatusCode.NotAcceptable:
                    return "无法使用相应请求的内容特性来响应请求的网页";

                case HttpStatusCode.ProxyAuthenticationRequired:
                    return "请求者应当使用代理进行授权";

                case HttpStatusCode.RequestTimeout:
                    return "服务器在等待请求时超时";

                case HttpStatusCode.Conflict:
                    return "服务器在完成请求时遇到冲突";

                case HttpStatusCode.Gone:
                    return "请求的资源已被永久删除";

                case HttpStatusCode.LengthRequired:
                    return "服务器不会接受包含无效内容长度标头字段的请求";

                case HttpStatusCode.PreconditionFailed:
                    return "服务器未满足请求者在请求中设置的其中一个前提条件";

                case HttpStatusCode.RequestEntityTooLarge:
                    return "服务器无法处理相应请求,因为请求实体过大,已超出服务器的处理能力";

                case HttpStatusCode.RequestUriTooLong:
                    return "请求的 URI 过长,服务器无法进行处理";

                case HttpStatusCode.UnsupportedMediaType:
                    return "相应请求的格式不受请求页面的支持";

                case HttpStatusCode.RequestedRangeNotSatisfiable:
                    return "如果相应请求是针对网页的无效范围进行的,那么服务器会返回此状态代码";

                case HttpStatusCode.ExpectationFailed:
                    return "服务器未满足“期望”请求标头字段的要求";

                case HttpStatusCode.InternalServerError:
                    return "服务器内部遇到错误,无法完成相应请求";

                case HttpStatusCode.NotImplemented:
                    return "请求的功能在服务器中尚未实现";

                case HttpStatusCode.BadGateway:
                    return "服务器作为网关或代理,从上游服务器收到了无效的响应";

                case HttpStatusCode.ServiceUnavailable:
                    return "目前服务器不可用(由于超载或进行停机维护)";

                case HttpStatusCode.GatewayTimeout:
                    return "服务器作为网关或代理,未及时从上游服务器接收请求";

                case HttpStatusCode.HttpVersionNotSupported:
                    return "服务器不支持相应请求中所用的 HTTP 协议版本";

                default:
                    return "未知Http状态";
            }
        }

        #endregion Public Methods
}

``` public static class HttpResponseMessageEx { #region Public Methods

public static string ReadModel<t>(this HttpResponseMessage httpResponse) where T : class
    {
        if (httpResponse.IsSuccessStatusCode)
        {
            Task<system.io.stream> taskStream = httpResponse.Content.ReadAsStreamAsync();
            taskStream.Wait();
            System.IO.Stream dataStream = taskStream.Result;
            System.IO.StreamReader reader = new System.IO.StreamReader(dataStream);
            string s = reader.ReadToEnd();
            reader.Close();
            dataStream.Close();
            return s;
        }
        return string.Empty;
    }

    public static string ReadString(this HttpResponseMessage httpResponse)
    {
        Task<system.io.stream> taskStream = httpResponse.Content.ReadAsStreamAsync();
        taskStream.Wait();
        System.IO.Stream dataStream = taskStream.Result;
        System.IO.StreamReader reader = new System.IO.StreamReader(dataStream);
        string result = reader.ReadToEnd();
        reader.Close();
        dataStream.Close();
        return result;
    }

    #endregion Public Methods

} ```</system.io.stream></system.io.stream></httpresponsemessage

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值