基于C#实现任意格式JSON文本的HTTP交互抽象类

 更新时间:2025年03月17日 08:41:09   作者:老胖闲聊  
为了实现一个支持任意格式JSON交互的抽象类,并且在整个过程中不需要对JSON格式数据进行序列化和反序列化操作,可以使用C#中的HttpClient类来进行HTTP请求和响应,本文给大家介绍了基于C#实现任意格式JSON文本的HTTP交互抽象类,需要的朋友可以参考下

引言

为了实现一个支持任意格式JSON交互的抽象类,并且在整个过程中不需要对JSON格式数据进行序列化和反序列化操作,可以使用C#中的HttpClient类来进行HTTP请求和响应。下面将创建一个抽象类JsonHttpClient,它封装了HTTP请求和响应的逻辑,并且允许直接处理JSON字符串。

1. 创建抽象类 JsonHttpClient

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

public abstract class JsonHttpClient
{
    // HttpClient实例,用于发送HTTP请求
    private readonly HttpClient _httpClient;

    // 构造函数,初始化HttpClient
    protected JsonHttpClient()
    {
        _httpClient = new HttpClient();
    }

    // 发送HTTP请求的抽象方法,子类必须实现
    protected abstract Task<HttpResponseMessage> SendRequestAsync(HttpRequestMessage request);

    // 发送HTTP GET请求
    public async Task<string> GetAsync(string uri)
    {
        // 创建HTTP GET请求
        var request = new HttpRequestMessage(HttpMethod.Get, uri);

        // 发送请求并获取响应
        var response = await SendRequestAsync(request);

        // 确保响应成功
        response.EnsureSuccessStatusCode();

        // 读取响应内容并返回
        return await response.Content.ReadAsStringAsync();
    }

    // 发送HTTP POST请求
    public async Task<string> PostAsync(string uri, string jsonContent)
    {
        // 创建HTTP POST请求
        var request = new HttpRequestMessage(HttpMethod.Post, uri)
        {
            Content = new StringContent(jsonContent, Encoding.UTF8, "application/json")
        };

        // 发送请求并获取响应
        var response = await SendRequestAsync(request);

        // 确保响应成功
        response.EnsureSuccessStatusCode();

        // 读取响应内容并返回
        return await response.Content.ReadAsStringAsync();
    }

    // 发送HTTP PUT请求
    public async Task<string> PutAsync(string uri, string jsonContent)
    {
        // 创建HTTP PUT请求
        var request = new HttpRequestMessage(HttpMethod.Put, uri)
        {
            Content = new StringContent(jsonContent, Encoding.UTF8, "application/json")
        };

        // 发送请求并获取响应
        var response = await SendRequestAsync(request);

        // 确保响应成功
        response.EnsureSuccessStatusCode();

        // 读取响应内容并返回
        return await response.Content.ReadAsStringAsync();
    }

    // 发送HTTP DELETE请求
    public async Task<string> DeleteAsync(string uri)
    {
        // 创建HTTP DELETE请求
        var request = new HttpRequestMessage(HttpMethod.Delete, uri);

        // 发送请求并获取响应
        var response = await SendRequestAsync(request);

        // 确保响应成功
        response.EnsureSuccessStatusCode();

        // 读取响应内容并返回
        return await response.Content.ReadAsStringAsync();
    }
}

2. 实现具体的HTTP客户端类

可以创建一个具体的HTTP客户端类,继承自JsonHttpClient,并实现SendRequestAsync方法。

public class MyHttpClient : JsonHttpClient
{
    // 实现SendRequestAsync方法
    protected override async Task<HttpResponseMessage> SendRequestAsync(HttpRequestMessage request)
    {
        // 使用HttpClient发送请求并返回响应
        return await _httpClient.SendAsync(request);
    }
}

3. 使用案例

下面是一个从发送HTTP请求到获取响应并显示在控制台的完整案例。

using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        // 创建MyHttpClient实例
        var httpClient = new MyHttpClient();

        // 定义API的URL
        string apiUrl = "https://jsonplaceholder.typicode.com/posts";

        try
        {
            // 发送HTTP GET请求
            string response = await httpClient.GetAsync(apiUrl);

            // 将响应内容显示在控制台
            Console.WriteLine("Response from GET request:");
            Console.WriteLine(response);

            // 发送HTTP POST请求
            string postData = "{\"title\": \"foo\", \"body\": \"bar\", \"userId\": 1}";
            string postResponse = await httpClient.PostAsync(apiUrl, postData);

            // 将响应内容显示在控制台
            Console.WriteLine("Response from POST request:");
            Console.WriteLine(postResponse);
        }
        catch (HttpRequestException e)
        {
            // 处理HTTP请求异常
            Console.WriteLine("HTTP Request Error: " + e.Message);
        }
        catch (Exception e)
        {
            // 处理其他异常
            Console.WriteLine("Error: " + e.Message);
        }
    }
}

4. 代码注解

  • HttpClientHttpClient是C#中用于发送HTTP请求和接收HTTP响应的类。它是线程安全的,建议在应用程序中重用同一个HttpClient实例。

  • HttpRequestMessage: 表示一个HTTP请求消息,包含请求方法(GET、POST等)、请求URI、请求头、请求内容等信息。

  • HttpResponseMessage: 表示一个HTTP响应消息,包含响应状态码、响应头、响应内容等信息。

  • StringContent: 用于将字符串内容作为HTTP请求的内容发送。我们可以指定内容的编码和媒体类型(如application/json)。

  • EnsureSuccessStatusCode: 确保HTTP响应的状态码表示成功(2xx),否则抛出HttpRequestException异常。

  • ReadAsStringAsync: 异步读取HTTP响应的内容并返回为字符串。

5. 运行结果

当运行这个程序时,它会发送一个GET请求和一个POST请求到https://jsonplaceholder.typicode.com/posts,并将响应内容打印到控制台。GET请求会返回所有的帖子,而POST请求会创建一个新的帖子并返回创建的结果。

6. 总结

通过这个抽象类JsonHttpClient,可以轻松地发送HTTP请求并处理响应,而不需要对JSON数据进行序列化和反序列化操作。这种方法适用于需要直接处理JSON字符串的场景,例如与某些API进行交互时。

以上就是基于C#实现任意格式JSON文本的HTTP交互抽象类的详细内容,更多关于C# JSON的HTTP交互抽象类的资料请关注脚本之家其它相关文章!

相关文章

  • C#简单写入xml文件的方法

    C#简单写入xml文件的方法

    这篇文章主要介绍了C#简单写入xml文件的方法,可实现C#针对XML文件简单写入的功能,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • C#通过Win32API设置客户端系统时间的方法详解

    C#通过Win32API设置客户端系统时间的方法详解

    在日常工作中,有时可能会需要获取或修改客户端电脑的系统时间,比如软件设置了Licence有效期,本文以一个简单的小例子,简述如何通过C#获取和设置客户端电脑的系统时间,仅供学习分享使用,如有不足之处,还请指正,需要的朋友可以参考下
    2024-06-06
  • C#使用SqlConnection连接到SQL Server的代码示例

    C#使用SqlConnection连接到SQL Server的代码示例

    这篇文章主要介绍了C#使用SqlConnection连接到SQL Server的代码示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • C#微信分享代码

    C#微信分享代码

    这篇文章主要为大家详细介绍了C#微信分享的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • unity3d 对接 workerman 实现联机游戏功能

    unity3d 对接 workerman 实现联机游戏功能

    workerman 是一款开源高性能 PHP 应用容器,他除了用于互联网、即时通讯、APP 开发、硬件通讯、智能家居、物联网等领域的开发外,这篇文章主要介绍了unity3d 对接 workerman 实现联机游戏,需要的朋友可以参考下
    2022-10-10
  • C#多线程学习之(五)使用定时器进行多线程的自动管理

    C#多线程学习之(五)使用定时器进行多线程的自动管理

    这篇文章主要介绍了C#多线程学习之使用定时器进行多线程的自动管理,实例分析了C#使用timer定时器类实现针对多线程的自动管理功能,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • 基于C#编写一个接受图片流的OCR识别接口

    基于C#编写一个接受图片流的OCR识别接口

    这篇文章主要为大家详细介绍了如何使用C#写一个接受图片流的OCR识别接口,以及测试用例调用接口,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • C#自定义音乐播放器进度条

    C#自定义音乐播放器进度条

    这篇文章主要为大家详细介绍了C#自定义音乐播放器进度条效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • 深入学习C#网络编程之HTTP应用编程(下)

    深入学习C#网络编程之HTTP应用编程(下)

    这篇文章主要介绍了深入学习C#网络编程之HTTP应用编程的相关知识,文中讲解的非常详细,帮助大家更好的学习c#网络编程,感兴趣的朋友可以了解下
    2020-06-06
  • C#使用yield关键字让自定义集合实现foreach遍历的方法

    C#使用yield关键字让自定义集合实现foreach遍历的方法

    这篇文章主要介绍了C#使用yield关键字让自定义集合实现foreach遍历的方法,需要的朋友可以参考下
    2014-08-08

最新评论