【问题标题】:curl: What's the difference between -d and --data-binary options?curl:-d 和 --data-binary 选项有什么区别?
【发布时间】:2017-06-24 04:37:13
【问题描述】:

我正在尝试向 REST API 发送发布请求。我注意到当我在 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"

我认为这两种方法具有相同的行为,但我认为我错了。这两种方法有什么区别?

PS:第二个请求是我在 Google Chrome 上选择 copy as 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 是另一种选择。
  • 来自man curl: --data-binary (HTTP) 这完全按照指定的方式发布数据,没有任何额外的处理。如果您以字母 @ 开始数据,则其余部分应为文件名。 数据以与 --data-ascii 类似的方式发布,不同之处在于保留换行符和回车并且从不进行转换。 如果多次使用此选项,则第一个后面的选项将附加数据,如 -d, --data 中所述。
  • 我觉得你需要加-H "Content-Type: application/json"。否则,与-d/--data 一样,发送Content-Type: application/x-www-form-urlencodedcurl "https://mywebsite.com" --data-binary $'{ "param1": "x", -d "param2":"y" } 没有指定任何 -H 选项,正在接收看起来像 application/json 的消息,并导致它与 Content-Type: application/x-www-form-urlencoded 标头一起发送。因此服务器将其解释为application/x-www-form-urlencoded,而不是application/json,然后无法正确处理它,因为它实际上并未构造为表单数据。
  • --data-binary 完全按原样发送数据,不删除换行符或其他更改。 -d/--data 去除换行符(可能还有前导/尾随空格)并可能进行其他更改因此尽管名称 --data-binary 不仅适用于二进制,它适用于您希望确保数据准确发布的情况原样,没有任何变化。 --data-as-is 会是一个更好的名字。如上所述,--data-binary-d/--data 都将 POST 发送为 application/x-www-form-urlencoded,除非你给 -H "Content-Type: …" 来改变它。

标签: javascript angularjs json curl


【解决方案1】:

这就是我通过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 发送的数据不是二进制内容。

【讨论】:

  • 重复那里所写内容的解释已经没有帮助。
猜你喜欢
  • 2017-04-07
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 2014-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-08
相关资源
最近更新 更多