向 Node.js API 发送 POST 请求时出现“读取超时”的错误。

6

我有一个node.js API,如下所示,我从Python发送以下POST请求,我遇到的问题是如果我删除 headers={"Content-Type": "application/json"},则POST就会通过,否则我会收到一个读取超时错误,是否有人可以提供解决这个超时错误的指导?

node.js端点

app.post("/api/bats_push",(req, res) => {
        //console.log("Calling bats_push...")
        const d = {
            method: req.method,
            headers: req.headers,
            query: req.query,
            body: ''
        }

        req.on('data', (c) => {
            //console.log(c)
            d.body = d.body + c
        });

        req.on('end', () => {
            DATA.push(d);
            res.end('Saved BATS job details');
            //res.status(200).json({
              //message: "Saved BATS job details",
              //posts: req.body
          //}); 
        });
});

Python POST

try:
json"},timeout=10.0)
    r = requests.post(webhook_url,data=json_data.encode("utf8"),verify=False,headers={"Content-Type": "application/json"})
    print "posted"
    print(r.status_code, r.reason)
    print r.url
    print r.text
except Exception as e:
    print (e)

错误:-

  InsecureRequestWarning)
HTTPSConnectionPool(host='company.com', port=443): Read timed out. (read timeout=10.0)

似乎“application/json”不是一种可接受的内容类型。 - JacobIRR
1
你在使用任何身体解析器吗? - root
错误出现在本地主机上,代码与我发布的完全相同。 - Ritz
你能展示一下你的Express设置,以及在.post之前的所有中间件吗? - Marcos Casagrande
这个问题解决了吗? - NIKHIL C M
显示剩余3条评论
4个回答

1
我看到你正在使用express.js。我认为你的问题是,body已经被解析了。你可以通过读取req.body来检查它。这种情况是由于express.js已经读取了整个body(由于内容类型),再次尝试读取body将导致超时(事件data和事件end不会被触发)。有几种方法可以解决它。
  1. 禁用express.js body parser - 或重新配置它以忽略json
  2. 删除读取body代码并直接使用req.body
app.post("/api/bats_push",(req, res) => {
        //console.log("Calling bats_push...")
        const d = {
            method: req.method,
            headers: req.headers,
            query: req.query,
            body: req.body
        }

        DATA.push(d);
        res.end('Saved BATS job details');
});


0

看起来可能与您的SSL有关。 请检查在服务器运行时向本地主机发送请求是否出现相同的错误。


0

根据请求,为什么不使用这个:

#replace this 
r = requests.post(webhook_url,data=json_data.encode("utf8"),verify=False,headers={"Content-Type": "application/json"})

#by this...assuming that 'data' is a dict
r = requests.post(webhook, json=data, verify=False)

我需要使用headers={"Content-Type": "application/json"}来让它工作。 - Ritz
我使用 r = requests.post(webhook, json=data, verify=False) 时遇到了相同的错误。 - Ritz
请删除 "verify=False" 并重试。 - Narcisse Doudieu Siewe

0
从您的问题中,关键词是:
如果我删除headers={"Content-Type": "application/json"},POST请求就可以正常通过。
原因可能很清楚:这是一个关于header使用的错误方式。
简单地说,node.js应用在进入逻辑代码之前会检查header。
如果我们不自己发送header,则请求部分将使用以下默认header:
{
  'User-Agent': 'python-requests/2.22.0', 
  'Accept-Encoding': 'gzip, deflate', 
  'Accept': '*/*', 
  'Connection': 'keep-alive', 
}

通过请求的代码可以在post时打印默认标头。

你只需要使用header即可。

{"Content-Type": "application/json"}

可能会导致node.js应用程序认为请求不合法(这个词我不知道如何用英语解释)。

如果node.js应用程序是由您自己开发的,您可以尝试在创建tcp连接并进入逻辑代码之前找到框架的检查方式,方法是阅读源代码。

如果node.js应用程序不是由您自己开发的,请尝试更改标题混合默认标题以查找node.js应用程序检查的标题键。

但在我的想法中,重要的是关于node.js应用程序的接口描述:

我们只需要通过接口描述就足够了,只需要知道api头部检查中的错误,这些描述应该显示但没有向我们显示?

希望能帮到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接