我正在尝试使用 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 的指针。