2

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

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_connectionconst char *url。url 变量包含示例后面的字符串https://localhost:port:对于http://128.19.24.123:8888/cars/ferrariurl 值将是/cars/ferrari

但如果http://128.19.24.123:8888/cars?value=ferrariurl 仅打印cars

我想打印cars?value=ferrari。我怎样才能做到这一点?

在https://www.gnu.org/software/libmicrohttpd/tutorial.html有一个关于 microhttpd 库的教程

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

4

1 回答 1

3

CAVEAT EMPTOR:我没有使用过这个库,这个答案是基于对API的快速阅读。

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

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

这将返回一个指向查询字符串参数值的指针,如果未找到,则返回 null。

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

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

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

另请参阅:手册中的处理请求部分。

于 2017-03-17T06:29:26.370 回答