代码改变世界

C# 使用HttpClient WebRequest 实现GET,POST请求分析

2025-02-19 20:44  Ritchie.Lee  阅读(92)  评论(0)    收藏  举报

在 C# 中,HttpClient 和 WebRequest 都可以用于实现 GET 和 POST 请求,但 HttpClient 通常被认为是更现代、更优的选择。

1. API 设计

HttpClient: 提供了更简洁、更易于使用的 API。
它将 HTTP 请求的各个部分(如请求方法、URL、头部、内容等)都封装成了对象,方便开发者进行操作。
例如,
发送 GET 请求只需要调用 client.GetAsync(url),
发送 POST 请求只需要调用 client.PostAsync(url, content)。
WebRequest: 相对来说 API 比较底层,需要手动设置很多细节,例如创建请求对象、设置请求方法、设置头部、写入请求内容等。代码相对繁琐。

2. 异步编程

HttpClient: 天然支持异步编程,提供了 *Async 方法,可以很方便地使用 async 和 await 关键字进行异步操作,提高应用程序的响应性。
WebRequest: 虽然也支持异步编程,但需要使用回调函数或者 Begin/End 方法,使用起来不如 HttpClient 简洁。

3. 性能

HttpClient: 在性能方面通常优于 WebRequest。HttpClient 内部使用了连接池等优化机制,可以减少连接的创建和销毁,提高请求的效率。
WebRequest: 相对来说,性能可能稍逊于 HttpClient。

4. 扩展性

HttpClient: 提供了更丰富的配置选项,例如可以设置超时时间、代理、Cookie 容器等。
WebRequest: 虽然也可以进行配置,但不如 HttpClient 灵活。

示例说明

GET

  • HttpClient
using System.Net.Http;
using System.Threading.Tasks;

public async Task<string> GetAsync(string url)
{
    using (HttpClient client = new HttpClient())
    {
        HttpResponseMessage response = await client.GetAsync(url);
        response.EnsureSuccessStatusCode(); // 抛出异常如果状态码不是 200-299
        return await response.Content.ReadAsStringAsync();
    }
}
  • WebRequest
using System.Net;
using System.IO;
using System.Threading.Tasks;

public async Task<string> GetAsync(string url)
{
    WebRequest request = WebRequest.Create(url);
    request.Method = "GET";

    using (WebResponse response = await request.GetResponseAsync())
    using (Stream stream = response.GetResponseStream())
    using (StreamReader reader = new StreamReader(stream))
    {
        return reader.ReadToEnd();
    }
}

使用 HttpClient 的代码更加简洁明了,易于理解和维护

POST

  • HttpClient
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

public async Task<string> PostAsync(string url, string data)
{
    using (HttpClient client = new HttpClient())
    {
        // 将字符串数据转换为 StringContent 对象
        var content = new StringContent(data, Encoding.UTF8, "application/json"); // 设置Content-Type

        HttpResponseMessage response = await client.PostAsync(url, content);
        response.EnsureSuccessStatusCode(); // 抛出异常如果状态码不是 200-299

        return await response.Content.ReadAsStringAsync();
    }
}

// 调用示例
string url = "https://example.com/api/post";
string data = "{"name":"张三","age":18}"; // JSON 格式的数据

string result = await PostAsync(url, data);
Console.WriteLine(result);

代码解释:

using (HttpClient client = new HttpClient()):创建一个 HttpClient 实例,并使用 using 语句确保在使用完毕后释放资源。
var content = new StringContent(data, Encoding.UTF8, "application/json");:将要发送的数据(字符串格式)转换为 StringContent 对象。Encoding.UTF8 指定编码格式为 UTF-8,"application/json" 指定 Content-Type 为 JSON 格式。
HttpResponseMessage response = await client.PostAsync(url, content);:使用 PostAsync 方法发送 POST 请求,url 为请求 URL,content 为请求内容。
response.EnsureSuccessStatusCode();:检查响应状态码,如果不是 2xx,则抛出异常。
return await response.Content.ReadAsStringAsync();:读取响应内容并返回字符串格式。

  • WebRequest

using System.Net;
using System.IO;
using System.Text;
using System.Threading.Tasks;

public async Task<string> PostAsync(string url, string data)
{
    WebRequest request = WebRequest.Create(url);
    request.Method = "POST";
    request.ContentType = "application/json"; // 设置Content-Type

    // 将数据写入请求流
    using (Stream stream = await request.GetRequestStreamAsync())
    using (StreamWriter writer = new StreamWriter(stream))
    {
        writer.Write(data);
    }

    using (WebResponse response = await request.GetResponseAsync())
    using (Stream stream = response.GetResponseStream())
    using (StreamReader reader = new StreamReader(stream))
    {
        return reader.ReadToEnd();
    }
}

// 调用示例
string url = "https://example.com/api/post";
string data = "{"name":"张三","age":18}"; // JSON 格式的数据

string result = await PostAsync(url, data);
Console.WriteLine(result);

代码解释:

WebRequest request = WebRequest.Create(url);:创建一个 WebRequest 对象,url 为请求 URL。
request.Method = "POST";:设置请求方法为 POST。
request.ContentType = "application/json";:设置 Content-Type 为 JSON 格式。
using (Stream stream = await request.GetRequestStreamAsync()) ...:获取请求流,并将数据写入流中。
using (WebResponse response = await request.GetResponseAsync()) ...:获取响应对象,并读取响应内容。

总结

总的来说,HttpClient 在 API 设计、异步编程、性能和扩展性方面都优于 WebRequest,因此更推荐使用 HttpClient 来实现 GET 和 POST 请求。当然,WebRequest 也有其存在的价值,例如在某些特定的场景下,可能需要使用 WebRequest 的一些高级特性。但是对于大多数情况来说,HttpClient 都是更好的选择。

HttpClient 提供了更简洁、更易于使用的 API,代码更清晰。
HttpClient 天然支持异步编程,使用 async 和 await 关键字可以更方便地进行异步操作。
WebRequest 相对来说 API 比较底层,需要手动设置很多细节,代码相对繁琐。
因此,在大多数情况下,建议使用 HttpClient 来实现 POST 请求。只有在一些特定的场景下,可能需要使用 WebRequest 的一些高级特性。

建议

优先使用 HttpClient 来实现 GET 和 POST 请求。
如果需要使用 WebRequest 的一些高级特性,或者需要兼容一些旧的代码,可以继续使用 WebRequest。
在使用 HttpClient 时,建议使用 using 语句或者 using 声明来确保 HttpClient 实例被正确释放,避免资源泄漏。
根据实际需求选择合适的数据格式,例如 JSON、XML 等,并设置相应的 Content-Type。