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



我正在尝试使用 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:%sn", 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的情况下,网址只打印cars

我想打印cars?value=ferrari.我该怎么做?

有一个

关于microhttpd库的教程,请访问 https://www.gnu.org/software/libmicrohttpd/tutorial.html

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

警告 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 查询参数。

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

使用 MHD_get_connection_values 调用函数,每个名称=值对调用一次。 让我们把它简化为一个例子。首先,你有网址,但没有parms。因此,让我们展示如何获取名称=值对。 因此,让我们通过一个例子来说明这一点。 通过 curl 调用,使用 [bla.bla.bla?name1=value1&name2=value2]。 现在,在你的Answer_To_Connection(...(中,假设我们要构建一个字符串,看起来像[name1=value1,name2=value2\0]。 我们调用MHD_get_connection_values(ConnectionPtr, MHD_GET_ARGUMENT_KIND, &OurFunctionToCallForEach, bufferptr(; In OurFunctionToCallForEach( void *bufferptr, MHD_VAlueKind k, const char *key, const char *value(, we sprintf(strchr(bufferptr,'\0'(, "%s=%s,", name, value(; 无论如何,这是一个粗略的示例,它将执行任何静态代码分析,但确实显示了该过程。 我们对 MHD 进行一次调用,MHD 为每个名称/值对调用我们的函数一次,并给我们我们给 MHD 的指针。

相关内容

  • 没有找到相关文章

最新更新