C# RESTful完整使用实战示例

 更新时间:2025年12月04日 09:07:43   作者:wangnaisheng  
RESTful是一种轻量级、跨平台的Web服务架构风格,C# 中使用 RESTful API主要涉及客户端调用和服务器端实现两个方面,接下来通过本文介绍C# RESTful完整使用实战示例,感兴趣的朋友一起看看吧

一、RESTful基础

RESTful是一种轻量级、跨平台的Web服务架构风格,它的核心原则是:

  • 资源唯一标识:每个资源有唯一的URL
  • 无状态操作:服务器不保存客户端状态
  • 统一接口:用标准HTTP方法操作资源
HTTP方法操作幂等安全
GET查询
POST新增
PUT更新
DELETE删除

RESTful vs 传统API

  • 传统:/user/query/1
  • RESTful:/user/1

二、调用RESTful API的通用流程

// 1. 获取数据 - HttpClient最佳实践
using var httpClient = new HttpClient();
var response = await httpClient.GetAsync("https://api.example.com/data");
var jsonString = await response.Content.ReadAsStringAsync();
// 2. 解析JSON - 两种常用方式
// 方式一:动态解析(快速提取少量字段)
var jsonDoc = JsonDocument.Parse(jsonString);
string name = jsonDoc.RootElement.GetProperty("user").GetProperty("name").GetString();
// 方式二:强类型解析(推荐!)
public class User {
    public string Name { get; set; }
    public int Age { get; set; }
    public DateTime RegisterDate { get; set; }
}
var user = JsonSerializer.Deserialize<User>(jsonString, new JsonSerializerOptions {
    PropertyNameCaseInsensitive = true // 忽略大小写
});
// 3. 使用解析后的数据
Console.WriteLine($"欢迎,{user.Name}!您已注册于{user.RegisterDate:yyyy-MM-dd}");

三、JSON解析的实用技巧

3.1 推荐方案

使用System.Text.Json(.NET Core 3.0+)

优势

  • 微软原生,性能更好
  • 编译时检查 + 智能提示 + 高可维护性
  • 支持异步操作

3.2 常见坑点及解决方案

问题解决方案代码示例
字段大小写不一致PropertyNameCaseInsensitive = truenew JsonSerializerOptions { PropertyNameCaseInsensitive = true }
日期格式问题添加日期转换器options.Converters.Add(new DateTimeConverter("yyyy-MM-dd"));
JSON中有注释忽略注释options.ReadCommentHandling = JsonCommentHandling.Skip;
空字段导致异常设置默认值public string Name { get; set; } = string.Empty;

四、完整实战示例

using System;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
public class WeatherApiService
{
    public async Task<WeatherData> GetWeatherAsync(string location)
    {
        using var httpClient = new HttpClient();
        // 获取天气数据
        var response = await httpClient.GetAsync(
            $"https://api.weather.com/v3?location={location}");
        response.EnsureSuccessStatusCode();
        var json = await response.Content.ReadAsStringAsync();
        // 强类型解析(推荐方式)
        return JsonSerializer.Deserialize<WeatherData>(json, new JsonSerializerOptions {
            PropertyNameCaseInsensitive = true,
            NumberHandling = JsonNumberHandling.AllowReadingFromString
        });
    }
}
public class WeatherData
{
    public string City { get; set; }
    public string Condition { get; set; }
    public int Temperature { get; set; }
    public DateTime ForecastDate { get; set; }
}

五、为什么推荐System.Text.Json?

  1. 性能更好:比Newtonsoft.Json快约20-30%
  2. 原生集成:.NET Core 3.0+默认包含
  3. 安全:不依赖第三方库,减少安全风险
  4. 现代化:支持最新的JSON特性

六、进阶建议

  1. 创建通用API服务类:把HttpClient封装起来,避免重复代码
  2. 处理错误:添加try-catch块处理网络异常
  3. 缓存:对频繁请求的API添加缓存机制
  4. 异步:始终使用异步方法,提升应用性能

七、处理JSON嵌套复杂结构

三步搞定嵌套JSON处理(推荐System.Text.Json)

7.1 第一步:定义强类型模型(关键!)

// 定义嵌套结构
public class ApiResponse
{
    public string Status { get; set; }
    public Data Data { get; set; }
}
public class Data
{
    public List<User> Users { get; set; }
    public Meta Meta { get; set; }
}
public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Address Address { get; set; }
}
public class Address
{
    public string Street { get; set; }
    public string City { get; set; }
    public string ZipCode { get; set; }
}
public class Meta
{
    public int TotalCount { get; set; }
    public int Page { get; set; }
    public int PageSize { get; set; }
}

7.2 第二步:解析嵌套JSON(一行代码搞定!)

// 获取API返回的JSON字符串
string json = await httpClient.GetStringAsync("https://api.example.com/data");
// 一行代码解析嵌套结构(这才是真正的"快速"!)
var response = JsonSerializer.Deserialize<ApiResponse>(json, new JsonSerializerOptions
{
    PropertyNameCaseInsensitive = true, // 忽略大小写
    NumberHandling = JsonNumberHandling.AllowReadingFromString // 处理数字字符串
});

7.3 第三步:安全访问嵌套数据

// 安全访问嵌套数据
if (response != null && response.Data != null && response.Data.Users != null)
{
    foreach (var user in response.Data.Users)
    {
        Console.WriteLine($"用户: {user.Name}, 城市: {user.Address.City}");
    }
    // 也可以直接访问
    Console.WriteLine($"总用户数: {response.Data.Meta.TotalCount}");
}
  • 强类型安全:编译时检查,不会等到运行时才发现错误
  • 代码可读性高:一目了然,不需要写一堆doc["data"]["users"][0]["address"]["city"]
  • 性能更好:比Newtonsoft.Json快20-30%(.NET Core 3.0+)
  • 自动处理嵌套:不需要手动遍历每一层

八、实用技巧:处理常见嵌套问题

8.1 嵌套层级太深,字段可能为空

// 安全访问嵌套字段(避免NullReferenceException)
var city = response?.Data?.Users?[0]?.Address?.City ?? "N/A";
Console.WriteLine($"城市: {city}");

8.2 JSON字段名大小写不一致

new JsonSerializerOptions
{
    PropertyNameCaseInsensitive = true // 关键!忽略大小写
}

8.3 嵌套结构中可能有额外字段

// 忽略未知字段
new JsonSerializerOptions
{
    IgnoreUnknown = true
}

8.4 处理嵌套数组

// 获取所有用户的姓名
var userNames = response.Data.Users
    .Where(u => u.Id > 100)
    .Select(u => u.Name)
    .ToList();

一个真实案例:处理天气API的嵌套JSON

public class WeatherResponse
{
    public CurrentWeather Current { get; set; }
    public Forecast Forecast { get; set; }
}
public class CurrentWeather
{
    public string City { get; set; }
    public int Temperature { get; set; }
    public string Condition { get; set; }
}
public class Forecast
{
    public List<DailyForecast> Days { get; set; }
}
public class DailyForecast
{
    public DateTime Date { get; set; }
    public int HighTemp { get; set; }
    public int LowTemp { get; set; }
}
// 使用方式
var weather = JsonSerializer.Deserialize<WeatherResponse>(json);
Console.WriteLine($"当前城市: {weather.Current.City}, 温度: {weather.Current.Temperature}°C");
Console.WriteLine($"明天最高温: {weather.Forecast.Days[0].HighTemp}°C");

到此这篇关于C# RESTful完整使用实战示例的文章就介绍到这了,更多相关c# restful使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • C# 创建报表过程详解

    C# 创建报表过程详解

    本文给大家介绍的是使用vs2012 c#创建报表的全部过程的记录,十分的详细,有需要的小伙伴可以参考下。
    2015-06-06
  • 基于C#实现一维码和二维码打印功能

    基于C#实现一维码和二维码打印功能

    本文介绍了基于C#的条码打印程序的设计与实现,包括技术选型、核心功能、系统架构、参数配置、工程实践、扩展功能、调试测试及部署建议,需要的朋友可以参考下
    2025-12-12
  • c# 线性回归和多项式拟合示例详解

    c# 线性回归和多项式拟合示例详解

    线性回归与多项式拟合是两种常用的回归分析方法,线性回归模型简单,易于计算,但只适用于线性关系的数据,多项式拟合能处理非线性数据,模型更复杂,拟合度更高,但容易产生过拟合问题,计算成本较高,适用场景不同,线性回归适合线性数据,多项式拟合适合非线性数据
    2024-10-10
  • C#实现六大设计原则之接口隔离原则

    C#实现六大设计原则之接口隔离原则

    这篇文章介绍了C#实现六大设计原则之接口隔离原则的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • C#委托初级使用的实例代码

    C#委托初级使用的实例代码

    这篇代码介绍了C#中委托的初级使用实例,有需要的朋友可以参考一下
    2013-06-06
  • C#实现Stream与byte[]之间的转换实例教程

    C#实现Stream与byte[]之间的转换实例教程

    这篇文章主要介绍了C#实现Stream与byte[]之间的转换方法,具体讲解了二进制转换成图片、byte[]与string的转换、Stream 和 byte[] 之间的转换、Stream 和 文件之间的转换、从文件读取 Stream以及Bitmap 转化为 Byte[]等,需要的朋友可以参考下
    2014-09-09
  • C#如何绑定多个按钮到同一个事件

    C#如何绑定多个按钮到同一个事件

    这篇文章主要介绍了C#如何绑定多个按钮到同一个事件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • C# WPF实现读写CAN数据

    C# WPF实现读写CAN数据

    这篇文章主要介绍了C# WPF实现读写CAN数据,文中通过代码示例给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-06-06
  • c# 引用Nlog插件的步骤

    c# 引用Nlog插件的步骤

    这篇文章主要介绍了c# 引用Nlog插件的步骤,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-04-04
  • 关于C#中的字体别名问题

    关于C#中的字体别名问题

    在C#中使用Graphics对象的DrawString方法绘制文本时,可以通过设置TextRenderingHint属性来控制字体混叠效果,对于14号或更大的字体,建议使用AntiAliasGridFit;对于8到14点之间的字体,建议使用AntiAlias;对于小于8点的字体,建议使用ClearTypeGridFit
    2025-01-01

最新评论