C# 应用 - 使用 HttpWebRequest 发起 Http 请求
阅读原文时间:2023年07月13日阅读:1
  1. helper 类封装
  2. 调用

1. 引用的库类

\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6\System.dll
    System.Net.HttpWebRequest

2代码 helper 类封装

/// <summary>
/// REST帮助类
/// </summary>
public class RESTHelper
{
    /// <summary>
    /// 不含请求参数的URL
    /// </summary>
    public string EndPoint { get; set; }

    /// <summary>
    /// 请求动作
    /// </summary>
    public HttpVerb Method { get; set; }

    /// <summary>
    /// 请求格式(application/json,text/xml,application/x-www-form-urlencoded,multipart/form-data)
    /// </summary>
    public string ContentType { get; set; }

    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="endpoint">路径</param>
    /// <param name="method">请求动作</param>
    public RESTHelper(string endpoint, HttpVerb method)
    {
        EndPoint = endpoint;
        Method = method;
        ContentType = "application/json";
    }

    /// <summary>
    /// 将对象转换为json格式然后命令,一般是使用post请求
    /// </summary>
    /// <param name="jsonmodel">参数对象,不能传入string类型</param>
    /// <param name="encode">字符编码,可为null</param>
    /// <returns></returns>
    public string MakeJsonPostRequest(object jsonmodel, Encoding encode = null, WebHeaderCollection headerCollection = null)
    {
        string postData = "";
        if (jsonmodel != null)
        {
            //将对象序列化为json字符串,忽略null值
            postData = JsonConvert.SerializeObject(jsonmodel, new Newtonsoft.Json.JsonSerializerSettings { NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore, DateFormatString = "yyyy-MM-dd HH:mm:ss" });
        }
        return MakeRequest("", postData, encode, headerCollection);
    }

    /// <summary>
    /// 发送请求,包含url的参数和请求数据
    /// </summary>
    /// <param name="parameters">请求参数,如page=1&page_size=20</param>
    /// <param name="postData">请求数据</param>
    /// <param name="encode">字符编码,可为null</param>
    /// <returns></returns>
    public string MakeRequest(string parameters, string postData, Encoding encode = null, WebHeaderCollection headerCollection = null)
    {
        // endpoint与请求参数拼接成完整的请求url
        string requesturlstring = EndPoint + (string.IsNullOrEmpty(parameters) ? "" : "?" + parameters);
        // 请求前记录日志
        DateTime dt = DateTime.Now;
        if (WriteLog.LoggerInstance.IsDebugEnabled) WriteLog.WriteLogger.Debug("[REST请求] 请求时间:" + dt.ToString("mm:ss.fff") + "\r\nURI:" + requesturlstring + "\r\n发送请求:" + postData);
        // 初始化http请求
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requesturlstring);
        if (headerCollection != null)
            request.Headers = headerCollection;
        request.Method = Method.ToString();
        request.ContentLength = 0;
        request.ContentType = ContentType;
        request.Timeout = ConfigInfo.RESTTimeOut;

        //request.Credentials = new NetworkCredential("username", "password");//传入验证信息

        // 编码格式
        encode = encode == null ? Encoding.UTF8 : encode;
        // POST时,向流写入postData数据
        if (!string.IsNullOrEmpty(postData) && Method == HttpVerb.POST)
        {
            var bytes = encode.GetBytes(postData);
            // 设置请求数据的长度
            request.ContentLength = bytes.Length;

            using (var writeStream = request.GetRequestStream())
            {
                writeStream.Write(bytes, 0, bytes.Length);
            }
        }

        // 返回值
        var responseValue = string.Empty;

        // 获取返回值
        using (var response = (HttpWebResponse)request.GetResponse())
        {
            using (var responseStream = response.GetResponseStream())
            {
                using (var reader = new StreamReader(responseStream, encode))
                {
                    responseValue = reader.ReadToEnd();
                    // 记录返回结果日志
                    if (WriteLog.LoggerInstance.IsDebugEnabled) WriteLog.WriteLogger.Debug("[REST结果] 请求时间:" + dt.ToString("mm:ss.fff") + "\r\nURI:" + requesturlstring + "\r\n返回数据:" + responseValue);

                    return responseValue;
                }
            }
        }
    }

    /// <summary>
    /// 将json字符串转换为对象(使用DataContractJsonSerializer)
    /// </summary>
    /// <param name="response"></param>
    /// <param name="dateformatstring">时间格式</param>
    /// <returns></returns>
    public T ConvertJson<T>(string response)
    {
        try
        {
            DataContractJsonSerializer Serializer = new DataContractJsonSerializer(typeof(T));
            using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(response)))
            {
                return (T)Serializer.ReadObject(stream);
            }
        }
        catch (Exception ex)
        {
            WriteLog.WriteLogger.Error("将json字符串转换为对象出错!\r\njson为:" + response, ex);
            return default(T);
        }
    }

    /// <summary>
    /// 将json字符串转换为对象(使用Json.net)
    /// </summary>
    /// <param name="response"></param>
    /// <param name="dateformatstring">时间格式</param>
    /// <returns></returns>
    public T JsonNetConvertJson<T>(string response)
    {
        try
        {
            JsonSerializerSettings jsSetting = new JsonSerializerSettings();
            jsSetting.NullValueHandling = NullValueHandling.Ignore;
            return JsonConvert.DeserializeObject<T>(response, jsSetting);
            //return JsonConvert.DeserializeObject<T>(response);
        }
        catch (Exception ex)
        {
            Common.WriteLog.Error("将json字符串转换为对象出错!\r\njson为:" + response, ex);
            return default(T);
        }
    }
}

/// <summary>
/// http请求方法/动作
/// </summary>
public enum HttpVerb
{
    GET,
    POST,
    PUT,
    DELETE
}

3. 调用

public class AClass{}
public AClass RequestAClass(string id)
{
    AClass entity = null;

    try
    {
        var uri = ConfigInfo.GetRestUri("GetAClassInfo");

        // 参数校验
        if (string.IsNullOrEmpty(id))
            return null;

        var restHelper = new RESTHelper(uri.Uri, HttpVerb.GET);
        var jsonString = restHelper.MakeRequest(id);
        entity = restHelper.ConvertJson<PrisonerInfoResponseModel>(jsonString);
    }
    catch (Exception exception) {}

    return entity;
}

4. Http 系列

4.1 发起请求

使用 HttpWebRequest 发起 Http 请求:https://www.cnblogs.com/MichaelLoveSna/p/14501036.html

使用 WebClient 发起 Http 请求 :https://www.cnblogs.com/MichaelLoveSna/p/14501582.html

使用 HttpClient 发起 Http 请求:https://www.cnblogs.com/MichaelLoveSna/p/14501592.html

使用 HttpClient 发起上传文件、下载文件请求:https://www.cnblogs.com/MichaelLoveSna/p/14501603.html

4.2 接受请求

使用 HttpListener 接受 Http 请求:https://www.cnblogs.com/MichaelLoveSna/p/14501628.html

使用 WepApp 接受 Http 请求:https://www.cnblogs.com/MichaelLoveSna/p/14501612.html

使用 WepApp 处理文件上传、下载请求:https://www.cnblogs.com/MichaelLoveSna/p/14501616.html