curl:-d和--data-binary选项有什么区别?

8

我正在尝试向REST API发送POST请求。当我使用curl的-d选项传递参数时,所有东西都可以正常工作。例如:

curl "https://mywebsite.com" -d "param1=x" -d "param2=y" -u "3SUHZb0sanKWrQ"

然而,如果我将参数作为JSON对象发送,并使用--data-binary,那么我会从API收到一个错误(就好像没有接收到任何参数)。例如:
curl "https://mywebsite.com" --data-binary $'{ "param1": "x", -d "param2":"y" }' -u "3SUHZb0sanKWrQ"

我原本认为这两种方法有相同的行为,但我认为我错了。这两种方法之间有何区别?

P.S.:第二个请求是当我在Google Chrome中选择复制为cURL选项时获得的curl请求,因为实际请求是Angular中的$http.post,并且其数据有效负载为JSON对象。在Angular中我该怎么做才能使它工作?

var data = { 
  "param1": "x", 
  "param2": "y" 
};

$http({
    url: "https://mywebsite.com",
    method: 'POST',
    data: data
}).then(function successCallback(response){
    console.log(response);
}, function errorCallback(response){
    console.log(response);
});

-d 只是 --data 的简写形式。--data-binary 是另一个选项。 - MarkSkayff
man curl:--data-binary(HTTP)以原样发布指定的数据,没有任何额外的处理。如果您以字母@开头,则其余部分应该是文件名。数据的发布方式类似于--data-ascii,但保留换行符和回车符,并且不进行转换。如果多次使用此选项,则以下选项将追加数据,如-d,--data中所述。 - drew010
我认为你需要添加-H "Content-Type: application/json"。否则,就像使用-d/--data一样,会发送Content-Type: application/x-www-form-urlencoded。没有指定任何-H选项的curl "https://mywebsite.com" --data-binary $'{ "param1": "x", -d "param2":"y" }正在接收看起来像是一个application/json消息,并导致它被发送带有Content-Type: application/x-www-form-urlencoded头。因此,服务器将其解释为application/x-www-form-urlencoded而不是application/json,然后无法正确处理它,因为它实际上并不是结构化的表单数据。 - sideshowbarker
--data-binary 会完整地发送数据,不会去除换行符或其他更改。 -d/--data 会去除换行符(可能还包括前导/尾随空格)并进行其他更改。因此,尽管名称为 --data-binary,但它不仅适用于二进制文件 - 它适用于您希望确保数据以完全相同的方式发布而没有任何更改的情况。--data-as-is 将是一个更好的名称。正如上面提到的,无论是 --data-binary 还是 -d/--data,除非您使用 -H "Content-Type: …" 更改,否则都会将 POST 发送为 application/x-www-form-urlencoded - sideshowbarker
2个回答

12
  • -d @file 或者等价的 --data @file 会发送文件,但会剥离掉回车和换行符(也可能进行字符集转换)
  • --data-binary @file 将原样发送文件
  • --data-raw @file 将发送字面字符串"@file"
  • 如果没有初始的@符号,所有三个选项都会以字面字符串形式发送后续参数。

此外,这三个选项都将Content-Type设置为application/x-www-form-urlencoded除非你覆盖它;如果你要发送JSON数据,你可能想要设置-H' Content-Type:application / json'

我建议如果你想从命令行发送一个字面字符串,请使用--data-raw ,如果你想发送一个文件,请使用--data-binary @file


-3

我使用 curl --help 命令得到的结果如下:

 -d, --data DATA     HTTP POST data (H)
     --data-raw DATA  HTTP POST data, '@' allowed (H)
     --data-ascii DATA  HTTP POST ASCII data (H)
     --data-binary DATA  HTTP POST binary data (H)
     --data-urlencode DATA  HTTP POST data url encoded (H)
     --delegation STRING  GSS-API delegation permission
     --digest        Use HTTP Digest Authentication (H)
     --disable-eprt  Inhibit using EPRT or LPRT (F)
     --disable-epsv  Inhibit using EPSV (F)
     --dns-servers   DNS server addrs to use: 1.1.1.1;2.2.2.2
     --dns-interface  Interface to use for DNS requests
     --dns-ipv4-addr  IPv4 address to use for DNS requests, dot notation
     --dns-ipv6-addr  IPv6 address to use for DNS requests, dot notation§

所以,区别就在于使用 -d 时发送的数据不是二进制内容。


13
重复已经写在那里的解释并不有用。 - kev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接