通过 WinHttpRequest 将多个测量值发布到 influxDB 的正确行分隔符是啥?
Posted
技术标签:
【中文标题】通过 WinHttpRequest 将多个测量值发布到 influxDB 的正确行分隔符是啥?【英文标题】:What is the correct line delimiter to post multiple measurements to influxDB via WinHttpRequest?通过 WinHttpRequest 将多个测量值发布到 influxDB 的正确行分隔符是什么? 【发布时间】:2020-02-05 12:12:09 【问题描述】:我想通过 VBA 和 WinHttp 库以秒 (precision=s) 为单位将时间序列的多行(测量值)发布到 InfluxDB。
发布一个测量值后,一切正常,并且可以在数据库中找到测量值。
当使用 \n 作为分隔符发布多行时(如文档中所述:a link,来自服务器的结果是“无法解析”。
一行的字符串看起来像这样,可以很容易地插入到数据库中:“d_1_deals value=0 1554336000”
多行的字符串如下所示:“d_1_deals value=0 1554336000\nd_1_deals value=0 1554336900\nd_1_deals value=0 1554337800d_1_deals value=0 1554338700”
我正在使用“WinHttp.WinHttpRequest.5.1”对象和 post 方法。 完整代码如下所示:
Function post_fp_information_to_influx()
sURL = "http://xx.xxx.xx.250:80/write?"
db_string = "db=xxxxxTEST&precision=s"
resulturl_post = sURL & db_string
params = "d_1_deals value=0 1554336000\nd_1_deals value=0 1554336900\nd_1_deals value=0 1554337800d_1_deals value=0 1554338700"
sResult = GetHTTPResult(resulturl_post, "POST", params)
…
End Function
Function GetHTTPResult(sURL As String, Post_GET As String, params As String) As String
Dim XMLHTTP As Variant, sResult As String
Set XMLHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
XMLHTTP.Open Post_GET, sURL, False
XMLHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
XMLHTTP.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
XMLHTTP.send (params)
sResult = XMLHTTP.ResponseText
Set XMLHTTP = Nothing
GetHTTPResult = sResult
End Function
发布多个测量结果时出现的错误:
""error":"无法解析 'd_1_deals value=0 1554336000\\nd_1_deals value=0 1554336900\\n': 时间戳错误""
我认为问题在于,尤其是“\n”被错误地编码为“\\n”。
我尝试了不同的分隔符和方法,但 .send-method 不断发送“\\n”,API 不会将其识别为新行。
任何想法如何改变这种行为?如何更改分隔符或编码行为以使 influxDb-API 识别行分隔符?
【问题讨论】:
【参考方案1】:\n
是一个 C 特殊字符,用于在源代码中编写字符串时表示行标记。 C 编译器将其替换为实际的行标记字符 0x0D
。
在 Windows 上,这通常在 I/O 中转换为 0x0D0A
,回车 + 换行。
在 Visual Basic 中,您必须使用 Chr(10)
(0x0A
) 和 Chr(13)
(0X0D
)。
您可能需要试验数据库是否只需要回车或换行。
所以你写的字符串会变成:
params = "d_1_deals value=0 1554336000" & Chr(13) & "d_1_deals value= ..."
或
params = "d_1_deals value=0 1554336000" & Chr(13) & Chr(10) & "d_1_deals value= ..."
正确/工作方式:
params = "d_1_deals value=0 1554336000" & Chr(10) & "d_1_deals value= ..."
【讨论】:
感谢@Paul Ogilvie 的快速回答。我尝试了两个字符串。 1) "params = "d_1_deals value=0 1554336000" & Chr(13) & "d_1_deals value= ..." 和 2) params = "d_1_deals value=0 1554336000" & Chr(13) & Chr(10) & " d_1_deals value= ..." 导致 "error":"unable to parse 'd_1_deals value=0 1554336000\rd_1_deals value=0 1554336900': bad timestamp"" --> 似乎分隔符被替换为 \r \n。你有别的想法吗? 阅读文档时,我没有阅读有关发送多行的内容。您只能提供一个包含多行的 file。反正。它在页面底部说您必须使用换行符(在文件中)Chr(10)
。
仅使用 Chr(10) 解决了问题!谢谢!【参考方案2】:
我有类似的错误。在我的情况下,它是由 curl 引起的:
--数据@file.txt
应该是
--data-binary @file.txt
【讨论】:
以上是关于通过 WinHttpRequest 将多个测量值发布到 influxDB 的正确行分隔符是啥?的主要内容,如果未能解决你的问题,请参考以下文章
WinHttp.WinHttpRequest 添加到内容类型
如何异步使用“WinHttp.WinHttpRequest.5.1”?