如何发送带卷的换行符?

我已经尝试使用 curl 发送换行符,但是 \n不由 curl 解释。

curl -X PUT -d "my message\n" http://localhost:8000/hello

如何发送带卷的换行符?

121829 次浏览

这不是你问题的答案,但是我可以通过创建一个包含消息和换行符的临时文件来解决这个问题,然后让 curl 处理这个文件:

curl -X PUT -d @message.txt http://localhost:8000/hello

来自 manual:

如果以字母@开始数据,其余的应该是从中读取数据的文件名,或者-如果希望 curl 从 stdin 中读取数据。文件的内容必须已经是 URL 编码的。还可以指定多个文件。因此,从名为“ foobar”的文件中发布数据可以使用—— data@foobar 完成。

您的 shell 传递的是 \,后面跟着 n,而不是通过一个新行来 curl,而不是 "my message\n"。Bash 支持另一种支持转义序列(如 \n\t)的字符串语法。要使用它,以 $'开始字符串,以 '结束字符串:

curl -X PUT -d $'my message\n' http://localhost:8000/hello

参见 Bash 参考手册中的 引用 ANSI-C

有时您希望提供要逐字发送的数据。

The --data-binary option does that.

(我在这里提出了一个稍微不同的问题,所以我要把我的答案贴出来,因为它可能对未来的探险家有所帮助)

我的解决方案适用于发送表单样式数据的人,即查询字符串中的键/值对。使用编码的换行符,即 %0A,就像编码空间是 %20一样。可以使用 http://meyerweb.com/eric/tools/dencoder/转换其他符号。

因此,如果要将键 message设置为值:

line one
another

你会发送

curl --data "message=line%20one%0Aanother" http://localhost:8000/hello

对于那些不想使用文件、不想使用 shell 转义魔法的人,解决方案是:

curl -X POST --data-binary @- http://url.com <<EOF
line one
line two
EOF

但是这是 post 数据有效负载中的字面换行,而不是表单字段中的换行。

一个非常简单的方法,只需要在控制台中键入 Shift-Enter 就可以了。

curl -d "line1
line2" http-echo.com


Server gets this: line1\nline2

这样做可以删除换行符:

curl -d "line1 \
line2" http-echo.com


Server gets this: line1 line2

There's a much easier way!

curl -X PUT -d $'my message\n' http://localhost:8000/hello

这将使用 引用 ANSI-C插入换行符。

No piping, no data files. See also 使用 cURL 发送新行.

我在使用 Sendgrid 时使用了最初在这里找到的这段代码(复制在下面) https://sendgrid.com/docs/API_Reference/Web_API_v3/index.html

\n\n可以在 Gmail 中工作,但是 \n被忽略了。我试图加倍逃跑和其他建议。我也试过 \r\n,它在 Gmail 中也不起作用。注意: 我没有费心去测试其他的电子邮件客户端,也许这是 Gmail 特有的问题。

    curl --request POST \
--url https://api.sendgrid.com/v3/mail/send \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{"personalizations": [{"to": [{"email": "your.email@example.com"}]}],"from": {"email": "example@example.com"},"subject": "Hello, World!","content": [{"type": "text/plain", "value": "Heya!"}]}'

最终,我放弃寻找解决方案,将 text/plain转换为 text/html,只使用 <br />标签。

有人建议,如果启用了跟踪像素,Sendgrid 可以将明文转换为 HTML,这是有意义的。也许换行在明文到 html 的转换过程中被销毁了。我假设客户端需要一个跟踪像素,所以决定切换到 HTML。

也有类似的问题。当从 Mac 上传 CSV 文件到云存储时,新的行被删除了。下载之后,整个文件看起来像一行。我尝试添加不同的 EOL 字符 \n \r \r\n没有成功。使用 --data-binary而不是 -d解决了这个问题。

顺便说一下,这个问题只发生在 Mac 上。从 CentOS 机器打电话时,-d工作得很好。这看起来很像是由于 Mac 的换行字符。但我不想再调试了。

Thanks a lot for your help.

curl -X PUT -d @filename.csv https://cloudstorage -H "content-type: text/csv"

curl -X PUT --data-binary @filename.csv https://cloudstorage -H "content-type: text/csv"