利用HttpWebRequest访问WebApi

    WebApi现在越来越流行,下面给出利用HttpWebRequest访问WebApi的工具方法:

    1、利用基准URL和参数字典生成完整URL

        /// <summary>
        /// 生成URL字符串
        /// </summary>
        /// <param name="baseUrl">基准URL</param>
        /// <param name="dictParam">参数字典</param>
        /// <returns>最终URL字符串</returns>
        public static string GetUrl(string baseUrl, Dictionary<string, string> dictParam)
        {
            if (string.IsNullOrWhiteSpace(baseUrl))
            {
                throw new ArgumentNullException("baseUrl", "基准URL不能为空");
            }
            StringBuilder sbParam = new StringBuilder();
            string strParam = string.Empty;
            if (dictParam != null && dictParam.Count > 0)
            {
                sbParam.Append("?");
                foreach (KeyValuePair<string, string> item in dictParam)
                {
                    sbParam.Append(string.Format("{0}={1}&", item.Key, HttpUtility.UrlEncode(item.Value, Encoding.UTF8)));
                }
                strParam = sbParam.ToString();
                strParam = strParam.Substring(0, strParam.Length - 1);
            }
            string strUrl = string.Format("{0}{1}", baseUrl, strParam);
            return strUrl;
        }
View Code

    2、通过HTTP请求获取数据(参数为非model类型)

        /// <summary>
        /// 通过http请求获取数据(参数为非model类型)
        /// </summary>
        /// <param name="url">获取数据的url</param>
        /// <param name="requestMethod">请求方法:GET/POST/PUT/DELETE</param>
        /// <param name="jsonData">返回的json数据</param>
        /// <param name="errMsg">错误信息</param>
        /// <returns>true:成功 false:失败</returns>
        public static bool RequestHttpData(string url, string requestMethod, out string jsonData, out string errMsg)
        {
            jsonData = string.Empty;
            errMsg = string.Empty;
            string result = string.Empty;
            try
            {
                //创建请求
                HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
                request.Timeout = 15 * 60 * 1000; //15分钟
                request.Method = requestMethod;
                request.KeepAlive = true;
                request.AllowAutoRedirect = false;
                //获取数据
                using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
                {
                    StreamReader sr = new StreamReader(response.GetResponseStream());
                    result = sr.ReadToEnd();
                }
            }
            catch (WebException ex)
            {
                try
                {
                    WebResponse wr = ex.Response;
                    Stream st = wr.GetResponseStream();
                    StreamReader sr = new StreamReader(st, System.Text.Encoding.Default);
                    string tmpErr = sr.ReadToEnd();
                    Regex r = new Regex(@"<body><h1>.*</h1>");
                    errMsg = r.Match(tmpErr).Value.Replace("<body><h1>", "").Replace("</h1>", "");
                    sr.Close();
                    st.Close();
                }
                catch
                {
                    errMsg = ex.Message;
                }
                return false;
            }
            catch (Exception ex)
            {
                errMsg = ex.Message;
                return false;
            }
            if (!string.IsNullOrWhiteSpace(result))
            {
                jsonData = result;
            }
            return true;
        }
View Code

    3、通过HTTP请求获取数据(参数为model类型)

        /// <summary>
        /// 通过http请求传递数据(参数为model类型)
        /// </summary>
        /// <param name="url">传递数据的url</param>
        /// <param name="paraJson">要传递的Json数据</param>
        /// <param name="requestMethod">请求方法:GET/POST/PUT/DELETE</param>
        /// <param name="jsonData">返回的json数据</param>
        /// <param name="errMsg">错误信息</param>
        /// <returns>true:成功 false:失败</returns>
        public static bool RequestHttpData(string url, string paraJson, string requestMethod, out string jsonData, out string errMsg)
        {
            jsonData = string.Empty;
            errMsg = string.Empty;
            string result = string.Empty;
            try
            {
                HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
                request.Timeout = 15 * 60 * 1000; //15分钟
                request.Method = requestMethod;
                request.KeepAlive = true;
                request.AllowAutoRedirect = false;
                request.ContentType = "application/json";
                byte[] postdatabtyes = Encoding.UTF8.GetBytes(paraJson);
                request.ContentLength = postdatabtyes.Length;
                Stream requeststream = request.GetRequestStream();
                requeststream.Write(postdatabtyes, 0, postdatabtyes.Length);
                requeststream.Close();
                using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
                {
                    StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
                    result = sr.ReadToEnd();
                }

            }
            catch (WebException ex)
            {
                try
                {
                    WebResponse wr = ex.Response;
                    Stream st = wr.GetResponseStream();
                    StreamReader sr = new StreamReader(st, System.Text.Encoding.Default);
                    string tmpErr = sr.ReadToEnd();
                    Regex r = new Regex(@"<body><h1>.*</h1>");
                    errMsg = r.Match(tmpErr).Value.Replace("<body><h1>", "").Replace("</h1>", "");
                    sr.Close();
                    st.Close();
                }
                catch
                {
                    errMsg = ex.Message;
                }
                return false;
            }
            catch (Exception ex)
            {
                errMsg = ex.Message;
                return false;
            }
            if (!string.IsNullOrWhiteSpace(result))
            {
                jsonData = result;
            }
            return true;
        }
View Code
原文地址:https://www.cnblogs.com/huatao/p/4689229.html