好吧,这个问题过去也被问过,但没有令人满意的答案;至少对我来说是这样。长话短说,使用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'
};
顺便说一句,我还检查了curl在传递参数--sslv3
时工作良好。
然而,使用以上选项,我得到以下错误
140735237133072:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:../deps/openssl/openssl/ssl/s23_clnt.c:787:
如果我在我的代码上面放了一个形式声明(从这里开始的想法)
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
的行为,在命令行中一切都在工作?
最后,这里提到的是,端口80可能是一个错误的端口,无法与https一起使用。这真的是真的吗?为什么curl
会起作用?如果这是真的,你知道为什么吗?或者你能为我理解这个问题指明正确的方向吗?
提前感谢您的帮助!
您应该有port: 443,
,或者不设置它,因为443是使用https
模块时的默认端口,而不是port: "80"
。
cURL在没有端口的情况下工作,因为它知道默认情况下https://
是端口443。可以将url作为第一个参数传递给https.request()
(如cURL),但不能自定义method
、headers
或任何无法单独从url确定的其他内容。