【问题标题】:use pipe for curl data使用管道获取 curl 数据
【发布时间】:2012-09-17 00:40:51
【问题描述】:

我正在尝试将 cat 输出传递给 curl:

$ cat file | curl --data '{"title":"mytitle","input":"-"}' http://api

input 字面意思是-

【问题讨论】:

标签: curl pipe


【解决方案1】:

试试

curl --data '{"title":"mytitle","input":"'$(cat file)'-"}' http://api

【讨论】:

    【解决方案2】:

    我花了一段时间试图弄清楚这一点并让它与以下内容一起工作:

    cat data.json | curl -H "Content-Type: application/json" -X POST --data-binary @- http://api
    

    【讨论】:

    • 问题是文件的内容将是JSON数据中input的值。
    • 我总是忘记@ 符号。 :(
    • 您应该知道-d 会跳过\n\r 字符。这就是为什么我总是使用--data-binary
    【解决方案3】:

    你可以使用神奇的标准输入文件/dev/stdin

    cat data.json | curl -H "Content-Type: application/json" -X POST -d "$(</dev/stdin)" http://api
    

    【讨论】:

    • 如果/dev/stdin 是 25MB,比如在我的用例中,我需要上传一个 25MB 的文件,而 25MB 的 base64 文本对于 bash-arguments 来说太多了,该怎么办?
    • 小心字符串替换,尤其是二进制数据。这可能会巧妙地破坏您的数据(例如,去除尾随换行符或在 NUL 之后删除所有内容)。
    • 这在 bash 中完美运行,但在 zsh 中产生 error when reading /dev/stdin: Input/output error
    【解决方案4】:

    这也应该有效

    curl -H "Content-Type: application/json" -d @data.json http://api
    

    使用 -d 强制 curl 隐式使用 POST 请求。

    【讨论】:

    • 是的!非常适合数据大小超过 bash 参数可以处理的用例。
    【解决方案5】:

    Curl documentation for -d option

    如果您以字母 @ 开头数据,则其余部分应该是从中读取数据的文件名,或者 - 如果您希望 curl 从 stdin 读取数据。也可以指定多个文件。因此,将使用 -d, --data @foobar 从名为“foobar”的文件发布数据。当 --data 被告知从这样的文件中读取时,将删除回车和换行符。如果您不希望 @ 字符具有特殊解释,请改用 --data-raw。

    根据您的 HTTP 端点、服务器配置,您应该可以使用以下格式:

    curl -d @data.json http://api

    【讨论】:

      【解决方案6】:

      听起来您想将input 的内容包装到 JSON 正文中,然后通过 POST 请求发送出去。我认为最简单的方法是先操作标准输入,然后使用-d @- 将其推送到 curl。一种方式可能如下所示:

      cat <(echo '{"title":"mytitle","input":"') file <(echo '"}') \
      | curl -d @- http://api
      

      我正在使用&lt;(echo) 来使用cat 来合并字符串和文件,但几乎可以肯定有更好的方法。

      请记住,这不会逃避 file 的内容,因此您可能会遇到问题。

      【讨论】:

      • 有没有办法删除不属于file 的另外两个换行符?
      • 刚刚意识到我们可以使用&lt;your_original_command&gt; |tr -d '\n' 来删除引入的换行符。
      • "echo -n" 不会添加换行符
      【解决方案7】:

      如果你想键入/粘贴数据而不转义或污染你的 bash 历史记录,你可以使用这个

      cat | curl -H 'Content-Type: application/json' http://api -d @-
      

      这会将您带到cat,您可以在其中直接输入数据,例如Shift + Insert 在您的终端中。您以换行符和 Ctrl + D 结束,它向cat 发出信号,表明您已完成。然后将该数据传递给 curl,您就有了一个可重用的历史记录条目。

      【讨论】:

        【解决方案8】:
        # Create the input file
        echo -n 'Try ? and " to verify proper JSON encoding.' > file.txt
        
        # 1. Use jq to read the file into variable named `input` 
        # 2. create the desired json
        # 3. pipe the result into curl
        jq -n --rawfile input file.txt '{"title":"mytitle", $input}' \
        | curl -v 'https://httpbin.org/post' -H 'Content-Type: application/json' -d@- 
        

        输出:

          ...
          "json": {
            "input": "Try \ud83d\ude01 and \" to verify proper JSON encoding.", 
            "title": "mytitle"
          }, 
          ...
        

        请注意,输入文件的内容已正确转义以用作 JSON 值。

        jq 使用的选项:

        • --null-input/-n:
          不要读取任何输入
        • --rawfile variable-name filename:
          此选项读取命名文件并将其内容绑定到给定的全局变量。

        详情请参阅jq manual

        -d@- 选项告诉 curl 从 STDIN 读取数据。

        【讨论】:

        • 注释“-d@- 选项告诉 curl 从 STDIN 读取数据。”非常有帮助。
        猜你喜欢
        • 1970-01-01
        • 2018-02-11
        • 2021-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-16
        • 2022-08-18
        相关资源
        最近更新 更多