大家好,我是零点博客的主理人。昨天折腾了一整天,终于把手里这个 C# 开发的后台管理系统和老牌博客系统 EMLOG 完美打通了。中间踩了不少坑,今天就把这次接口开发的干货复盘一下,特别是代码案例部分,希望能帮到正在做 EMLOG 二次开发或工具开发的你。

一、 为什么选择 C# 调用 EMLOG 接口?

EMLOG 毕竟是 PHP 写的,直接操作数据库风险大。利用 PHP 写好一个 API 接口,C# 端通过 HTTP 请求获取数据,是目前最稳健的架构。这次的核心任务是实现“获取文章列表”和“登录验证”两个功能。

二、 C# 前端发起请求与 JSON 解析

在 C# 中,我们使用 HttpClient 来发起请求。需要注意的是,接口返回的数据通常是 JSON 格式,我们需要把它解析成强类型对象。

// 定义返回的数据模型
public class BlogPost {
    public int id { get; set; }
    public string title { get; set; }
    public DateTime time { get; set; }
    public string content { get; set; }
}

public async Task<List<BlogPost>> GetPostsAsync() {
    using var httpClient = new HttpClient();
    // 模拟调用 EMLOG 的获取文章接口
    string apiUrl = "https://你的域名/api.php?action=articles";
    var response = await httpClient.GetStringAsync(apiUrl);

    // 使用 Json.NET 解析 JSON
    var settings = new JsonSerializerSettings { DateParseHandling = DateParseHandling.DateTime };
    return JsonConvert.DeserializeObject<List<BlogPost>>(response, settings);
}

三、 后端安全:SQL 注入防护与预处理语句

很多新手写接口最容易忽略的就是安全。在 EMLOG 提供的 api.php 框架中,如果不加小心,极易出现 SQL注入。我的建议是,务必使用预处理语句。

下面的 代码案例 展示了如果我们在接口中接收用户输入的 ID 进行查询,正确的做法是什么:

// 错误示范(绝对不要用):直接拼接 SQL,存在注入风险
// $sql = "SELECT * FROM emlog_blog WHERE gid = '" . $_GET['id'] . "'";

// 正确示范:使用预处理语句
$gid = intval($_GET['id']); // 先做类型转换

// 获取数据库连接
$db = MyDb::getInstance(); 

// 准备 SQL 语句
$stmt = $db->prepare("SELECT gid, title, content FROM " . DB_PREFIX . "blog WHERE gid = ?");

// 绑定参数 (i = integer)
$stmt->bind_param("i", $gid);

// 执行查询
$stmt->execute();
$result = $stmt->get_result();

// 处理数据并返回 JSON
while ($row = $result->fetch_assoc()) {
    $output[] = $row;
}

echo json_encode($output);

四、 正则表达式在内容清洗中的应用

有时候我们从数据库拉取出来的文章包含很多 HTML 标签或者乱码,这时候正则表达式就派上用场了。在 C# 中或者前端做展示清洗时,处理纯文本是必不可少的环节。

比如,我们需要把文章内容中的所有换行符转换成 <br> 标签,或者提取文章摘要:

// 简单的提取摘要正则
string content = "这里是文章正文...";
string pattern = @"^(.{1,100}).*$";
Regex r = new Regex(pattern, RegexOptions.Multiline);
Match m = r.Match(content);
string summary = m.Success ? m.Groups[1].Value : content;

五、 总结与避坑指南

通过这次开发,我总结了几点底层拆解后的经验:

  • 数据传输格式:尽量统一使用 JSON,虽然 XML 稳定但解析起来太繁琐,对性能也有损耗。
  • 跨域处理:C# 前端调用 PHP 后端时,EMLOG 后端要开启 CORS(跨域资源共享),否则会被浏览器拦截。
  • 异常捕获:数据库连接断开、网络超时都要处理,别让程序崩掉。

这次 代码案例 的实现虽然不复杂,但把安全意识贯彻到底才是关键。如果你也有 EMLOG 的二次开发经验,欢迎在评论区一起交流,咱们在零点博客继续进步!