C#实现GET与POST HTTP请求的方法
本文详细介绍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>();
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# 网络编程的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









