如何使用 microhttpd.h 在 C 中读取包含问号的 URL

How to read URLs containing question marks in C using microhttpd.h

我正在尝试使用 microhttpd library 在 C 中解析 URL。

daemon = MHD_start_daemon (MHD_USE_SELECT_INTERNALLY | MHD_USE_SSL, PORT, NULL, NULL, &answer_to_connection, NULL, MHD_OPTION_HTTPS_MEM_KEY, key_pem, MHD_OPTION_HTTPS_MEM_CERT, cert_pem, MHD_OPTION_END);

当我运行函数MHD_start_daemon调用回调函数answer_to_connection时。

static int answer_to_connection(void *cls, struct MHD_Connection *connection, const char *url, const char *method, const char *version, const char *upload_data, size_t *upload_data_size, void **con_cls)
{
    printf("URL:%s\n", url);
}

answer_to_connection的参数之一是const char *url。 url 变量包含 https://localhost:port 之后的字符串示例:对于 http://128.19.24.123:8888/cars/ferrari,url 值将是 /cars/ferrari

但在 http://128.19.24.123:8888/cars?value=ferrari 的情况下,url 仅打印 cars

我要打印 cars?value=ferrari。我该怎么做?

https://www.gnu.org/software/libmicrohttpd/tutorial.html

上有一个关于 microhttpd 库的教程

但是我在那里找不到解决这个问题的方法。

CAVEAT EMPTOR:我没有使用过这个库,这个答案是基于对 API.

的快速阅读

您似乎无法访问整个原始文件 URL,因为 microhttpd 会为您解析它。相反,您使用 MHD_lookup_connection_value 访问各个查询字符串值,如下所示:

value = MHD_lookup_connection_value(connection, MHD_GET_ARGUMENT_KIND, "value");

那将 return 一个指向查询字符串参数值的指针,如果找不到则为 null。

您还可以使用 MHD_get_connection_values 遍历查询字符串组件。在那种情况下,您可以这样称呼它:

num = MHD_get_connection_values(connection, MHD_GET_ARGUMENT_KIND, iterator, cls);

迭代器将是一个回调函数,用于逐个接收 GET 查询参数。

另请参阅:手册中的 Handling requests 部分。