C# 网络编程-关于HttpWebRequest使用方式(二)

项目开发用到数据请求时候,会用的到HttpWebRequest的请求方式,主要涵盖GET、POST、PUT、DELETE等方法

一、HttpWebRequest简介

HttpWebRequest是.NET Framework中用于发送HTTP请求的核心类,适用于构建HTTP客户端。它支持GET、POST、PUT、DELETE等HTTP方法,但代码相对底层,需要手动处理请求和响应的生命周期。在.NET Core及后续版本中,推荐使用HttpClient替代,但本文重点讲解HttpWebRequest。


二、常用请求方式

1. GET请求(获取资源)

用途:从服务器获取数据(如查询API)。

步骤:

  1. 创建HttpWebRequest实例。
  2. 设置Method为GET。
  3. 发送请求并获取响应。
  4. 读取响应内容。

示例代码:

csharp 复制代码
using System;
using System.IO;
using System.Net;

public class HttpGetExample
{
    public static void Main()
    {
        string url = "https://api.example.com/data";
        try
        {
            // 1. 创建请求
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "GET";
            
            // 2. 发送请求并获取响应
            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                // 3. 读取响应内容
                using (Stream responseStream = response.GetResponseStream())
                using (StreamReader reader = new StreamReader(responseStream))
                {
                    string result = reader.ReadToEnd();
                    Console.WriteLine("Response: " + result);
                }
            }
        }
        catch (WebException ex)
        {
            // 异常处理
            HandleWebException(ex);
        }
    }
}

2. POST请求(提交数据)

用途:向服务器提交数据(如表单提交、创建资源)。

步骤:

  1. 创建请求并设置Method为POST。
  2. 设置请求头(如Content-Type)。
  3. 写入请求体数据。
  4. 发送请求并处理响应。

示例代码:

csharp 复制代码
public class HttpPostExample
{
    public static void Main()
    {
        string url = "https://api.example.com/submit";
        string postData = "username=John&password=123456"; // 表单数据
        
        try
        {
            // 1. 创建请求
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded"; // 设置内容类型
            
            // 2. 写入请求体
            using (Stream requestStream = request.GetRequestStream())
            using (StreamWriter writer = new StreamWriter(requestStream))
            {
                writer.Write(postData);
            }
            
            // 3. 发送请求并处理响应
            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            {
                string result = reader.ReadToEnd();
                Console.WriteLine("Response: " + result);
            }
        }
        catch (WebException ex)
        {
            HandleWebException(ex);
        }
    }
}

3. PUT请求(更新资源)

用途:更新服务器上的现有资源(类似POST但用于更新)。

步骤:

  1. 设置Method为PUT。
  2. 写入请求体(如JSON或表单数据)。

示例代码:

csharp 复制代码
public class HttpPutExample
{
    public static void Main()
    {
        string url = "https://api.example.com/update/123";
        string jsonBody = "{\"name\": \"New Name\"}";
        
        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "PUT";
            request.ContentType = "application/json";
            
            using (Stream requestStream = request.GetRequestStream())
            using (StreamWriter writer = new StreamWriter(requestStream))
            {
                writer.Write(jsonBody);
            }
            
            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                Console.WriteLine($"Status Code: {response.StatusCode}");
            }
        }
        catch (WebException ex)
        {
            HandleWebException(ex);
        }
    }
}

4. DELETE请求(删除资源)

用途:删除服务器上的资源。

步骤:

  1. 设置Method为DELETE。
  2. 通常不需要请求体,但可以添加查询参数。

示例代码:

csharp 复制代码
public class HttpDeleteExample
{
    public static void Main()
    {
        string url = "https://api.example.com/delete/456";
        
        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "DELETE";
            
            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                Console.WriteLine($"Status Code: {response.StatusCode}");
            }
        }
        catch (WebException ex)
        {
            HandleWebException(ex);
        }
    }
}

三、其他常见配置

1. 设置超时
csharp 复制代码
request.Timeout = 5000; // 5秒超时
request.ReadWriteTimeout = 5000; // 读写超时
2. 处理Cookie
csharp 复制代码
// 获取响应中的Cookie
CookieContainer cookieContainer = new CookieContainer();
request.CookieContainer = cookieContainer;

// 或者从响应头提取Cookie
foreach (Cookie cookie in response.Cookies)
{
    Console.WriteLine($"Cookie: {cookie.Name} = {cookie.Value}");
}
3. 设置代理
csharp 复制代码
request.Proxy = new WebProxy("http://proxy.example.com:8080");
4. 处理SSL证书问题(测试环境使用)
csharp 复制代码
ServicePointManager.ServerCertificateValidationCallback +=
    (sender, certificate, chain, sslPolicyErrors) => true;

四、异步请求

HttpWebRequest支持异步操作,避免阻塞主线程:

csharp 复制代码
public async Task MakeAsyncRequest()
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://api.example.com");
    request.Method = "GET";

    using (HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync())
    using (Stream stream = response.GetResponseStream())
    using (StreamReader reader = new StreamReader(stream))
    {
        string result = await reader.ReadToEndAsync();
        Console.WriteLine(result);
    }
}

五、错误处理与异常管理

HttpWebRequest通过WebException抛出异常:

csharp 复制代码
private static void HandleWebException(WebException ex)
{
    if (ex.Response != null)
    {
        using (HttpWebResponse errorResponse = (HttpWebResponse)ex.Response)
        {
            Console.WriteLine($"Error Status Code: {errorResponse.StatusCode}");
            using (Stream stream = errorResponse.GetResponseStream())
            using (StreamReader reader = new StreamReader(stream))
            {
                Console.WriteLine("Error Response: " + reader.ReadToEnd());
            }
        }
    }
    else
    {
        Console.WriteLine($"Network Error: {ex.Message}");
    }
}

六、注意事项

  1. 资源释放 :始终使用using语句确保WebResponse和Stream正确释放。
  2. 安全性 :避免在生产环境忽略SSL证书验证(ServerCertificateValidationCallback)。
  3. 替代方案 :在.NET Core中推荐使用HttpClient,它更简洁且支持异步操作。
  4. 性能 :频繁请求时,考虑复用HttpClient(HttpWebRequest需手动管理连接池)。

七、总结

HttpWebRequest是.NET中实现HTTP客户端的基础类,适合需要精细控制请求和响应的场景。但需注意其底层特性及潜在的资源管理问题。对于现代应用,建议优先使用HttpClient,它提供了更简洁的API和更好的性能。

相关推荐
张张123y13 小时前
DSH 插件调试避坑:client.js 设置面板、热重载与高频报错排查表
开发语言·javascript·人工智能·开源·ecmascript·后端开发·ai agent
冻柠檬飞冰走茶15 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
FRing0316 小时前
vue2干货总结7(自定义指令、插槽、单页应用程序、路由的使用(VueRouter))
开发语言·前端·vue.js·vue2
雪落漂泊16 小时前
C++算法 二分查找篇(上)
开发语言·c++·算法
波力海苔夹心脆67517 小时前
C# WPF 资源字典详解:ResourceDictionary、MergedDictionaries 与自定义控件案例
开发语言·c#·wpf·入门教程·resource·资源字典
不会算法的笨小孩17 小时前
异常的使用以及会出现的问题
开发语言·c++·c++11·异常
AI导出鸭PC端19 小时前
Perplexity批量导出没有PDF模式?AI导出鸭插件补上最后一块拼图
人工智能·pdf·c#·ai导出鸭
Hhy_110719 小时前
《C++深度解构06》手撕 string —— 从底层内存管理到深浅拷贝彻底吃透
c语言·开发语言·c++·学习·visual studio
starzy199019 小时前
深入理解Scala函数定义:从方法到函数的类型跨越
开发语言·scala
starzy199020 小时前
深入理解Scala递归函数:从栈溢出到尾调用优化
开发语言·scala