C#实现GET与POST HTTP请求的方法

江屿
江屿
发布时间:2026-10-16| 5人浏览过
原创

本文详细介绍C#中如何使用System.Net库发送HTTP请求,对比GET与POST的核心差异,并分别提供GetHttpRequest和PostHttpRequest的完整代码实现与调用示例。

GET与POST请求的区别

数据传输方式

GET请求将提交的数据进行简单编码,并附加在URL末尾发送给服务器,例如:?Name=zhangshi&Age=30。因此,GET适合用于获取非敏感数据。POST请求则将数据放置在HTTP请求包的包体(Body)中进行传输,数据不会暴露在URL中,更适合提交表单或上传文件。

数据大小限制

由于浏览器和服务器对URL长度通常有限制,GET请求传输的数据量受到严格约束。POST请求理论上不受此限制,但实际应用中各服务器(如Apache、IIS)会对POST数据大小进行配置限制。

安全性考量

POST的安全性高于GET。若使用GET进行登录操作,用户名和密码会直接显示在URL中,存在被浏览器历史记录捕获或造成跨站请求伪造(CSRF)攻击的风险。对于密码支付等敏感操作,务必使用POST。

C#实现GET请求

第1步:构建GET请求类

目的:创建一个静态方法,封装标准的GET请求逻辑,包括设置超时、编码和流读取。

入口:定义一个接收URL字符串和超时时间(毫秒)的公共静态方法。
动作:使用HttpWebRequest创建请求对象,指定Method为GET,ContentType为UTF-8,并通过StreamReader读取返回的Stream流转换为字符串。
重要参数:url为目标地址,Timeout为等待响应的最大毫秒数。
完成状态:方法返回服务器响应的JSON或文本字符串。

/// <summary>
/// GET请求
/// </summary>
public static string GetHttpResponse(string url, int Timeout)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "GET";
    request.ContentType = "text/html;charset=UTF-8";
    request.UserAgent = null;
    request.Timeout = Timeout;

    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    Stream myResponseStream = response.GetResponseStream();
    StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
    string retString = myStreamReader.ReadToEnd();
    myStreamReader.Close();
    myResponseStream.Close();

    return retString;
}

第2步:调用GET请求

目的:演示如何发起请求并反序列化返回结果。
动作:拼接包含参数的URL,调用上述方法,并将返回的JSON字符串解析为目标对象T。
重要参数:url需包含查询参数,6000表示超时时间为6秒。

string url = "http://127.0.0.1/login.jsp?Name=zhangshi&Age=30";
string res = HttpHelper.GetHttpResponse(url, 6000);
if (!string.IsNullOrEmpty(res))
{
    T mes = JsonHelper.DeserializeJsonToObject<T>(res);
}

C#实现POST请求

第1步:构建POST请求类

目的:创建支持HTTPS/HTTP、自定义参数集合和Cookie处理的POST请求方法。
动作:创建HttpWebRequest对象,指定Method为POST,ContentType为application/x-www-form-urlencoded。遍历参数字典,将其拼接为key=value&...格式的ASCII字节数组写入Request Stream。
重要参数:url为目标地址,parameters为键值对字典,timeout为超时时间,cookies为可选的Cookie集合。
完成状态:返回HttpWebResponse对象供后续读取。

public static HttpWebResponse CreatePostHttpResponse(string url, IDictionary<string, string> parameters, int timeout, string userAgent, CookieCollection cookies)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";

    // 设置代理UserAgent和超时
    // request.UserAgent = userAgent;
    // request.Timeout = timeout;

    if (cookies != null)
    {
        request.CookieContainer = new CookieContainer();
        request.CookieContainer.Add(cookies);
    }

    // 处理空参数情况
    if (!(parameters == null || parameters.Count == 0))
    {
        StringBuilder buffer = new StringBuilder();
        int i = 0;
        foreach (string key in parameters.Keys)
        {
            if (i > 0)
            {
                buffer.AppendFormat("&{0}={1}", key, parameters[key]);
            }
            else
            {
                buffer.AppendFormat("{0}={1}", key, parameters[key]);
                i++;
            }
        }
        byte[] data = Encoding.ASCII.GetBytes(buffer.ToString());
        using (Stream stream = request.GetRequestStream())
        {
            stream.Write(data, 0, data.Length);
        }
    }

    string[] values = request.Headers.GetValues("Content-Type");
    return request.GetResponse() as HttpWebResponse;
}

/// <summary>
/// 从Response中读取字符串
/// </summary>
public static string GetResponseString(HttpWebResponse webresponse)
{
    using (Stream s = webresponse.GetResponseStream())
    {
        StreamReader reader = new StreamReader(s, Encoding.UTF8);
        return reader.ReadToEnd();
    }
}

第2步:调用POST请求

目的:演示构造参数字典并处理异常情况的调用流程。
动作:初始化IDictionary<string, string>,添加需要进行URL编码的参数值。调用CreatePostHttpResponse获取响应,检查是否为null以防网络故障,最后读取内容并反序列化。
重要参数:url, parameters, 3000超时, null默认UA/Cookies。

// 构造参数
IDictionary<string, string> parameters = new Dictionary<string, string&gt();
string p = "someValue";
parameters.Add("p", HttpUtility.UrlEncode(p));

// 发起请求
System.Net.HttpWebResponse res = HttpHelper.CreatePostHttpResponse(url, parameters, 3000, null, null);

if (res == null)
{
    // 处理失败情况,如重定向到错误页
    Response.Redirect("RequestFailed.aspx?result=出错了,可能是由于您的网络环境差、不稳定或安全软件禁止访问网络,您可在网络好时或关闭安全软件在重新访问网络。");
}
else
{
    try
    {
        // 获取返回数据转为字符串
        string mes = HttpHelper.GetResponseString(res);
        T model = JsonHelper.DeserializeJsonToObject<T>(mes);
    }
    finally
    {
        res.Close(); // 确保资源释放
    }
}

以上就是C#通过GET/POST方式发送Http请求的详细内容,更多关于C# 网络编程的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。