如何使用以“@”开头的 cURL 发布内容?

如何使用以“@”开头的 cURL 发布内容?

命令

curl http://localhost/ --data @hello

将尝试从文件中读取hello。如何转义该@符号?

答案1

在不尝试了解更多有关curl内部的信息的情况下,我建议直接通过管道进入它:

printf @hello | curl http://localhost/ --data @-

正如 @ulrich-schwarz 在评论中建议的那样, --data @<(echo @hello)如果更方便的话您也可以使用(并非所有 shell 都支持此语法)。

查看curl-7.41.0的源代码,我没有看到任何方法来转义符号@以防止解释为文件名:

if('@' == is_file) {
  /* a '@' letter, it means that a file name or - (stdin) follows */

  if(curlx_strequal("-", p)) {
    file = stdin;
    set_binmode(stdin);
  }
  else {
    file = fopen(p, "rb");
    if(!file)
      warnf(config,
            "Couldn't read data from file \"%s\", this makes "
            "an empty POST.\n", nextarg);
  }

  /* ... */
}

因此,不幸的是,我们似乎陷入了上面的管道解决方案。

答案2

数据以内容类型发送application/x-www-form-urlencoded。原则上,%40应解码为@,因此以下命令应发送等效数据:

curl http://localhost/ --data %40hello

然而,这可能有效也可能无效,具体取决于服务器端应用程序是否实际执行 URL 解码。如果它需要未编码的数据(当应用程序不希望数据包含任何特殊字符时,这种情况相当常见),应用程序可能会将其解释为%40hello.

如果应用程序不进行解码,通过管道将数据传递给curl

答案3

来自卷曲手册页:

--data-raw <data>

(HTTP) 这与 类似地发布数据-d--data但没有 @ 字符的特殊解释。

所以你的命令应该是

相关内容