使用 curl 将新事件插入 CalDAV 日历
Inserting new event into CalDAV calendar using curl
我知道如何使用 curl 将新事件插入到 CalDAV 日历中,前提是该事件通过之前的命令保存为本地 ics 文件:
$command > $localfile
curl -T "$localfile" $url
效果很好,但我想在不需要本地文件的情况下执行此操作,我想将 $command 的结果通过管道传输到 curl,如下所示:
$command | curl -T - $url
根据 curl 的手册,选项 "T -" 应该是必需的:它应该从标准输入而不是文件中读取。但是如果我使用那个选项,我会得到这样的回应:
<?xml version="1.0" encoding="utf-8"?>
<d:error xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns">
<s:exception>Sabre\DAV\Exception\Conflict</s:exception>
<s:message>PUT is not allowed on non-files.</s:message>
</d:error>
我尝试了不同的其他参数,如“--data”和“--data-raw”,但我还没有找到正确的组合。有人可以帮我吗?
实际上,我试图实现的完整命令循环如下所示:
cat<<EOC | curl -T - $url
BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VEVENT
CREATED:${CREATED}
UID:${RNDUID}
CLASS:PUBLIC
CATEGORIES:TV
SUMMARY:${SUMMARY}
LOCATION:${LOCATION}
DTSTART:${DTSTART}
DTEND:${DTEND}
DESCRIPTION:${DESCRIPTION}
END:VEVENT
END:VCALENDAR
EOC
我尝试了 "echo" 而不是 "cat",但这并没有改变结果。
尤里卡! :)
解决方案是使用 HERE 文档:
$CURL $url -T /dev/stdin <<-EOF
BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VEVENT
CREATED:$CREATED
UID:$RNDUID
SUMMARY:$SUMMARY
LOCATION:$LOCATION
DTSTART:$DTSTART
DTSTAMP:$DTSTART
DTEND:$DTEND
DESCRIPTION:$DESCRIPTION
END:VEVENT
END:VCALENDAR
EOF
注意输入参数"/dev/stdin"
!当 "-"
(破折号)用于输入时,curl 参数 "-T"
在那里不起作用。您必须改用 "/dev/stdin"
,不幸的是,它在所有类 Unix 系统上都不可用。在 Linux 上,它可以用作 "-"
的替代品,当程序不支持选项 "-"
或者破折号对它们有不同的含义时,比如标记所有的结尾输入参数。
"<<"
之后的"-"
是HERE文档命令的一部分:它取消了制表符,但没有空格,因此文档可以以更友好的方式排列。
我还没弄明白
有什么区别
cat<<EOF | curl ...
...
EOF
我现在找到的解决方案,除了这第一次尝试之外,显然是对 cat 的无用使用。但它看起来很像 "cat" 带来了一些叫 "curl" 的老狗不太喜欢的东西。 ;)
如果有人对此有解释,我将非常感谢。
我知道如何使用 curl 将新事件插入到 CalDAV 日历中,前提是该事件通过之前的命令保存为本地 ics 文件:
$command > $localfile
curl -T "$localfile" $url
效果很好,但我想在不需要本地文件的情况下执行此操作,我想将 $command 的结果通过管道传输到 curl,如下所示:
$command | curl -T - $url
根据 curl 的手册,选项 "T -" 应该是必需的:它应该从标准输入而不是文件中读取。但是如果我使用那个选项,我会得到这样的回应:
<?xml version="1.0" encoding="utf-8"?>
<d:error xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns">
<s:exception>Sabre\DAV\Exception\Conflict</s:exception>
<s:message>PUT is not allowed on non-files.</s:message>
</d:error>
我尝试了不同的其他参数,如“--data”和“--data-raw”,但我还没有找到正确的组合。有人可以帮我吗?
实际上,我试图实现的完整命令循环如下所示:
cat<<EOC | curl -T - $url
BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VEVENT
CREATED:${CREATED}
UID:${RNDUID}
CLASS:PUBLIC
CATEGORIES:TV
SUMMARY:${SUMMARY}
LOCATION:${LOCATION}
DTSTART:${DTSTART}
DTEND:${DTEND}
DESCRIPTION:${DESCRIPTION}
END:VEVENT
END:VCALENDAR
EOC
我尝试了 "echo" 而不是 "cat",但这并没有改变结果。
尤里卡! :)
解决方案是使用 HERE 文档:
$CURL $url -T /dev/stdin <<-EOF
BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VEVENT
CREATED:$CREATED
UID:$RNDUID
SUMMARY:$SUMMARY
LOCATION:$LOCATION
DTSTART:$DTSTART
DTSTAMP:$DTSTART
DTEND:$DTEND
DESCRIPTION:$DESCRIPTION
END:VEVENT
END:VCALENDAR
EOF
注意输入参数"/dev/stdin"
!当 "-"
(破折号)用于输入时,curl 参数 "-T"
在那里不起作用。您必须改用 "/dev/stdin"
,不幸的是,它在所有类 Unix 系统上都不可用。在 Linux 上,它可以用作 "-"
的替代品,当程序不支持选项 "-"
或者破折号对它们有不同的含义时,比如标记所有的结尾输入参数。
"<<"
之后的"-"
是HERE文档命令的一部分:它取消了制表符,但没有空格,因此文档可以以更友好的方式排列。
我还没弄明白
有什么区别cat<<EOF | curl ...
...
EOF
我现在找到的解决方案,除了这第一次尝试之外,显然是对 cat 的无用使用。但它看起来很像 "cat" 带来了一些叫 "curl" 的老狗不太喜欢的东西。 ;)
如果有人对此有解释,我将非常感谢。