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

时间:2017-03-17 05:55:09

标签: c linux http url-parsing

我正在尝试使用microhttpd library解析C中的网址。

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,网址值为/cars/ferrari

但如果http://128.19.24.123:8888/cars?value=ferrari,则网址仅打印cars

我想打印cars?value=ferrari。我怎么能这样做?

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

上有一个关于microhttpd库的教程

但我找不到任何解决方案。

1 个答案:

答案 0 :(得分:1)

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

看起来您无法访问整个原始网址,因为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);

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

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