您的位置:首页 > 理论基础 > 计算机网络

C#通过WebClient/HttpWebRequest实现http的post/get方法

2015-10-21 18:17 746 查看
转自 : http://www.cnblogs.com/shadowtale/p/3372735.html

1. POST方法(httpWebRequest) : 

//body是要传递的参数,格式"roleId=1&uid=2"

//post的cotentType填写:

//"application/x-www-form-urlencoded"

//soap填写:"text/xml; charset=utf-8"

    public static string PostHttp(string url, string body, string contentType)

    {

        HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);

        httpWebRequest.ContentType = contentType;

        httpWebRequest.Method = "POST";

        httpWebRequest.Timeout = 20000;

        byte[] btBodys = Encoding.UTF8.GetBytes(body);

        httpWebRequest.ContentLength = btBodys.Length;

        httpWebRequest.GetRequestStream().Write(btBodys, 0, btBodys.Length);

        HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();

        StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream());

        string responseContent = streamReader.ReadToEnd();

        httpWebResponse.Close();

        streamReader.Close();

        httpWebRequest.Abort();

        httpWebResponse.Close();

        return responseContent;

    }

2.POST方法(WebClient)

/// <summary>

        /// 通过WebClient类Post数据到远程地址,需要Basic认证;

        /// 调用端自己处理异常

        /// </summary>

        /// <param name="uri"></param>

        /// <param name="paramStr">name=张三&age=20</param>

        /// <param name="encoding">请先确认目标网页的编码方式</param>

        /// <param name="username"></param>

        /// <param name="password"></param>

        /// <returns></returns>

        public static string Request_WebClient(string uri, string paramStr, Encoding encoding, string username, string password)

        {

            if (encoding == null)

                encoding = Encoding.UTF8;

            string result = string.Empty;

            WebClient wc = new WebClient();

            // 采取POST方式必须加的Header

            wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded");

            byte[] postData = encoding.GetBytes(paramStr);

            if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password))

            {

                wc.Credentials = GetCredentialCache(uri, username, password);

                wc.Headers.Add("Authorization", GetAuthorization(username, password));

            }

            byte[] responseData = wc.UploadData(uri, "POST", postData); // 得到返回字符流

            return encoding.GetString(responseData);// 解码                  

        }

3.Get方法(HttpWebRequest)

public static string GetHttp(string url, HttpContext httpContext)

    {

        string queryString = "?";

        foreach (string key in httpContext.Request.QueryString.AllKeys)

        {

            queryString += key + "=" + httpContext.Request.QueryString[key] + "&";

        }

        queryString = queryString.Substring(0, queryString.Length - 1);

        HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url + queryString);

        httpWebRequest.ContentType = "application/json";

        httpWebRequest.Method = "GET";

        httpWebRequest.Timeout = 20000;

        //byte[] btBodys = Encoding.UTF8.GetBytes(body);

        //httpWebRequest.ContentLength = btBodys.Length;

        //httpWebRequest.GetRequestStream().Write(btBodys, 0, btBodys.Length);

        HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();

        StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream());

        string responseContent = streamReader.ReadToEnd();

        httpWebResponse.Close();

        streamReader.Close();

        return responseContent;

    }

4.basic验证的WebRequest/WebResponse

/// <summary>

        /// 通过 WebRequest/WebResponse 类访问远程地址并返回结果,需要Basic认证;

        /// 调用端自己处理异常

        /// </summary>

        /// <param name="uri"></param>

        /// <param name="timeout">访问超时时间,单位毫秒;如果不设置超时时间,传入0</param>

        /// <param name="encoding">如果不知道具体的编码,传入null</param>

        /// <param name="username"></param>

        /// <param name="password"></param>

        /// <returns></returns>

        public static string Request_WebRequest(string uri, int timeout, Encoding encoding, string username, string password)

        {

            string result = string.Empty;

            WebRequest request = WebRequest.Create(new Uri(uri));

            if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password))

            {

                request.Credentials = GetCredentialCache(uri, username, password);

                request.Headers.Add("Authorization", GetAuthorization(username, password));

            }

            if (timeout > 0)

                request.Timeout = timeout;

            WebResponse response = request.GetResponse();

            Stream stream = response.GetResponseStream();

            StreamReader sr = encoding == null ? new StreamReader(stream) : new StreamReader(stream, encoding);

            result = sr.ReadToEnd();

            sr.Close();

            stream.Close();

            return result;

        }

        #region # 生成 Http Basic 访问凭证 #

        private static CredentialCache GetCredentialCache(string uri, string username, string password)

        {

            string authorization = string.Format("{0}:{1}", username, password);

            CredentialCache credCache = new CredentialCache();

            credCache.Add(new Uri(uri), "Basic", new NetworkCredential(username, password));

            return credCache;

        }

        private static string GetAuthorization(string username, string password)

        {

            string authorization = string.Format("{0}:{1}", username, password);

            return "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(authorization));

        }

        #endregion
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: