zoukankan      html  css  js  c++  java
  • WebUtils-网络请求工具类

    网络请求工具类,大幅代码借鉴aplipay.

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Net;
    using System.Text;
    using System.Web;
    
    namespace ICE.Common
    {
        /// <summary>
        /// 网络工具类。
        /// </summary>
        public sealed class WebUtils
        {
            private int _timeout = 100000;
    
            /// <summary>
            /// 请求与响应的超时时间
            /// </summary>
            public int Timeout
            {
                get { return this._timeout; }
                set { this._timeout = value; }
            }
    
            /// <summary>
            /// 执行HTTP POST请求。
            /// </summary>
            /// <param name="url">请求地址</param>
            /// <param name="parameters">请求参数</param>
            /// <param name="charset">编码字符集</param>
            /// <returns>HTTP响应</returns>
            public string DoPost(string url, IDictionary<string, string> parameters, string charset)
            {
                HttpWebRequest req = GetWebRequest(url, "POST");
                req.ContentType = "application/x-www-form-urlencoded;charset=" + charset;
    
                byte[] postData = Encoding.GetEncoding(charset).GetBytes(BuildQuery(parameters, charset));
                Stream reqStream = req.GetRequestStream();
                reqStream.Write(postData, 0, postData.Length);
                reqStream.Close();
    
                HttpWebResponse rsp = (HttpWebResponse)req.GetResponse();
                Encoding encoding = Encoding.GetEncoding(rsp.CharacterSet);
                return GetResponseAsString(rsp, encoding);
            }
    
            public string DoPost(string url, string requestBody, string charset)
            {
                HttpWebRequest req = GetWebRequest(url, "POST");
                req.ContentType = "application/x-www-form-urlencoded;charset=" + charset;
    
                byte[] postData = Encoding.GetEncoding(charset).GetBytes(requestBody);
                Stream reqStream = req.GetRequestStream();
                reqStream.Write(postData, 0, postData.Length);
                reqStream.Close();
    
                HttpWebResponse rsp = (HttpWebResponse)req.GetResponse();
                Encoding encoding = Encoding.GetEncoding(rsp.CharacterSet);
                return GetResponseAsString(rsp, encoding);
            }
    
            /// <summary>
            /// 执行HTTP GET请求。
            /// </summary>
            /// <param name="url">请求地址</param>
            /// <param name="parameters">请求参数</param>
            /// <param name="charset">编码字符集</param>
            /// <returns>HTTP响应</returns>
            public string DoGet(string url, IDictionary<string, string> parameters, string charset)
            {
                if (parameters != null && parameters.Count > 0)
                {
                    if (url.Contains("?"))
                    {
                        url = url + "&" + BuildQuery(parameters,charset);
                    }
                    else
                    {
                        url = url + "?" + BuildQuery(parameters, charset);
                    }
                }
    
                HttpWebRequest req = GetWebRequest(url, "GET");
                req.ContentType = "application/x-www-form-urlencoded;charset=" + charset;
    
                HttpWebResponse rsp = (HttpWebResponse)req.GetResponse();
                Encoding encoding = Encoding.GetEncoding(rsp.CharacterSet);
                return GetResponseAsString(rsp, encoding);
            }         
    
            public HttpWebRequest GetWebRequest(string url, string method)
            {
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
                req.ServicePoint.Expect100Continue = false;
                req.Method = method;
                req.KeepAlive = true;
                req.UserAgent = "Aop4Net";
                req.Timeout = this._timeout;
                return req;
            }
    
            /// <summary>
            /// 把响应流转换为文本。
            /// </summary>
            /// <param name="rsp">响应流对象</param>
            /// <param name="encoding">编码方式</param>
            /// <returns>响应文本</returns>
            public string GetResponseAsString(HttpWebResponse rsp, Encoding encoding)
            {
                StringBuilder result = new StringBuilder();
                Stream stream = null;
                StreamReader reader = null;
    
                try
                {
                    // 以字符流的方式读取HTTP响应
                    stream = rsp.GetResponseStream();
                    reader = new StreamReader(stream, encoding);
    
                    // 按字符读取并写入字符串缓冲
                    int ch = -1;
                    while ((ch = reader.Read()) > -1)
                    {
                        // 过滤结束符
                        char c = (char)ch;
                        if (c != '')
                        {
                            result.Append(c);
                        }
                    }
                }
                finally
                {
                    // 释放资源
                    if (reader != null) reader.Close();
                    if (stream != null) stream.Close();
                    if (rsp != null) rsp.Close();
                }
    
                return result.ToString();
            }
    
            /// <summary>
            /// 组装普通文本请求参数。
            /// </summary>
            /// <param name="parameters">Key-Value形式请求参数字典</param>
            /// <returns>URL编码后的请求数据</returns>
            public static string BuildQuery(IDictionary<string, string> parameters, string charset)
            {
                StringBuilder postData = new StringBuilder();
                bool hasParam = false;
    
                IEnumerator<KeyValuePair<string, string>> dem = parameters.GetEnumerator();
                while (dem.MoveNext())
                {
                    string name = dem.Current.Key;
                    string value = dem.Current.Value;
                    // 忽略参数名或参数值为空的参数
                    if (!string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(value))
                    {
                        if (hasParam)
                        {
                            postData.Append("&");
                        }
    
                        postData.Append(name);
                        postData.Append("=");
    
                        string encodedValue = HttpUtility.UrlEncode(value, Encoding.GetEncoding(charset));
    
                        postData.Append(encodedValue);
                        hasParam = true;
                    }
                }
    
                return postData.ToString();
            }
        }
    }
    

      

  • 相关阅读:
    ZOJ 3332 Strange Country II
    ZOJ 3331 Process the Tasks(双塔DP)
    ZOJ 3326 An Awful Problem(模拟)
    HDU 1796 How many integers can you find(容斥原理)
    HDU 4059 The Boss on Mars(容斥原理)
    HDU 4135 Co-prime(容斥原理)
    HDU 5677 ztr loves substring(回文串加多重背包)
    CodeForces 668B Little Artem and Dance
    CodeForces 667A Pouring Rain
    Java实现 LeetCode 764 最大加号标志(暴力递推)
  • 原文地址:https://www.cnblogs.com/ICE_Inspire/p/5556583.html
Copyright © 2011-2022 走看看