我正在尝试向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);
});
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