我已尝试以下内容发送卷曲的换行符,但 \n 不是由curl解释的 .
\n
curl -X PUT -d "my message\n" http://localhost:8000/hello
如何使用curl发送换行符?
有时您想要提供要逐字发送的数据 .
--data-binary 选项可以做到这一点 .
--data-binary
你的shell传递 \ 后跟 n 而不是换行符而不是 "my message\n" . Bash支持另一种支持转义序列的字符串语法,如 \n 和 \t . 要使用它,请使用 $' 启动字符串并使用 ' 结束字符串:
\
n
"my message\n"
\t
$'
'
curl -X PUT -d $'my message\n' http://localhost:8000/hello
见Bash Reference Manual中的ANSI-C Quoting
对于不想使用文件且不想诉诸shell转义魔法的人的解决方案是:
curl -X POST --data-binary @- http://url.com <<EOF line one line two EOF
但这是后期数据有效负载中的字面换行符,而不是表单字段中的字面换行符 .
有一个更简单的方法!
这将使用ANSI-C Quoting来插入换行符 .
没有管道,没有数据文件 . 另见Sending Newlines with cURL .
(我最后在这里提出了一个稍微不同的问题,所以我只想发布我的答案,因为它可能有助于未来的探险家)
我的解决方案适用于发送表单样式数据的人,即查询字符串中的键/值对 . 使用编码换行符 %0A ,就像编码空间 %20 一样 . 您可以使用http://meyerweb.com/eric/tools/dencoder/转换其他符号 .
%0A
%20
因此,如果要将键 message 设置为值:
message
line one another
你会发送
curl --data "message=line%20one%0Aanother" http://localhost:8000/hello
不是你的问题的答案,但我会通过创建一个包含消息和换行符的临时文件解决它,并给curl该文件工作:
curl -X PUT -d @message.txt http://localhost:8000/hello
来自manual:
如果用字母@开始数据,其余部分应该是一个文件名来读取数据,或者 - 如果你想让curl从stdin读取数据 . 该文件的内容必须已经过URL编码 . 也可以指定多个文件 . 因此,可以使用--data @foobar从名为'foobar'的文件中发布数据 .
一个非常简单的方法,只需在控制台中按Shift键进入休息时间 . 非常易读也可以输入 .
curl -d "line1 line2" http-echo.com Server gets this: line1\nline2
这样做是为了删除换行符:
curl -d "line1 \ line2" http-echo.com Server gets this: line1 line2
我正在使用Sendgrid这段代码(下面复制)最初在这里找到https://sendgrid.com/docs/API_Reference/Web_API_v3/index.html
\n\n 在Gmail中有效,但 \n 被忽略了 . 我试图将逃脱和其他建议加倍 . 我也尝试了 \r\n ,但在Gmail中也无效 . 注意:我没有费心去测试其他电子邮件客户端,也许这是Gmail特定的问题 .
\n\n
\r\n
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 并且只使用了 标签 .
text/plain
text/html
如果您启用了跟踪像素,有人建议Sendgrid将纯文本转换为HTML,这是有道理的 . 也许新行在明文到HTML转换过程中被破坏了 . 我假设客户端想要一个跟踪像素,所以决定切换到HTML .
有类似的问题 . 在将csv文件从Mac上传到 Cloud 存储时,新线路正在被删除 . 下载后,整个文件看起来像一行 . 我尝试添加不同的EOL字符'\ n''\ r''\ r \ n'但没有成功 . 使用'--data-binary'而不是'-d'解决了这个问题 . 顺便说一句,这个问题只发生在Mac上 . '-d'在从CentOS机器拨打电话时工作得很好 . 这看起来很像Mac的换行符 . 但是不要再调试了 .
非常感谢你的帮助 .
curl -X PUT -d @ filename.csv https://cloudstorage -H "content-type: text/csv"
VS
curl -X PUT --data-binary @ filename.csv https://cloudstorage -H "content-type: text/csv"
9 回答
有时您想要提供要逐字发送的数据 .
--data-binary
选项可以做到这一点 .你的shell传递
\
后跟n
而不是换行符而不是"my message\n"
. Bash支持另一种支持转义序列的字符串语法,如\n
和\t
. 要使用它,请使用$'
启动字符串并使用'
结束字符串:见Bash Reference Manual中的ANSI-C Quoting
对于不想使用文件且不想诉诸shell转义魔法的人的解决方案是:
但这是后期数据有效负载中的字面换行符,而不是表单字段中的字面换行符 .
有一个更简单的方法!
这将使用ANSI-C Quoting来插入换行符 .
没有管道,没有数据文件 . 另见Sending Newlines with cURL .
(我最后在这里提出了一个稍微不同的问题,所以我只想发布我的答案,因为它可能有助于未来的探险家)
我的解决方案适用于发送表单样式数据的人,即查询字符串中的键/值对 . 使用编码换行符
%0A
,就像编码空间%20
一样 . 您可以使用http://meyerweb.com/eric/tools/dencoder/转换其他符号 .因此,如果要将键
message
设置为值:你会发送
不是你的问题的答案,但我会通过创建一个包含消息和换行符的临时文件解决它,并给curl该文件工作:
来自manual:
一个非常简单的方法,只需在控制台中按Shift键进入休息时间 . 非常易读也可以输入 .
这样做是为了删除换行符:
我正在使用Sendgrid这段代码(下面复制)最初在这里找到https://sendgrid.com/docs/API_Reference/Web_API_v3/index.html
\n\n
在Gmail中有效,但\n
被忽略了 . 我试图将逃脱和其他建议加倍 . 我也尝试了\r\n
,但在Gmail中也无效 . 注意:我没有费心去测试其他电子邮件客户端,也许这是Gmail特定的问题 .最终我放弃了寻找解决方案并将
text/plain
切换为text/html
并且只使用了
标签 .如果您启用了跟踪像素,有人建议Sendgrid将纯文本转换为HTML,这是有道理的 . 也许新行在明文到HTML转换过程中被破坏了 . 我假设客户端想要一个跟踪像素,所以决定切换到HTML .
有类似的问题 . 在将csv文件从Mac上传到 Cloud 存储时,新线路正在被删除 . 下载后,整个文件看起来像一行 . 我尝试添加不同的EOL字符'\ n''\ r''\ r \ n'但没有成功 . 使用'--data-binary'而不是'-d'解决了这个问题 . 顺便说一句,这个问题只发生在Mac上 . '-d'在从CentOS机器拨打电话时工作得很好 . 这看起来很像Mac的换行符 . 但是不要再调试了 .
非常感谢你的帮助 .
curl -X PUT -d @ filename.csv https://cloudstorage -H "content-type: text/csv"
VS
curl -X PUT --data-binary @ filename.csv https://cloudstorage -H "content-type: text/csv"