C# 中 发送HTTP请求 实现Ajax功能

Ajax技术的核心及其在jQuery中的使用,包括GET和POST请求的实现,以及Ajax轮询请求的工作原理。通过实例展示了如何使用jQuery.Ajax进行HTTP请求,与后端接口交互,以及处理JSON数据。同时还提到了跨域问题和轮询请求中停止条件的设定。

在C#中,确实存在多个可用于发送HTTP请求的NuGet包。这些包提供了丰富的功能,使得在C#应用程序中发起HTTP请求变得简单且高效。以下是一些常用的NuGet包及其简要介绍:

HttpSender

这是一个轻量级的C#库,用于发送HTTP消息。

使用非常简单,只需要一两行代码就能完成HTTP请求的发送。

支持GET、POST、PUT、DELETE等多种HTTP请求方法。

可以通过NuGet包管理器搜索并安装HttpSender。

FluentHttpClient(或类似名称的库,如FluentRestClient):

这些库提供了流畅的API来构建和发送HTTP请求。

通常支持链式调用,使得代码更加简洁和易读。

也支持多种HTTP请求方法和自定义请求头等功能。

RestSharp:

这是一个流行的REST API客户端库,用于在.NET应用程序中发送HTTP请求。

提供了易于使用的API来构建请求、发送请求和处理响应。

支持JSON和XML等多种数据格式,以及自定义请求头和身份验证等功能。

HttpClient(.NET框架内置):

从.NET Framework 4.5开始,.NET框架就内置了HttpClient类,用于发送HTTP请求。

它是.NET中发送HTTP请求的标准方式,提供了丰富的功能和配置选项。

支持异步请求、请求头、响应处理等高级功能。

SnifferHttp(用于抓包):

虽然这个库主要用于抓取HTTP数据包,但它也可以用于发送HTTP请求(尽管这不是其主要功能)。

它允许监听网络接口,并解析出经过的HTTP请求和响应。

对于需要监控网络流量或分析HTTP请求的应用场景非常有用。

请注意,选择哪个NuGet包取决于你的具体需求和偏好。对于大多数简单的HTTP请求场景,HttpClient或HttpSender等轻量级库可能就足够了。而如果你需要处理更复杂的REST API调用或需要更高级的请求构建和响应处理功能,则可能需要考虑使用RestSharp等更强大的库。

上述包中,第三方提供的包,功能很强大,用起来也比较顺手,但如果项目中仅仅实现简单的http请求,可以自行封装HttpClient(.NET框架内置),使用起来更加方便。

csharp 复制代码
using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

namespace Util;
public static class AjaxHelper
{
    private static readonly HttpClient _httpClient = new HttpClient();

    public static async Task<T?> GetAsync<T>(string url)
    {
        try
        {
            var response = await _httpClient.GetAsync(url);
            return await HandleResponse<T>(response);
        }
        catch (Exception ex)
        {
            HandleException(ex);
            return default;
        }
    }

    public static async Task<T?> PostAsync<T>(string url, object data)
    {
        try
        {
            var content = new StringContent(JsonSerializer.Serialize(data), Encoding.UTF8, "application/json");
            var response = await _httpClient.PostAsync(url, content);
            return await HandleResponse<T>(response);
        }
        catch (Exception ex)
        {
            HandleException(ex);
            return default;
        }
    }

    public static async Task PostAsync<T>(string url, T data)
    {
        try
        {
            var content = new StringContent(JsonSerializer.Serialize(data), Encoding.UTF8, "application/json");
            var response = await _httpClient.PostAsync(url, content);
         
        }
        catch (Exception ex)
        {
            HandleException(ex);
        }
    }

    public static async Task<T?> PutAsync<T>(string url, object data)
    {
        try
        {
            var content = new StringContent(JsonSerializer.Serialize(data), Encoding.UTF8, "application/json");
            var response = await _httpClient.PutAsync(url, content);
            return await HandleResponse<T>(response);
        }
        catch (Exception ex)
        {
            HandleException(ex);
            return default;
        }
    }

    public static async Task PutAsync<T>(string url, T data)
    {
        try
        {
            var content = new StringContent(JsonSerializer.Serialize(data), Encoding.UTF8, "application/json");
            var response = await _httpClient.PutAsync(url, content);
        }
        catch (Exception ex)
        {
            HandleException(ex);
        }
    }


    public static async Task<T?> DeleteAsync<T>(string url)
    {
        try
        {
            var response = await _httpClient.DeleteAsync(url);
            return await HandleResponse<T>(response);
        }
        catch (Exception ex)
        {
            HandleException(ex);
            return default;
        }
    }

    // 处理响应
    private static async Task<T?> HandleResponse<T>(HttpResponseMessage response)
    {
        response.EnsureSuccessStatusCode();
        var jsonResponse = await response.Content.ReadAsStringAsync();
        return JsonSerializer.Deserialize<T?>(jsonResponse);
    }

    // 异常处理
    private static void HandleException(Exception ex)
    {
        // 这里可以根据需要记录异常或进行其他处理
        Console.WriteLine($"An error occurred: {ex.Message}-{ex.StackTrace}");
    }
}
相关推荐
i建模4 小时前
在 Windows 中解决 `zig fetch` 的 `TlsInitializationFailed` 错误
windows·zig
问道飞鱼7 小时前
【Tauri框架学习】Windows 11 环境下 Tauri 开发环境安装与问题解决手册
windows·学习·tauri·开发环境
xiaoliuliu123458 小时前
Autodesk官方卸载工具使用教程(Windows版,含解压+管理员运行+批量卸载)
windows
八苦8 小时前
如何用c# 做 mcp/ChatGPT app
c#·mcp
人工智能AI技术10 小时前
DeskClaw Windows上线|C#开发AI桌面助手,轻量内核源码解析
人工智能·c#
似水明俊德10 小时前
04-C#.Net-委托和事件-面试题
java·开发语言·面试·c#·.net
johnrui10 小时前
集合与树形结构
开发语言·windows
柯儿的天空12 小时前
【OpenClaw 全面解析:从零到精通】第 006 篇:OpenClaw 在 Windows/WSL2 上的安装与部署实战
人工智能·windows·语言模型·chatgpt·ai作画
阿昭L13 小时前
说说Windows进程的令牌(token)
windows·系统安全·token
程序员老乔13 小时前
Java 新纪元 — JDK 25 + Spring Boot 4 全栈实战(二):Valhalla落地,值类型如何让电商DTO内存占用暴跌
java·spring boot·c#