Libsoup服务端是否支持通配符路径匹配?该如何实现?
Libsoup 匹配中间带通配符的URL路径实现方案
你原本的写法无法生效是因为Libsoup的soup_server_add_handler原生不支持路径中间带通配符的匹配规则:它仅支持精确路径匹配和前缀匹配(仅路径末尾的*会被识别为通配符,中间的*会被当做普通字符处理)。
该需求可以通过Libsoup+GLib组合实现,不需要引入额外依赖,具体实现方式如下:
实现步骤
- 第一步:注册前缀匹配handler,接收所有
/foo/开头的请求
代码示例:soup_server_add_handler (server, "/foo/", NULL, server_callback, unregister_callback, data); - 第二步:在回调函数内使用GLib的
GPatternSpec做通配符匹配,过滤出符合/foo/*/bar/规则的路径
回调函数示例代码:#include <glib.h> #include <libsoup/soup.h> void server_callback (SoupServer *server, SoupServerMessage *msg, const char *path, GHashTable *query, gpointer user_data) { // 匹配规则:同时适配带结尾斜杠的/foo/任意内容/bar/和不带斜杠的/foo/任意内容/bar const gchar *pattern = "/foo/*/bar*"; if (!g_pattern_match_simple(pattern, path)) { // 不匹配规则直接返回404 soup_server_message_set_status(msg, SOUP_STATUS_NOT_FOUND, NULL); return; } // 匹配成功,后续正常处理业务逻辑 // ... }
可选优化
如果需要更复杂的路径匹配规则,也可以用GLib内置的GRegex正则匹配实现,灵活度更高。
内容的提问来源于stack exchange,提问作者Ashutosh Naik
相关产品推荐
相关产品推荐

