c# http请求封装

public class NewHttpClient2
    {
        public enum BodyFormat
        {
            Formed, Json
        }
        public BodyFormat BodyType;
        public string Method;
        public Uri Uri;
        public Encoding ContentEncoding;
        public Dictionary<string, object> Bodys;
        public Dictionary<string, string> Headers;
        public Dictionary<string, string> Querys;
        public int Timeout;
        private NewHttpClient2()
        {
            BodyType = BodyFormat.Formed;
            Method = "GET";
            ContentEncoding = Encoding.UTF8;
            Bodys = new Dictionary<string, object>();
            Headers = new Dictionary<string, string>();
            Querys = new Dictionary<string, string>();
            ServicePointManager.Expect100Continue = false;
            Timeout = 60000;
        }
        public NewHttpClient2(string uri) : this()
        {
            Uri = new Uri(uri);
        }
        public HttpWebRequest HttpWebRequest;
        public string UriWithQuery
        {
            get
            {
                return Uri + "?" + Util.ParseQueryString(Querys);
            }
        }
        public JObject PostAction()
        {
            HttpWebRequest = (HttpWebRequest)WebRequest.Create(UriWithQuery);
            HttpWebRequest.Method = Method;
            HttpWebRequest.ReadWriteTimeout = 30000;
            foreach (var header in Headers)
            {
                HttpWebRequest.Headers.Add(header.Key, header.Value);
            }
            byte[] body = null;
            switch (BodyType)
            {
                case BodyFormat.Formed:
                    {
                        var bodydata = Bodys.Select(pair => pair.Key + "=" + Util.UriEncode(pair.Value.ToString()))
                            .DefaultIfEmpty("")
                            .Aggregate((a, b) => a + "&" + b);
                        body = ContentEncoding.GetBytes(bodydata);
                        HttpWebRequest.ContentType = "application/x-www-form-urlencoded";
                        break;
                    }
                case BodyFormat.Json:
                    {
                        var bodydata = JsonConvert.SerializeObject(Bodys);
                        body = ContentEncoding.GetBytes(bodydata);
                        HttpWebRequest.ContentType = "application/json";
                        break;
                    }
            }
            if (body != null && Bodys.Count > 0)
            {
                var stream = HttpWebRequest.GetRequestStream();
                stream.Write(body, 0, body.Length);
                stream.Close();
            }
            HttpWebResponse webresp;
            try
            {
                webresp = (HttpWebResponse)HttpWebRequest.GetResponse();
            }
            catch (WebException e)
            {
                //请求失败
                throw new ApiException((int)e.Status, e.Message);
            }
            if (webresp.StatusCode != HttpStatusCode.OK)
            {
                throw new ApiException((int)webresp.StatusCode, "Server response code:" + (int)webresp.StatusCode);
            }
            var respdata = Util.StreamToString(webresp.GetResponseStream(), ContentEncoding);
            JObject respJobject;
            try
            {
                respJobject = JsonConvert.DeserializeObject<JObject>(respdata);
            }
            catch (Exception e)
            {
                throw new ApiException(e.Message + ":" + respdata);
            }
            if (respJobject == null)
            {
                throw new ApiException("Empty response!");
            }
            return respJobject;
        }
    }

try
            {
                var a = new NewHttpClient2("http://localhost:100/.well-known/openid-configuration");
                var b = a.PostAction();
                var c = new NewHttpClient2(b["token_endpoint"].ToString())
                {
                    Bodys = new Dictionary<string, object> { { "scope", "api1" }, { "grant_type", "password" },{"client_id","ro.client" },
                        {"client_secret","secret" },{ "username","alice"},{"password","password" } },
                    Method = "POST"
                };
                var d = c.PostAction();
                var e = new NewHttpClient2("http://localhost:101/api/values/get") {
                    BodyType=NewHttpClient2.BodyFormat.Json,
                    Headers=new Dictionary<string, string> { {"Authorization", d["token_type"].ToString() + " " + d["access_token"].ToString() } }
                };
                var f = e.PostAction();
                return Ok(f);
            }
            catch (ApiException e)
            {
                return Ok(e);
            }
            catch(Exception e)
            {
                return Ok(e);
            }
[Serializable]
    public class ApiException:Exception
    {
        public int Code { get; set; }
        public ApiException()
        {
            Code = -1;
        }
        public ApiException(string message) : base(message)
        {

        }
        public ApiException(int code, string message) : base(message)
        {
            Code = code;
        }
    }

 

public static string StreamToString(Stream ss, Encoding enc)
        {
            string ret;
            using (var reader = new StreamReader(ss, enc))
            {
                ret = reader.ReadToEnd();
            }
            ss.Close();
            return ret;
        }
        public static string UriEncode(string input, bool encodeSlash = false)
        {
            var builder = new StringBuilder();
            foreach (var b in Encoding.UTF8.GetBytes(input))
                if (b >= 'a' && b <= 'z' || b >= 'A' && b <= 'Z' || b >= '0' && b <= '9' || b == '_' || b == '-' ||
                    b == '~' || b == '.')
                    builder.Append((char)b);
                else if (b == '/')
                    if (encodeSlash)
                        builder.Append("%2F");
                    else
                        builder.Append((char)b);
                else
                    builder.Append('%').Append(b.ToString("X2"));
            return builder.ToString();
        }
        public static string ParseQueryString(Dictionary<string, string> querys)
        {
            if (querys.Count == 0)
                return "";
            return querys
                .Select(pair => pair.Key + "=" + pair.Value)
                .Aggregate((a, b) => a + "&" + b);
        }

 

又琢磨http新封装方法了,这个,估计更完善些,返回数据默认能转换为jobject,不然修改postaction下

posted @ 2019-09-23 14:49  天天的蓝色  阅读(7041)  评论(0编辑  收藏  举报