【问题标题】:Curl -d vs --data-binary卷曲 -d 与 --data-binary
【发布时间】:2019-04-18 12:36:21
【问题描述】:

使用这个 [https://github.com/prometheus/pushgateway][1],我们试图将一个指标推送到 prometheus。它似乎需要非常特定格式的数据。

在做他们的示例卷曲时效果很好

echo "some_metric 3.14" | curl --data-binary @- http://pushgateway.example.org:9091/metrics/job/some_job

但使用 -d 选项执行 curl 失败,因为缺少行/文件结尾

curl -d 'some_metric 3.15\n' http://pushgateway.example.org:9091/metrics/job/some_job

我试图了解行为的差异,因为我相信两者都在执行 POST 命令,我需要通过“request.post”方法在 node.js 中复制这个 --data-binary 选项,但我似乎只是能够复制不起作用的 curl -d 选项。

关于 -d 和 --data-binary 之间的区别以及在 node.js 中执行与 --data-binary 等效的提示的任何建议?

【问题讨论】:

  • 你为什么要在这里合并问题。您是否试图了解具有不同标志的 curl 命令的行为?还是您尝试发送 NodeJS POST 请求以推送指标以推送网关?

标签: node.js curl prometheus


【解决方案1】:

来自 curl 手册页:

--data-ascii

(HTTP) 这只是 -d、--data 的别名。

--data-binary

(HTTP) 这完全按照指定的方式发布数据,没有任何额外的处理。

如果您以字母 @ 开头的数据,其余的应该是文件名。数据的发布 > 以与 -d, --data 类似的方式发布,除了换行符和回车符 > > 保留并且从不进行转换。

和 -d, --data 一样,发送到服务器的默认内容类型是 application/x-www-form-> > urlencoded。如果您希望服务器将数据视为任意二进制数据 > 然后将 content-type 设置为 octet-stream: -H "Content-Type: application/octet-stream"。

如果多次使用此选项,则第一个选项后面的将附加数据,如 -d,--data 中所述。

使用 @- 将使 curl 从 stdin 读取文件名。

所以,基本上在您的第一个变体中,您发送一个名为“some_metric 3.14”的二进制文件。 在第二个中,您发送一个 ascii 字符串“some_metric 3.15\n”。

如果您希望 curl 在发送前删除新行,请使用 --data-ascii-d 选项:

echo "some_metric 3.14" | curl -d @- http://pushgateway.example.org:9091/metrics/job/some_job

【讨论】:

  • 非常感谢您的详细回复。知道如何让 node.js 发布与 --data-binary curl 命令匹配的数据吗?似乎应该只是在它正在发布的数据中添加一个 \n 的情况?奇怪的是,\n 方法似乎不起作用,因此我很好奇它还有什么不同。
  • @sradforth,我对NodeJS 不太熟悉,但你可以看看这里:stackoverflow.com/questions/38030484/… 另外,如果你发送一个你想发送的文件会很有帮助以及一段上传文件的代码
  • 关于将指标发布到推送网关 - 不要忘记在行尾添加“\n”。没有这个你会得到 400 错误代码。
  • @sradforth 你知道如何用 NodeJS 做到这一点吗?
  • @Antirreni91 你们中的任何一个人都能够弄清楚如何使用 NodeJS 做到这一点吗?很好奇它是否可能。
猜你喜欢
  • 2018-03-22
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多