Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Apache服务器对我的NodeJS和Python请求的响应不同?_Python_Node.js_Apache_Python Requests - Fatal编程技术网

为什么Apache服务器对我的NodeJS和Python请求的响应不同?

为什么Apache服务器对我的NodeJS和Python请求的响应不同?,python,node.js,apache,python-requests,Python,Node.js,Apache,Python Requests,几个月来,我一直在用Python库为一个网站开发RESTAPI,没有任何问题。这是一个我无法控制的私人网络。它还需要客户端证书身份验证,因此调用类似于: r = requests.get('https://example.com/some/endpoint?param=something', cert=(key_path, cert_path), verify=ca_path) 在检查请求后,我能够看到服务器最初使用302重定向代码回复到服务器上的另一个URI,以便设置身份验证cookie,然

几个月来,我一直在用Python库为一个网站开发RESTAPI,没有任何问题。这是一个我无法控制的私人网络。它还需要客户端证书身份验证,因此调用类似于:

r = requests.get('https://example.com/some/endpoint?param=something', cert=(key_path, cert_path), verify=ca_path)
在检查请求后,我能够看到服务器最初使用
302
重定向代码回复到服务器上的另一个URI,以便设置身份验证cookie,然后重定向回我请求的资源,然后成功完成。哈库纳·马塔塔

我们已经安装了一个新的NodeJS服务器组件,并试图将其连接到同一个端点。我尝试了几个不同的库,它们都得到了相同的结果。下面是我尝试使用流行库的一个示例:

奇怪的是,服务器用一个
200
代码和一个HTML页面做出响应,该页面基本上是这样写的(当然我要解释一下):

“你好像丢失了会话信息,伙计。可能是你的浏览器在插件安装后重新启动了。”

它具有指向站点登录页面的嵌入式链接。不幸的是,我无法复制和粘贴输出,因为所有内容都在封闭的专用网络上

我一辈子都搞不明白为什么这个服务器(响应头表明它是Apache服务器)对节点的HTTP请求的响应与Python的不同。我甚至将
请求
get
调用上的HTTP请求头更改为完全相同,但没有任何效果。它始终适用于Python,而从不适用于Node

这对我来说毫无意义。是否有熟悉Python的
请求
库和节点的
HTTP
模块的人能够识别出可能导致此问题的连接服务器方式的细微差异?显然,服务器似乎能够区分这两个请求,即使头是相同的。任何熟悉Apache的人都有什么想法或东西可以帮助解决这个问题

如果相关的话,我们使用的是Python v3.6节点v8.x(不记得具体是哪个次要版本…不幸的是,我目前无法访问该机器,稍后将更新)


有什么建议吗?我还可以尝试哪些其他方法让请求在Node中像在Python中一样成功完成?

您确定Node能够成功读取cert文件吗?尝试在控制台中转储内容。正如您所描述的,Apache服务器没有收到证书。@Nick这是一个很好的建议。是,节点能够成功读取证书。当我将
opts
对象打印到控制台时,我可以看到控制台中的
缓冲区。也就是说,我没有尝试在没有证书的情况下发出请求,以查看响应是否不同。有机会我会试试的。
let opts = {
    key: fs.readFileSync(keyPath),
    cert: fs.readFileSync(certPath),
    ca: [fs.readFileSync(caPath)],
    cookieJar: new CookieJar()
}

// Using Promise API here because I'm running on an older version of NodeJS which
// unfortunately doesn't have async/await :(
got('https://example.com/some/endpoint?param=something', opts).then((res) => {
    // ...
});