如何使用 libcurl(对于 Influxdb)发布包含换行符的数据?

Posted

技术标签:

【中文标题】如何使用 libcurl(对于 Influxdb)发布包含换行符的数据?【英文标题】:How to post data including a line break with libcurl (for Influxdb)? 【发布时间】:2019-05-08 10:02:35 【问题描述】:

我在 C++ 中使用 libcurl 将数据点发布到 InfluxDB。单个数据点正在工作,但对于多个点,我正在努力解决必要的换行符 (\n),如 InfluxDB HTTP API 中所定义:

通过一个请求将多个点写入数据库,每个点用新行分隔。

从带有@标志的文件中写入点。该文件应包含一批线路协议格式的点。各个点必须在自己的行上,并用换行符 (\n) 分隔。包含回车的文件会导致解析器错误。

我猜这可能是字符格式的问题,但我不知道为什么?下面的代码只写了 5 的距离,但应该写两个距离。

#include "stdafx.h"
#include "tchar.h"
#include <string>
#include <curl\curl.h>
#include <sstream>

int main()

    int dataPoints[] =  3, 5 ;
    std::string fieldIdentifier = "distance";

    std::stringstream ss;

    for (int i = 0; i < 1; i++) 
        ss << "aufbau1,ort=halle ";
        ss << fieldIdentifier;
        ss << "=" << dataPoints[i];
        ss << std::endl; //I guess this is the problem, it adds \n
    

    ss << "aufbau1,ort=halle ";
    ss << fieldIdentifier;
    ss << "=" << dataPoints[1];

    std::string data = ss.str();
    const char *dataChar = data.c_str();
    
    CURL *curl;
    CURLcode res;
    curl_global_init(CURL_GLOBAL_ALL);
    curl = curl_easy_init();

    if (curl) 
        curl_easy_setopt(curl, CURLOPT_URL, "http://myIP:8086/write?db=testdb&u=myUser&p=myPwd");
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, dataChar);
        res = curl_easy_perform(curl);

        /* Check for errors */
        if (res != CURLE_OK)
            fprintf(stderr, "curl_easy_perform() failed: %s\n",
                curl_easy_strerror(res));

        curl_easy_cleanup(curl);
    
    return 0;

【问题讨论】:

使用stringstream ss(std::ios_base_out|std::ios_base::binary); 将您的字符串流设置为binary mode 这将阻止从\n\r\n 的转换 @Botje 我已经按照您的建议尝试了二进制模式。我猜你的意思是std::ios_base::out 而不是std::ios_base_out?不幸的是,问题仍然存在。 尝试将data 的内容转储到文件中(绝对不要忘记binary 模式)并使用十六进制转储器对其进行检查。如果看起来不错,请尝试按照手册的建议使用curl --data-binary @file 发布它。您的请求可能有else错误。 文件看起来不错,第一行末尾只有LF。但不幸的是,curl --data-binary @file 再次添加了第二个数据点。 好吧,我实际上错过了一些关键的东西。将多个数据点发布到 InfluxDB 时,时间戳是强制性的。通过添加它,一切正常,使用@Botje 的建议将字符串流设置为stringstream ss(std::ios_base_out|std::ios_base::binary); 非常感谢! 【参考方案1】:

在 python 中,在标签/字段值内有一个&lt;br&gt; html 标签似乎就像一个换行符,同时在 grafana 中查看这些数据。

关于\ninfluxdb 说

注意:行协议不支持标签值或字段值中的换行符\n。

https://docs.influxdata.com/influxdb/v1.8/write_protocols/line_protocol_reference/

【讨论】:

以上是关于如何使用 libcurl(对于 Influxdb)发布包含换行符的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 libcurl 进行 HTTP 发布?

VC++ 如何屏蔽libcurl自动打印的结果?

libcurl 设置 ssl 证书

如何使用 influxdb-python 向 influxdb 发送正确的时间戳

如何正确安装 libcurl 以在 Visual Studio 2017 中使用?

influxdb 使用