【发布时间】: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-urlencoded。curl "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