好的,过去曾经问过同样的问题,但没有令人满意的答案;至少对我而言。简而言之,使用curl
将数据发布到远程(注意:https
)服务器,其中包含以下工作:
curl -X POST 'https://a.b.c.d/somewhere/' --data 'somedata' --header "Content-Type: text/turtle" -i
现在,是时候使用node做同样的事了。我的功能很好,如果不使用https模块,我使用http模块,我收到一条消息,我必须再次尝试https。所以,我使用https来发出请求,使用以下选项:
var myOptions = {
hostname : "a.b.c.d",
port : "80",
path : "/somewhere/",
method : 'POST',
headers : {
'Content-Type' : 'text/turtle',
'Content-Length' : message.length
},
secureProtocol : 'SSLv3_method'
};
顺便说一下,在传递参数--sslv3
时,我还检查了curl的工作正常。
但是,使用上述选项我会收到以下错误
140735237133072:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:../deps/openssl/openssl/ssl/s23_clnt.c:787:
如果在我的代码之上我放了一个表单声明(来自here的想法)
https.globalAgent.options.secureProtocol = 'SSLv3_method';
然后实际上错误消息变为
140735237133072:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number:../deps/openssl/openssl/ssl/s3_pkt.c:338:
我发现这是意料之外的,因为我已在选项部分中指出我希望将SSLv3_method
用作协议。在任何情况下,我如何能够从命令行重现curl
的行为?
最后,here提到端口80可能是与https一起使用它的错误端口。这是真的吗?为什么curl
无论如何都会工作?如果是真的,你知道为什么,或者你能指出我正确的方向来理解这个问题吗?
提前感谢您的帮助!
答案 0 :(得分:4)
你应该port: 443,
或者只是保留它,因为443是使用https
模块时的默认端口,而不是port: "80"
。
cURL在没有端口的情况下工作,因为它知道默认情况下https://
是端口443。您可以将网址作为第一个参数(例如cURL)传递给https.request()
,但是您无法自定义method
,headers
或其他任何无法仅通过网址确定的内容。