C# WebAPI接口开发实战:详解JSON解析、MySQL连接及SQL注入防护指南

嗨,我是零点博客的主理人。今天不扯淡,直接上干货。前两天有粉丝在群里问,手里有个EMLOG的PHP项目,想改用C#做后端,核心痛点是接口开发。其实不管是C#还是PHP,接口开发的逻辑都是互通的,无非就是JSON数据的交互和数据库的操作。

这期内容,我就结合自己写在线工具和爬虫后台的经验,用C# WebAPI手把手带你撸一个最基础的API。重点来了,我会用源码演示怎么SQL注入防护,这在实战里比什么都重要。咱们不整虚的,直接开工。

一、 环境准备与项目结构搭建

先别急着写代码,环境得搭好。我们用Visual Studio新建一个Web API项目。为了方便演示,我不搞太复杂的框架,直接用原生的ADO.NET操作MySQL数据库。

如果你习惯PHP,你会发现C#的后端开发在强类型方面要严谨得多。我们要定义好输入和输出模型,这里主要处理JSON/XML数据解析。既然前端是用Ajax或者Fetch请求,那我们的响应格式就统一成JSON:

[ApiController]
[Route("api/[controller]")]
public class UserController : ControllerBase
{
    private readonly IConfiguration _config;
    public UserController(IConfiguration config) => _config = config;
}

二、 接口开发核心:数据获取与SQL注入防护

很多新手在写接口开发时,最容易犯的错误就是把用户输入拼接到SQL语句里。这是大忌!今天咱们就用正则表达式过滤掉非法字符,并结合预处理语句来彻底杜绝漏洞。

1. 参数校验与正则表达式过滤

假设我们要做一个根据用户名查询数据的接口。在连接数据库前,先跑一段正则:

public bool IsValidUsername(string input)
{
    // 只允许字母、数字和下划线
    string pattern = "^[a-zA-Z0-9_]+$";
    return Regex.IsMatch(input, pattern);
}

这一步虽然不能完全解决注入,但能过滤掉很多恶意脚本。

2. 使用预处理语句连接MySQL

接着看核心代码。这里我手动拼接SQL语句,重点看 @username 这种参数化写法,这就是标准答案:

[HttpGet("{username}")]
public IActionResult GetUser(string username)
{
    if (string.IsNullOrWhiteSpace(username) || !IsValidUsername(username))
    {
        return BadRequest("参数非法");
    }

    string connStr = _config.GetConnectionString("DefaultConnection");
    using (var conn = new MySqlConnection(connStr))
    {
        string sql = "SELECT * FROM users WHERE username = @username";
        // 初始化命令并添加参数
        var cmd = new MySqlCommand(sql, conn);
        cmd.Parameters.AddWithValue("@username", username);

        conn.Open();
        using (var reader = cmd.ExecuteReader())
        {
            var userList = new List<UserInfo>();
            while (reader.Read())
            {
                userList.Add(new UserInfo
                {
                    Id = reader.GetInt32("id"),
                    Name = reader.GetString("username"),
                    Email = reader.GetString("email")
                });
            }
            // 直接返回对象,WebAPI会自动转成JSON
            return Ok(userList);
        }
    }
}

三、 爬虫开发中的接口复用技巧

刚才那个接口是简单的查库。如果你在做爬虫开发,你可能需要调用别人的接口或者反过来暴露接口给爬虫抓取数据。这时候就需要处理复杂的HTTP头和Cookie管理。

零点博客之前分享过爬虫教程,其实C#的HttpWebRequest比Python更好控制SSL证书和模拟浏览器行为。比如你需要传递一个JSON格式的Body:

// 模拟发送JSON数据到第三方接口
string jsonData = JsonConvert.SerializeObject(new { action = "update", data = "test" });
var httpContent = new StringContent(jsonData, Encoding.UTF8, "application/json");
var response = await _httpClient.PostAsync("https://api.example.com/endpoint", httpContent);
var responseString = await response.Content.ReadAsStringAsync();

四、 避坑指南与底层复盘

写完代码别急着部署,我复盘了几个常见坑,大家务必注意:

  • 1. 数据库连接池耗尽: 在高并发场景下,C# WebAPI连接MySQL如果没处理好,很容易把连接池打满。一定要在 using 块里关闭连接。
  • 2. 大JSON截断: 如果数据库字段存的是大段文本,JSON序列化可能会截断。记得在配置里设置JsonSerializerSettings的MaxDepth。
  • 3. 错误信息暴露: 生产环境千万别直接把数据库报错吐给前端(比如SQL注入的细节),这会被黑客利用。

总结一下,这次我们通过一个简单的接口开发案例,串联起了C#、MySQL、JSON解析以及最重要的SQL注入防护。这就是零点博客想要传递的:代码不仅跑得通,还得跑得稳。如果你觉得这篇教程有用,欢迎关注零点博客,获取更多实战干货!